Hola.
Estoy intentando hacer un temporizador ajustable que me active un rele para una bomba y lo desactive.
Es decir que ajuste un tiempo de funcionamiento (por ejemplo 1 min) y este desactivado (3 minutos), he logrado buscando por la red poder programar el tiempo que permanece activado, y hacer que funcione y termine con un bucle infinito parando el rele, pero mi intención es poder programar un tiempo de parada y que vuelva a activar el rele.
Hasta el momento he conseguido esto:
#include <LiquidCrystal.h> //Libreria del display LCD
#define TIME_INTERVAL 3000
#include <Bounce2.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12); //Inicializamos la libreria con el numero de los pines a utilizar
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 empieza = 1024; // Variable para almacenaje del pulsador de arranque
const byte srele1 = 3; // Declaramos la variable pin para relé posicion
const byte start = A1; // Declaramos la variable pin del Botón Start
const byte butp = A2; // Declaramos la variable pin del Botón Pantalla
const byte buth = A5; // Declaramos la variable pin del Botón Horas
const byte butm = A4; // Declaramos la variable pin del Botón Minutos
const byte buts = A3; // Declaramos la variable pin del Botón Segundos
int val;
Bounce debouncer1 = Bounce();
Bounce debouncer2 = Bounce();
Bounce debouncer3 = Bounce();
Bounce debouncer4 = Bounce();
Bounce debouncer5 = Bounce();
int contador = 0;
#define RELAY_ON 0
#define RELAY_OFF 1
int estadorele = LOW;
void setup(){
digitalWrite (srele1, RELAY_OFF);
pinMode(srele1, OUTPUT);
pinMode(start, INPUT_PULLUP);
pinMode(butp, INPUT_PULLUP);
pinMode(buth, INPUT_PULLUP);
pinMode(butm, INPUT_PULLUP);
pinMode(buts, INPUT_PULLUP);
digitalWrite( start ,HIGH); // activar PULL UP interno
digitalWrite( butp ,HIGH); // activar PULL UP interno
digitalWrite( buth ,HIGH); // activar PULL UP interno
digitalWrite( butm ,HIGH); // activar PULL UP interno
digitalWrite( buts ,HIGH); // activar PULL UP interno
// After setting up the button, setup the Bounce instance :
debouncer1.attach(start);
debouncer1.interval(20); // interval in ms
debouncer2.attach(butp);
debouncer2.interval(20); // interval in ms
debouncer3.attach(buth);
debouncer3.interval(20); // interval in ms
debouncer4.attach(butm);
debouncer4.interval(20); // interval in ms
debouncer5.attach(buts);
debouncer5.interval(20); // interval in ms
lcd.begin(16, 2); // Configuramos el numero de columnas y filas del LCD.
msg = 0; //Barrera del mensaje de bienvenida
Serial.begin(9600);
}
void loop()
{
if(msg==0) //Mostramos el mensaje de bienvenida solo una vez
{
lcd.setCursor(3,0);
lcd.print("Ajuste el");
lcd.setCursor(2,1);
lcd.print("Temporizador");
delay(3000);
msg = 1;
lcd.clear();
}
//-------------------------------------------------------------------------------------------------
// LECTURA DE LOS BOTONES Y ELECCIÓN DEL TIEMPO, NO SALE DEL BUCLE HASTA PULSAR
// EL BOTON DE ARRANQUE
//-------------------------------------------------------------------------------------------------
do
{
debouncer3.update();// Chequea si el botón está pulsado:
val=digitalRead(buth);
if (val==LOW){
ahoras = ahoras + 1 ;
if(ahoras == 5) ahoras = 0;
delay(200);
}
debouncer4.update();// Chequea si el botón está pulsado:
val=digitalRead(butm);
if (val==LOW){
aminutos = aminutos + 1;
if(aminutos == 60) aminutos = 0;
delay(200);
}
debouncer5.update();// Chequea si el botón está pulsado:
val=digitalRead(buts);
if (val==LOW){
asegundos = asegundos + 1;
if(asegundos == 60) asegundos = 0;
delay(200);
}
lcd.setCursor(0,0);
lcd.print("Tiempo en marcha"); //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 < 10) lcd.print("0"); // Si los segundos son menor que 10, pone un "0" delante.
lcd.print(asegundos); // Sin este codigo, se muestra asi: H:M:S (H:M:1)
}
while (debouncer1.update());{// Chequea si el botón está pulsado:
val=digitalRead(start);
if (val==LOW){
segundostotal = asegundos + (aminutos * 60) + (ahoras * 60 * 60); //Convierte el tiempo elegido en segundos!!
}
}
//-------------------------------------------------------------------------------------------------
// UNA VEZ PULSADO EL BOTON DE ARRANQUE Y ACUMULADO EL TIEMPO, ENTRA EN EL SIGUIENTE WHILE
// Y NO FINALIZA HASTA TERMINAR LA CUENTA.
//-------------------------------------------------------------------------------------------------
while (segundostotal > 0)
{
digitalWrite(srele1, LOW);
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("Tiempo 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
//Bucle infinito mostrando mensaje y haciendo parpadear un led
{
while(1) //Bucle infinito mostrando mensaje y haciendo parpadear un led
{
digitalWrite(srele1, HIGH);
lcd.clear();
lcd.setCursor(5,0);
lcd.print("Tiempo");
lcd.setCursor(3,1);
lcd.print("Finalizado");
exit(0);
}
}
}
}
Lo que no consigo es hacer es un bucle para poder programar el tiempo en reposo, ( lo he realizado pero no consigo que lo muestre el LCD) y tampoco consigo como quitar el bucle infinito y que siga con el contador de paro.
Saludos