Go Down

Topic: Temporizador  (Read 69 times) previous topic - next topic

santatu

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:

Code: [Select]
#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

Go Up