19-08-2013, 09:06 PM
FINALIZADA
Bueno, edito la primera pagina para dejar un poco el resumen de todo, para empezar un video del funcionamiento:
Una fotos:
Codigo:
Resumen;
Bueno, para empezar la insoladora esta echa en MDF, la parte superior es de un viejo escaner, los flourescentes son normales, ya que me costaba encontrar UV, en un futuro puede que los cambie. La insoladora esta controlada por un arduino MICRO, una pantalla LCD conectada por I2C, 4 pulsadores, un rele pilotado por una salida digital y un transistor 2n3905 (Valen la mayoria de NPNs), un BUZZER, y como componentes auxiliares una fuente de 15V compacta, y un LM7809 para alimentar el arduino.
Bueno, despues de pasar el verano sin hacer demasiado, toca ponerse las pilas, vamos a ver si sacamos adelante una insoladora, la idea es aprovechar la parte superior de una impresora multifuncion y hacer la parte inferior en madera (MDF), por ahora nose si usare luz normal o tubos UV, pero lo primero tengo que acabar la estructura, para mañana espero tener todo ya montado.
Tenia ojeados unos tubos UV a muy buen precio:
http://todoelectronica.com/tubo-fluoresc...c017dc571b
Bueno, edito la primera pagina para dejar un poco el resumen de todo, para empezar un video del funcionamiento:
Una fotos:
Codigo:
Código:
//Insoladora V1.0
//Librerias
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <Bounce.h>
//Caracteres
byte uparrow[8] = { //Flecha hacia arriba
B00100,
B01110,
B10101,
B00100,
B00100,
B00100,
B00100,
B00100
};
byte downarrow[8] = { //Flecha hacia abajo
B00100,
B00100,
B00100,
B00100,
B00100,
B10101,
B01110,
B00100
};
//LCD
LiquidCrystal_I2C lcd(0x20,16,2); // set the LCD address to 0x20 for a 16 chars and 2 line display
//Botones
Bounce UP = Bounce(2,100); //Pin 2 para boton UP
Bounce DOWN = Bounce(3,100); //Pin 3 para boton DOWN
Bounce START = Bounce(4,100); //Pin 4 para boton START
Bounce STOP = Bounce(5,100); //Pin 5 para boton STOP
//Salidas
#define RELE 6
#define BUZ 8
//Variables
long segundos = 0; //Variable para los segundos
long minutos = 0; //Variable para los minutos
long segundosactual = 0; //Variable para temporizacion
long segundostotal = 0; //Segundos a temporizar
long segundosviejo = 0; //Tope de segundos para el FOR
long contador = 0;
long multiplo = 1;
void setup() {
// put your setup code here, to run once:
//PINES
pinMode(RELE, OUTPUT);
pinMode(BUZ, OUTPUT);
//Iniciamos el LCD
lcd.init();
lcd.backlight(); //Iniciamos la retroiluminacion
lcd.setCursor(0,0); //Situamos el cursor al inicio
lcd.print("Insoladora V1.0"); //Imprimimos mensaje inicial
lcd.setCursor(5,1); //
lcd.print("L1llo5"); //
delay(2000); //Esperamos 2 segundos con el mensaje
lcd.clear(); //Limpiamos la pantalla
//Registro Caracteres
lcd.createChar(1, uparrow);
lcd.createChar(2, downarrow);
}
void loop()
{
// put your main code here, to run repeatedly:
//Leemos el tiempo guardado
segundos=EEPROM.read(1);
minutos=EEPROM.read(2);
do{
lcd.setCursor(0,0);
lcd.print("Tiempo:");
//Actualizamos los botones
UP.update();
DOWN.update();
//Imprimimos la flechas en pantalla
lcd.setCursor(15,0);
lcd.write(1);
lcd.setCursor(15,1);
lcd.write(2);
//Imprimos los segundos y minutos
imprimir(segundos,minutos); //Imprimimos los minutos y segundos iniciales
if (UP.risingEdge()) //Comprobamos si se ha pulsado el interruptor UP
{
segundos=segundos+10; //Sumamos 10 segundos en cada pulsacion
if(segundos > 50) //Si los segundos pasan del 50, sumamos un minutos y reiniciamos los segundos
{
minutos=minutos+1;
segundos=0;
imprimir(segundos,minutos); //Imprimimos
}
imprimir(segundos,minutos); //Si no pasamos de 50 segundos los minutos no varian
}
else if (DOWN.risingEdge()) //Si pulsamos el boton DOWN
{
segundos=segundos-10; //Restamos 10 segundos en cada pulsacion
if(segundos < 0) //Si los segundos son menores que 0, restamos un minuto y ponemos los segundos a 50
{
minutos=minutos-1;
segundos=50;
if(minutos<0) //Evitamos que los minutos puedan ser negativos
{
minutos=0; //Ponemos a cero el contador
segundos=0; //
}
imprimir(segundos,minutos); //Imprimimos
}
imprimir(segundos,minutos); //Si no ocurre ni minutos negativos ni resta de los mismos imprimimos
}
START.update();
}while (!START.risingEdge()||segundos==0&&minutos==0); //Mientras no se pulse START o sean cero los minutos y segundos se repite el bucle
//Pantalla de Inicio
lcd.clear();
lcd.setCursor(0,0);
lcd.print("INICIANDO....");
//Guardado en EEPROM
saveseg(segundos);
savemin(minutos);
buzzer(2);
delay(1000);
lcd.clear();
//Cuenta atras
segundosactual=millis(); //Guardamos los millis en los que nos encontramos
segundosviejo=millis(); //Guardamos en otra variable
segundostotal=(minutos*60+segundos); //Calculamos los segundos totales que hay que temporizar
lcd.setCursor(0,0);
lcd.print("Insolando:"); //Imprimimos un mensaje de INSOLANDO
while (segundosactual/1000<=segundosviejo/1000+segundostotal) //Cuenta atras, mientras segundos actual, sea mas pequeño que la suma de los que teniamos mas los que necesitamos, repetimos el bucle
{
STOP.update(); //Actualizamos el estado del boton STOP
if(STOP.risingEdge()) //Si pulsamos el boton stop paramos el bucle
{
digitalWrite(RELE, LOW); //Ponemos a cero la salida del rele
lcd.clear();
//Ponemos a cero las variables
segundosactual = 0;
segundostotal = 0;
segundosviejo = 0;
contador = 0;
multiplo = 1;
break; //Salimos del while
}
digitalWrite(RELE, HIGH); //Activamos el rele
contador=segundosactual-segundosviejo; //Calculamos la diferencia entre segundos viejo y nuevo
if (contador>1000*multiplo) //Cuando llege a 1000ms(1 segundo) restamos tiempo
{
if (segundos<=0) //Si los segundos son menores que 0 bajamos minutos
{
minutos=minutos-1; //Restamos un minuto
segundos=59; //Seteamos los segundos a 59
cuentaatras(segundos,minutos); //Imprimimos
}else
{
segundos=segundos-1; //Restamos segundos si no son menores que 0
cuentaatras(segundos,minutos);
}
multiplo=multiplo+1; //Empleamos multiplo, para ir aumentando de un segundo en un segundo la diferencia entre tiempos, y asi poder contar cada segundo
}
segundosactual=millis(); //Renovamos la variable millis
}
//////FIN DEL CONTEO
digitalWrite(RELE, LOW); //Desactivamos el rele
lcd.clear();
lcd.setCursor(0,0);
lcd.print("FINALIZADO");//Mostramos mensaje de finalizado
buzzer(1); //Melodia de final
lcd.clear();
//Ponemos a cero las variables
segundosactual = 0;
segundostotal = 0;
segundosviejo = 0;
contador = 0;
multiplo = 1;
//Volvemos al tiempo guardado
segundos=EEPROM.read(1);
minutos=EEPROM.read(2);
}
//Funcion Imprimir
void imprimir(int seg,int minu)
{
if(minutos<10) //Si los minutos son menores de 10 situamos la cifra mas a la derecha
{
lcd.setCursor(11,0);
lcd.print(segundos);
lcd.setCursor(10,0);
lcd.print(":");
lcd.setCursor(8,0);
lcd.print("0");
lcd.setCursor(9,0);
lcd.print(minutos);
}
else
{
lcd.setCursor(11,0);
lcd.print(segundos);
lcd.setCursor(10,0);
lcd.print(":");
lcd.setCursor(8,0);
lcd.print(minutos);
}
}
//Funcion imprimir cuenta atras, situacion correcta de los segundos
void cuentaatras(int seg, int minu)
{
if(minutos<10&&segundos>=10) //Si los minutos son menores de 10 situamos la cifra mas a la derecha y los segundos mayores que 10
{
lcd.setCursor(13,0);
lcd.print(segundos);
lcd.setCursor(12,0);
lcd.print(":");
lcd.setCursor(10,0);
lcd.print("0");
lcd.setCursor(11,0);
lcd.print(minutos);
}else if(minutos>=10&&segundos>=10)
{
lcd.setCursor(13,0);
lcd.print(segundos);
lcd.setCursor(12,0);
lcd.print(":");
lcd.setCursor(10,0);
lcd.print(minutos);
}
if(minutos<10&&segundos<10) //Si los minutos son menores de 10 situamos la cifra mas a la derecha, los segundos menores que 10
{
lcd.setCursor(13,0);
lcd.print("0");
lcd.setCursor(14,0);
lcd.print(segundos);
lcd.setCursor(12,0);
lcd.print(":");
lcd.setCursor(10,0);
lcd.print("0");
lcd.setCursor(11,0);
lcd.print(minutos);
}else if(minutos>=10&&segundos<10)
{
lcd.setCursor(13,0);
lcd.print("0");
lcd.setCursor(14,0);
lcd.print(segundos);
lcd.setCursor(12,0);
lcd.print(":");
lcd.setCursor(10,0);
lcd.print(minutos);
}
}
//Funciones Lectura y Grabado EEPROM
void saveseg(int segundos)
{
int saveseg=0;
saveseg=EEPROM.read(1); //Leemos los segundos guardados
if (saveseg!=segundos) //Si los segundos guardados no coinciden con los nuevos volvemos a guardar
{
EEPROM.write(1,segundos); //Guardamos
lcd.setCursor(0,1);
lcd.print("Saved"); //Imprimimos para verificar el guardado
}
}
void savemin(int minutos)
{
int savemin=0;
savemin=EEPROM.read(2); //Leemos los minutos guardados
if (savemin!=minutos) //Si los minutos guardados no coinciden con los nuevos volvemos a guardar
{
EEPROM.write(2,minutos); //Guardamos
lcd.setCursor(0,1);
lcd.print("Saved"); //Imprimimos para verificar el guardado
}
}
//Funcion BUZ
void buzzer(byte melodia)
{
switch (melodia)
{
case 1: //Melodia al finalizar la cuenta
digitalWrite(BUZ, HIGH);
delay(1000);
for (int i = 0; i<10; i++)
{
digitalWrite(BUZ, HIGH);
delay(200);
digitalWrite(BUZ, LOW);
delay(50);
}
break; //Melodia al iniciar la cuenta
case 2:
digitalWrite(BUZ, HIGH);
delay(250);
digitalWrite(BUZ, LOW);
break;
}
}
Resumen;
Bueno, para empezar la insoladora esta echa en MDF, la parte superior es de un viejo escaner, los flourescentes son normales, ya que me costaba encontrar UV, en un futuro puede que los cambie. La insoladora esta controlada por un arduino MICRO, una pantalla LCD conectada por I2C, 4 pulsadores, un rele pilotado por una salida digital y un transistor 2n3905 (Valen la mayoria de NPNs), un BUZZER, y como componentes auxiliares una fuente de 15V compacta, y un LM7809 para alimentar el arduino.
Bueno, despues de pasar el verano sin hacer demasiado, toca ponerse las pilas, vamos a ver si sacamos adelante una insoladora, la idea es aprovechar la parte superior de una impresora multifuncion y hacer la parte inferior en madera (MDF), por ahora nose si usare luz normal o tubos UV, pero lo primero tengo que acabar la estructura, para mañana espero tener todo ya montado.
Tenia ojeados unos tubos UV a muy buen precio:
http://todoelectronica.com/tubo-fluoresc...c017dc571b