Timer con LCD y salida de Rele

Hola buenas noches estoy arrancando con este fascinante tema de ARDUINO, ya probé varios programas subidos por otras personas y alguno de los ejemplos. Pero hoy me surgió la necesidad de hacer un timer (Regresivo) con valores fijos definido en 4 botones que se pueda ver en el display y que tenga salida a un rele.

Les soy sincero no tengo idea de por donde empezar vi muchos ejemplos pero son programables y la verdad que no logro ver donde tengo que modificar para poder agregar los valores fijos que quiero para cada pulsador.

Se que parece un abuso el pedir un código de programación ya escrito con lo que estoy necesitando pero no logro darme cuenta como hacerlo...

Encontré este código de una persona en una pagina web que creo que me serviría pero no logro (que ya en dicho antes) darme cuenta o saber como definirle valores fijos de por
Ejemplo:
Pulsador 1 = 1.30 Hs
Pulsador 2 = 30 Min
Pulsador 3 = 10 min
y el Pulsador de comienzo.

Va el codigo que encontre

//TEMPORIZADOR ARDUINO + LCD

#include //Libreria del display LCD

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //Inicializamos la libreria con el numero de los pines a utilizar

int buzzer = 13; //Alarma
int ahoras = 0; //Variable a mostrar por LCD de las horas
int aminutos = 0; //Variable a mostrar por LCD de los minutos
int asegundos = 0; //Variable a mostrar por LCD de los segundos
int segundostotal = 0; //Tiempo total
int msg= 0; //Barrera para el mensaje de bienvenida

int start = A1; //Pulsador de arranque
int empieza = 1024; // Variable para almacenaje del pulsador de arranque

int buth = A5; //Pulsador de Horas
int butm = A4; //Pulsador de Minutos
int buts = A3; //Pulsador de segundos

int varbuth = 0; //Variable para almacenar el valor del pulsador de horas
int varbutm = 0; //Variable para almacenar el valor del pulsador de minutos
int varbuts = 0; //Variable para almacenar el valor del pulsador de segundos

void setup()
{
lcd.begin(16, 2); // Configuramos el numero de columnas y filas del LCD.

pinMode(buzzer, OUTPUT); //Pin de alarma –> Salida
pinMode(buth, INPUT); //Pin de pulsador de horas –> Entrada
pinMode(butm, INPUT); //Pin de pulsador de minutos –> Entrada
pinMode(buts, INPUT); //Pin de pulsador de segundos –> Entrada
pinMode(start, INPUT); //Pin de pulsador de arranque –> Entrada

msg = 0; //Barrera del mensaje de bienvenida
empieza = 1024; //Barrera de arranque

varbuth = 1; //Barrera de horas
varbutm = 1; //Barrera de minutos
varbuts = 1; //Barrera de segundos
}

void loop()
{
if(msg==0) //Mostramos el mensaje de bienvenida solo una vez
{
lcd.setCursor(0,0);
lcd.print(“Temporizador com”);
lcd.setCursor(1,1);
lcd.print(“Arduino + LCD”);
delay(2500);
msg = 1;
lcd.clear();
}

//————————————————————————————————-
// LECTURA DE LOS BOTONES Y ELECCIÓN DEL TIEMPO, NO SALE DEL BUCLE HASTA PULSAR
// EL BOTON DE ARRANQUE
//————————————————————————————————-

do
{

varbuth = analogRead(buth); //Leemos boton de horas
varbutm = analogRead(butm); //Leemos boton de minutos
varbuts = analogRead(buts); //Leemos boton de segundos

if(varbuth == 0) //Si el boton ha sido pulsado, aumentamos las horas en una unidad
{
ahoras = ahoras + 1 ;
delay(250);
}

if(varbutm == 0) //Si el boton ha sido pulsado, aumentamos los minutos en una unidad
{
aminutos = aminutos + 1;
delay(250);
}

if(varbuts == 0) //Si el boton ha sido pulsado, aumentamos los segundos en una unidad
{
asegundos = asegundos + 1;
delay(250);
}

lcd.setCursor(0,0);
lcd.print(” Digite o Tempo”); //Muestra mensaje y las HH:MM:SS que vayamos aumentando

lcd.setCursor(4,1);

if (ahoras < 10) lcd.print("0"); // Si las horas son menor que 10, pone un "0" delante.
lcd.print(ahoras); // Sin este codigo, se muestra asi: H:M:S (1:M:S)
lcd.print(":");

if (aminutos < 10) lcd.print("0"); // Si los minutos son menor que 10, pone un "0" delante.
lcd.print(aminutos); // Sin este codigo, se muestra asi: H:M:S (H:1:S)

lcd.print(":");
if (asegundos 0)
{
delay (1000); //Descontamos en periodos de 1 segundo
segundostotal–;

ahoras = ((segundostotal / 60)/ 60); //Convertimos los segundos totales en horas
aminutos = (segundostotal / 60) % 60; //Convertimos los segundos totales en minutos
asegundos = segundostotal % 60; //Convertimos los segundos totales en periodos de 60 segundos

lcd.setCursor(0,0);
lcd.print(“Tempo restante”); //Mostramos mensaje de tiempo restante

lcd.setCursor(4,1);
if (ahoras < 10) lcd.print("0"); // Si las horas son menor que 10, pone un "0" delante.
lcd.print(ahoras); // Sin este codigo, se muestra asi: H:M:S (1:M:S)
lcd.print(":");

if (aminutos < 10) lcd.print("0"); // Si los minutos son menor que 10, pone un "0" delante.
lcd.print(aminutos); // Sin este codigo, se muestra asi: H:M:S (H:1:S)

lcd.print(":");
if (asegundos < 10) lcd.print("0"); // si el valor de segundo esta por debajo de 9 (unidad) antepone un cero
lcd.print(asegundos); // Sin este codigo, se muestra asi: H:M:S (H:M:1)

if (segundostotal == 0) //Si finaliza el tiempo
{
while(1) //Bucle infinito mostrando mensaje y haciendo parpadear un led
{
lcd.clear();
lcd.setCursor(5,0);
lcd.print("Tempo");
lcd.setCursor(3,1);
lcd.print("Finalizado");

digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
delay(200);
}
}
}

}

Bueno espero sepan disculpar mi pedido.... y quedo a la espera de alguna idea o respuesta....

Muchas Gracias!!!

Saludos

A ver como se comporta este código con las modificaciones que pides

//TEMPORIZADOR ARDUINO + LCD

#include //Libreria del display LCD

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //Inicializamos la libreria con el numero de los pines a utilizar

int buzzer        = 13; //Alarma
int ahoras        = 0; //Variable a mostrar por LCD de las horas
int aminutos      = 0; //Variable a mostrar por LCD de los minutos
int asegundos     = 0; //Variable a mostrar por LCD de los segundos
int segundostotal = 0; //Tiempo total

int start         = A1; //Pulsador de arranque
int empieza       = 1024; // Variable para almacenaje del pulsador de arranque

int buth          = A5; //Pulsador de Horas
int butm          = A4; //Pulsador de Minutos
int buts          = A3; //Pulsador de segundos

int varbuth       = 0; //Variable para almacenar el valor del pulsador de horas
int varbutm       = 0; //Variable para almacenar el valor del pulsador de minutos
int varbuts       = 0; //Variable para almacenar el valor del pulsador de segundos

void setup(){
  lcd.begin(16, 2); // Configuramos el numero de columnas y filas del LCD.

  pinMode(buzzer, OUTPUT); //Pin de alarma -> Salida
  pinMode(buth, INPUT); //Pin de pulsador de horas -> Entrada
  pinMode(butm, INPUT); //Pin de pulsador de minutos -> Entrada
  pinMode(buts, INPUT); //Pin de pulsador de segundos -> Entrada
  pinMode(start, INPUT); //Pin de pulsador de arranque -> Entrada

  msg = 0; //Barrera del mensaje de bienvenida
  empieza = 1024; //Barrera de arranque

  varbuth = 1; //Barrera de horas
  varbutm = 1; //Barrera de minutos
  varbuts = 1; //Barrera de segundos

  lcd.setCursor(0,0);
  lcd.print("Temporizador com");
  lcd.setCursor(1,1);
  lcd.print("Arduino + LCD");
  delay(2500);
  lcd.clear();
}

void loop() {

  //-----------------------------------------------------------------
  // LECTURA DE LOS BOTONES Y ELECCIÓN DEL TIEMPO, NO SALE DEL BUCLE HASTA PULSAR
  // EL BOTON DE ARRANQUE
  //-----------------------------------------------------------------

  do {
    varbuth = digitalRead(buth); //Leemos boton de horas
    varbutm = digitalRead(butm); //Leemos boton de minutos
    varbuts = digitalRead(buts); //Leemos boton de segundos

    if (!varbuth && varbuthAnt) { //Si el boton ha sido pulsado, aumentamos las horas en una unidad
        ahoras++ ;
        if (ahoras++ > 23);
            ahoras = 0;
        delay(50);
    }
    varbuthAnt = varbuth;

    if (!varbutm && varbutmAnt) { //Si el boton ha sido pulsado, aumentamos los minutos en una unidad
        aminutos++;
        if (aminutos++ > 59);
            aminutos = 0;
        delay(50);
    }
    varbutmAnt = varbutm;

    if (!varbuts && varbutsAnt) { //Si el boton ha sido pulsado, aumentamos los segundos en una unidad
        if (asegundos++ > 59);
            asegundos = 0;
        delay(50);
    }
    varbutsAnt = varbuts;

    lcd.setCursor(0,0);
    lcd.print(" Digite o Tempo"); //Muestra mensaje y las HH:MM:SS que vayamos aumentando

    lcd.setCursor(4,1);
    char buffer[30];
    sprintf(buffer, "%02d:%02d:%02d", ahoras, aminutos, segundos);
    lcd.print(buffer);

    segundostotal--;

    ahoras = ((segundostotal / 60)/ 60); //Convertimos los segundos totales en horas
    aminutos = (segundostotal / 60) % 60; //Convertimos los segundos totales en minutos
    asegundos = segundostotal % 60; //Convertimos los segundos totales en periodos de 60 segundos

    lcd.setCursor(0,0);
    lcd.print("Tempo restante"); //Mostramos mensaje de tiempo restante

    lcd.setCursor(4,1);
    char buffer[30];
    sprintf(buffer, "%02d:%02d:%02d", ahoras, aminutos, asegundos);
    lcd.print(buffer);

    if (segundostotal == 0) {  //Si finaliza el tiempo
        while(1) { //Bucle infinito mostrando mensaje y haciendo parpadear un led
              lcd.clear();
              lcd.setCursor(5,0);
              lcd.print("Tempo");
              lcd.setCursor(3,1);
              lcd.print("Finalizado");

              digitalWrite(buzzer, HIGH);
              delay(200);
              digitalWrite(buzzer, LOW);
              delay(200);
        }
    }
  }
}

Hola maurogerman, creo que se podría adaptar el programa que publiqué el 13/08/2017 en las respuestas de la consulta Orientación para proyecto timer

Podría adaptarlo yo, pero no sé si voy a disponer de tiempo para ello estos días. Con lo que puede que te lo tenga en un par de días o en una semana. Si no puedes esperar, mira a ver si puedes adaptarlo, o si alguien más te puede ayudar.

Los cambios serían: ajustar algunas constantes del código a tus necesidades (en otra de las de ese mismo post las explico), modificar la función que muestra el tiempo, hacer que el tiempo se asigne directamente en lugar de sumar, y habilitar la cuenta atrás cuando se pulse el botón adecuado.

Muchas gracias los voy a probar....

Aquí tienes lo prometido. Tal vez tenga cosas de más (o de menos) ya me dirás si te sirve tal como está o quieres algún cambio.

Resumen de las funcionalidades:

He asumido que tu display LCD es de 2x16.

Por el puerto serie, para depuración, se muestran mensajes y el tiempo que va quedando. Lo podrás ver por el monitor serie (está configurado a 9600 baudios, si quieres lo cambias). Si no quieres que mande nada por el puerto serie puedes quitar toda referencia a Serial si lo deseas.

Para establecer los tiempos y ponerlo en marcha he configurado unos pines de entrada con la resistencia pull-up interna activada, así que no hace falta poner resistencia externa. Simplemente conecta el pin de entrada con un extremo del pulsador y el otro extremo del pulsador lo conectas a GND. Si lo deseas puedes cambiar los pines, desactivar el pull-up y cambiar la lógica de los pulsadores (ahora un nivel bajo lo activa, pero puedes configurarlo para que sea a nivel algo, ver las constantes definidas al principio del programa y los comentarios de cada una de ella).

Al arrancar el LCD te dice que indiques qué tiempo quieres. Pulsa uno de los tres pulsadores de selección de tiempo (1:30, 0:30 y 0:10) y aparecerá el tiempo seleccionado. Se muestra horas, minutos y segundos. Mientras no se inicie la cuenta atrás se puede cambiar el tiempo seleccionado. Los tiempos preestablecidos se pueden cambiar (ver las constantes que hay definidas al principio del programa).

En cuanto se pulse el botón de “INICIO” empieza la cuenta atrás y ya no se puede parar ni cambiar el tiempo seleccionado.

Como es una “adaptación” de un programa que había hecho, he dejado ciertas características, una de ellas es que hay un LED que parpadea una vez por segundo indicando que la cuenta atrás está en marcha. Este LED empieza a parpadear más rápido cuando quedan 60 segundos o menos. Son configurables el pin del LED y a cuántos segundos del final empieza a parpadear rápido (ver constantes definidas al principio del programa).

Otra “característica heredada” es que hay un pin que se activa durante todo el tiempo que dure la cuenta atrás. Originalmente estaba pensado para mantener encendido algo durante la cuenta atrás. Son configurables el pin y el nivel con que se quiere que se active (HIGH/LOW).

También “ha heredado” el que hay un pin que genera un pulso (actualmente de medio segundo) en cuanto se inicia la cuenta atrás y que también genera otro pulso igual al terminar la cuenta atrás. Si el pulso inicial no lo quieres, basta con que comentes una línea de código. Hay un comentario indicando qué línea es (en principio es la línea 232).

Hay una constante llamada VELOCIDAD que ha de valer 1, pero que puedes cambiar y ponerle un valor mayor (por ejemplo 10) para que la cuenta transcurra más rápida. Esto viene bien para hacer pruebas y no tener que esperar una eternidad. Afecta al temporizador y al parpadeo del LED, pero no afecta al tiempo del “pulso” de inicio y final de cuenta.

Lo dicho, ya nos dirás qué tal te va y si necesitas cambios. Cualquier duda, pregunta por aquí, tal vez te la resuelva yo u otro que lo sepa. Así aprendemos todos.

Adjunto programa.

foro_timer_lcd.ino (16.6 KB)

Hola..... Muchisimas gracias.... La verdad estoy muy agradecido. Luego te comentare como me fue.....

Te mando un Abrazo!!!!

:wink: :wink: :wink:

Hola, estuve probando el script que subiste IgnoranteAbsoluto. La verdad es que me funcionó perfecto. Mí idea es setear el timer para que arranque un relé después de tiempos programados con los pulsadores. Mí petición es: será muy difícil hacer que un pulsador sume una hora cada vez que lo toco y que el otro sume 10 minutos. Capaz es una pavada, pero no lo sé hacer. Si es mucho lio explicarlo, habrá algún foro o página donde lo expliquen?
Gracias!!!