Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Proyecto Temporizador Insoladora
#21
Bueno, ya tengo el menu inicial, aqui os dejo el codigo y un video, aun queda mucho por mejorar pero poco a poco.

Código:
//Insoladora V1.0

//Librerias

#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

//Variables

int segundos = 0;    //Variable para los segundos
int minutos = 0;    //Variable para los minutos

//Constantes

void setup() {
  // put your setup code here, to run once:
  pinMode(RELE, 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:
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
}
}


//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(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);
}
}

http://www.youtube.com/watch?v=R2uBn_QcwQY
Citar
#22
Os dejo la secuencia de conteo, seguramente se podria hacer mas facil, pero tras darle muchas vueltas me salio asi, acepto sugerencias, y cualquier duda me decis:

Código:
//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
    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);
Citar
#23
Bueno, por fin acabe el codigo, ya funciona todo perfectamente, dejo un video explicacion y el 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;
    }
}





Ahora queda hacer una plaquita con el transistor, rele fuente etc etc y meterlo en la insoladora
Citar
#24
Gracias por compartirlo! Mola Igual me animo a hacer yo una...que te ha quedado muy guapa y es relativamente barata...
Código:
try {
   live();
}
catch (BestMoments) {
MessageBox.Show(Happy)
}

Citar
#25
igargi escribió:Gracias por compartirlo! Mola Igual me animo a hacer yo una...que te ha quedado muy guapa y es relativamente barata...

Para eso estamos¡, el codigo esta bastante comentado, y los pines de conexion creo que se ven bien, de no ser asi decirme y subo un esquema.
Citar
#26
Que guerra me esta dando para pasarlo a una placa perforada madre mia...dos veces que lo intento, dos veces que problemas, no me carga, se me queda el LED encendido, lo paso a la Protoboard, y me funciona pero lo pongo en placa perforada y nada...., aver si esta tarde lo logro.


resim

resim

resim
Citar
#27
Bueno compañeros, despues de un largo dia ya esta todo montado y funcionando:





resim

resim

resim

resim

resim
Citar
#28
Alguien me puede explicar lo del rebote del pulsador?? No lo había escuchado
Citar
#29
cansi22 escribió:Alguien me puede explicar lo del rebote del pulsador?? No lo había escuchado

Cuando pulsamos un interruptor, debido a que son puramente mecanicos se pueden producir chasquidos en los contactos, o contactos muy breves accidentales mientras pulsamos el pulsador, por tanto, se pone un "delay", tras realizar la lectura del pulsador para que esto no suceda ya que asi damos suficiente margen para que el pulsador este completamente abierto.

Yo uso la libreria BOUNCE, que es muy sencilla, y facil de usar, cualquier duda comentamelo, pero se puede solucionar por Hardware con la incorporacion de un condensador y resistencia adicional al pulsador.
Citar
#30
Felicidades te ha quedado muy bien Mola
Citar
#31
Ait0r escribió:Felicidades te ha quedado muy bien Mola

Muchas Gracias¡, tengo que cambiar una cosilla del codigo, que cuando tengo en memoria X minutos y 0 segundos me lo muestra asi:

4:0

en ved de

4:00

Es una jodida parida, pero me gusta dejar las cosas bien acabadas
Citar
#32
Simplemente genial. Tanto acabados como la idea del programa. A ver si hago un hueco y me leo el código.

Lo que comentas del :0, quizás el día de mañana quieras modificarle alguna cosilla, ¿has pensado en ponerle una conexión usb para el nano? Así abrir la insoladora sería cuestión de causas mayores.
Citar
#33
jukillo escribió:Simplemente genial. Tanto acabados como la idea del programa. A ver si hago un hueco y me leo el código.

Lo que comentas del :0, quizás el día de mañana quieras modificarle alguna cosilla, ¿has pensado en ponerle una conexión usb para el nano? Así abrir la insoladora sería cuestión de causas mayores.

estaria bien si, la verdad, cuando tenga un ratillo me pongo a ello y le caso una toma¡
Citar
#34
No sé en que hilo vi una toma que te vendría bien. Creo que en el hilo de la impresora de Cansi.

P.D.: Algo asi: http://www.ebay.es/itm/D-type-1-4-Micro-...5f4&_uhb=1
Citar
#35
Aqui lo tienes Guiño http://www.ebay.es/itm/111115762860
Citar
#36
Graches¡¡

Esta es la derecha:

http://www.ebay.es/itm/50cm-USB-2-0-B-Fe...223&_uhb=1

Gran sonrisa
Citar
#37
El nano lleva mini USB¿? No lleva micro USB?¿?
Citar
#38
jukillo escribió:El nano lleva mini USB¿? No lleva micro USB?¿?

mini mini Jukillo, el micro es el de los moviles que es aun mas peque
Citar
#39
Tienes razón. No sé por qué tenía metido en la cabeza que llevaba micro.
Citar
#40
soy de Nicaragua tengo 56años soy lisiado de guerra y aficionado a la electronica este proyecto de la insoladora me interesa y no se mucho de electronica menos de programar por eso no hallo que hacer cuando mando al arduino verificar el sketch tal vez me puedas ayudar a resolver este problema
Insoladora_con_relay.ino: In function 'void setup()':
Insoladora_con_relay.ino:68:7: error: 'class LiquidCrystal_I2C' has no member named 'init'
'class LiquidCrystal_I2C' has no member named 'init'
Citar


Temas similares...
Tema Autor Respuestas Vistas Último mensaje
  Proyecto sckay 46 3,519 23-11-2015, 04:17 PM
Último mensaje: Iván
  Problema con proyecto Electromecánico 8 839 02-01-2014, 11:58 PM
Último mensaje: Electromecánico