Go Down

Topic: [Solucionado]Entradas Analógicas dañadas? (Read 2405 times) previous topic - next topic

LuisGal

Jan 29, 2017, 08:32 pm Last Edit: Feb 09, 2017, 03:07 am by LuisGal
Estoy haciendo un temporizador en arduino UNO la primera vez que arme uno que encontré en internet junto con el código me salio bien la conexión todo iba bien lo que pasa es que lo desarme para aprender la conexión  y lo volví a armar pero las entradas analógicas que uso con pulsadores para aumentar el tiempo en horas, minutos ,segundos empezaron a subir solas sin que presionara el pulsador y cada vez que mantengo apretado el pulsador se queda parado el tiempo y si lo suelto de nuevo comienza a subir.
ayuda por favor, que recién estoy empezando en arduino y conozco poco.

codigo que use, lo encontre en internet
Code: [Select]
#include <LiquidCrystal.h> //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 = A2;            //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 con");
       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("Elige el tiempo");  //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)
       
       empieza = analogRead(start);   //Lee el boton de arranque
       
       if (empieza == 0)              //Si el boton de arranque, fue pulsado...
       {
        segundostotal = asegundos + (aminutos * 60) + (ahoras * 60 * 60);  //Convierte el tiempo elegido en segundos!!
       }
             
     } while(empieza != 0);  // Se repite el menu de elegir tiempo hasta que pulsemos el boton de arranque.
       
      //-------------------------------------------------------------------------------------------------
      // 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)
      {
        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
          {           
             while(1)                        //Bucle infinito mostrando mensaje y haciendo parpadear un led
             {               
                  lcd.clear();
                  lcd.setCursor(5,0);
                  lcd.print("Tiempo");
                  lcd.setCursor(3,1);
                  lcd.print("Finalizado");
               
                 digitalWrite(buzzer, HIGH);
                 delay(200);
                 digitalWrite(buzzer, LOW);
                 delay(200);
             }     
          }
     }
     
}


ESQUEMA

modamio

Buenas, has probado a ponerle una resistencia a masa o al positivo segun tengas tu programa ya que seguramente este detectando algun tipo de tension residual

surbyte

Sería bueno que mostraras tu código y esquema. O simplemente como tienes conectado los pulsadores a las entradas Analógicas que supongo usas como Digitales A0..A5.

Usa una R de 10k pero depende de como las hayas definido en el setup. 

Code: [Select]
pinMode(A0, INPUT);

eso admite el uso de pulsador pull up o pull down
o simplemente el pulsador entre GND y el pin A0 usando

Code: [Select]
pinMode(A0, INPUT_PULLUP);


LuisGal

Gracias por responder, utilice pinMode(A0, INPUT_PULLUP); en los Analogicos me sirvio unos 3 minutos, luego cuando quise probar de nuevo aprete los pulsadores y se puso como antes estaba seguia incrementando sin que lo pulsara.

surbyte

Este es tu setup

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


donde dice lo que afirmaste antes?
Code: [Select]
pinMode(A0, INPUT_PULLUP)


LuisGal

Perdon pero envie el codigo anterior, si lo cambie pero sigue igual el contador no para de incrementar y solo se pone autostart lo que eh notado es que cuando toco la resistencia para de incrementar y puedo pulsar e incrementar cuando yo quiero sin problemas pero si lo suelto la resistencia de 10k vuelva al estado anterior

PD: perdon por responder demasiado tarde por favor me podrias explicar por que sucee esto?
Gracias.


Code: [Select]

#include <LiquidCrystal.h> //Libreria del display LCD
#define TONO_ERROR 600
#define TIME_INTERVAL 3000
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 = A2;            //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_PULLUP);     //Pin de pulsador de horas --> Entrada
   pinMode(butm, INPUT_PULLUP);     //Pin de pulsador de minutos --> Entrada
   pinMode(buts, INPUT_PULLUP);     //Pin de pulsador de segundos --> Entrada
   pinMode(start, INPUT_PULLUP);    //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
}

y asi lo conecte

surbyte

no no no... si usas INPUT_PULLUP no usas resistencia de 10K a masa
Si usas INPUT Si usas la resistencia.

Aun asi, nunca me acostumbraré a los esquemas con Freezing, pero son mejor que no poner un esquema.

Porque lees botones que deben actuar digitalmente de este modo?
Code: [Select]
       varbuth = analogRead(buth);   //Leemos boton de horas
       varbutm = analogRead(butm);   //Leemos boton de minutos
       varbuts = analogRead(buts);   //Leemos boton de segundos


Debe ser digital con digitalRead

LuisGal

Gracia surbyte por tu pronta respuesta si parece que ahí en analogRead estuvo mal, lo cambie a digitalRead y me anda bien gracias pero eso de no conectar la resistencia a masa, lo conectaría al positivo? por que me anda bien poniéndolo de esa manera. 

surbyte

Ya te lo expliqué.
Si usas en el setup INPUT_PULLUP no usas resistencia de 10K a masa, y el pulsador va entre masa y el pin
Esta es la forma de conexión


Si usas en el setup INPUT. Entonces si usas la resistencia de 10k a masa. El otro extremo va al pulsador y al pin. Y el extremos faltante del pulsador va a 5V.
Esta es la forma de conexión. Acá muestro la que usa 10k a masa y cuando usas 10k a VCC (5 o 3.3V)




Espero que ahora quede claro.

LuisGal

ok gracias si ya entendí, no entendía muy bien la diferencia de pullup y pulldown pero gracias a ti lo entendí bien. todo va a bien
ahora mi pregunta es como hacer para que cuando termine el tiempo regrese al menú de elección de tiempo
si me puedes ayudar con algunas ideas te lo agradecería bastatne :D

surbyte

Yo no veo tu programa, solo esta el setup. 
Te lo dije antes.. si posteas un código que sea completo.

Tu problema debe ser que tienes todo junto en el loop en lugar de crear rutinas ordenadas que sean llamadas oportunamente.
Entonces al tener todo junto tienes practicamente un caos, por eso ahora preguntas como hacer para que cuando se termine algo se vuelva a invocar un menú.
Lo que debes hacer es separar las funciones.

Tu loop debe estar ordenados por macro rutinas.
Cada acción debe llamar lo que hace falta.. y terminada dicha acción debes volver a donde sea conveniente.
Como no esta el código no puedo mas que hablar en líneas generales.


LuisGal

si olvide el codigo  :(  y tambien pense hacerlo asi pero como que me confundo y ase tiempo que no toco java que confundo muchas cosas que no supe por donde comenzar
Code: [Select]

#include <LiquidCrystal.h> //Libreria del display LCD
#define T1000 995
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 = A2;            //Pulsador de arranque
int empieza = 1024;        // Variable para almacenaje del pulsador de arranque
int pausaPin = A1;      // Pulsador de pausa
int buth = A5;             //Pulsador de Horas
int butm = A4;             //Pulsador de Minutos
int buts = A3;             //Pulsador de segundos
int pausa        = 0;      //variable para pausar
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
int restart = 1;

boolean detener = false;
unsigned long time = 0;


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_PULLUP);     //Pin de pulsador de horas --> Entrada
  pinMode(butm, INPUT_PULLUP);     //Pin de pulsador de minutos --> Entrada
  pinMode(buts, INPUT_PULLUP);     //Pin de pulsador de segundos --> Entrada
  pinMode(start, INPUT_PULLUP);    //Pin de pulsador de arranque --> Entrada
  pinMode(pausaPin, INPUT_PULLUP);    // Pin de pulsador de pausa --> 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(1, 0);
    lcd.print("B&H Corporation");
    lcd.setCursor(4, 1);
    lcd.print("Autoclave");
    delay(3000);
    msg = 1;
    lcd.clear();
    restart = 0;
  }


  //-------------------------------------------------------------------------------------------------
  // 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 == 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("Elige el tiempo");  //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)

    empieza = digitalRead(start);   //Lee el boton de arranque

    if (empieza == 0)              //Si el boton de arranque, fue pulsado...
    {
      segundostotal = asegundos + (aminutos * 60) + (ahoras * 60 * 60);  //Convierte el tiempo elegido en segundos!!
    }

  } while (empieza == 0 ); // Se repite el menu de elegir tiempo hasta que pulsemos el boton de arranque.

  //-------------------------------------------------------------------------------------------------
  // 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)
  {
    pausa = digitalRead(pausaPin);
    if (pausa == 0) {
      detener = !detener;
      digitalWrite(buzzer, HIGH);
      delay(200);
      digitalWrite(buzzer, LOW);
      delay(200);
    }
    if (!detener) {              // lo que hago solo elimina el descuento de segundos, entonces luce como pausa
      //delay (1000);          //Descontamos en periodos de 1 segundo
      if (millis() - time > T1000) {
        segundostotal--;
        time = millis();
      }
    }

    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
    {
      while (1)                       //Bucle infinito mostrando mensaje y haciendo parpadear un led
      {
        lcd.clear();
        lcd.setCursor(5, 0);
        lcd.print("Tiempo");
        lcd.setCursor(3, 1);
        lcd.print("Finalizado");
        for (int i = 0; i < 5; i++) {
          digitalWrite(buzzer, HIGH);
          delay(200);
          digitalWrite(buzzer, LOW);
          delay(200);
        }
        lcd.clear();
        exit(0);
      }
    }

  }
}





surbyte

Prueba a ver si asi funciona

Code: [Select]
#include <LiquidCrystal.h> //Libreria del display LCD
#define T1000 995
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 = A2;            //Pulsador de arranque
int empieza = 1024;        // Variable para almacenaje del pulsador de arranque
int pausaPin = A1;      // Pulsador de pausa
int buth = A5;             //Pulsador de Horas
int butm = A4;             //Pulsador de Minutos
int buts = A3;             //Pulsador de segundos
int pausa        = 0;      //variable para pausar
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
int restart = 1;

boolean detener = false;
unsigned long time = 0;

void bienvenida() {
  lcd.setCursor(1, 0);
  lcd.print("B&H Corporation");
  lcd.setCursor(4, 1);
  lcd.print("Autoclave");
  delay(3000);
  msg = 1;
  lcd.clear();
  restart = 0;
}

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_PULLUP);     //Pin de pulsador de horas --> Entrada
  pinMode(butm, INPUT_PULLUP);     //Pin de pulsador de minutos --> Entrada
  pinMode(buts, INPUT_PULLUP);     //Pin de pulsador de segundos --> Entrada
  pinMode(start, INPUT_PULLUP);    //Pin de pulsador de arranque --> Entrada
  pinMode(pausaPin, INPUT_PULLUP);    // Pin de pulsador de pausa --> 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
  bienvenida();

}

void loop()
{


  menu();
  cuentaRegresiva();

}

void menu() {
    //-------------------------------------------------------------------------------------------------
  // 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 == 0) {            //Si el boton ha sido pulsado, aumentamos las horas en una unidad
       ahoras++;
       delay(250);
    }

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

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

    lcd.setCursor(0, 0);
    lcd.print("Elige el tiempo");  //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)

    empieza = digitalRead(start);   //Lee el boton de arranque

    if (empieza == 0) {             //Si el boton de arranque, fue pulsado...
      segundostotal = asegundos + (aminutos * 60) + (ahoras * 60 * 60);  //Convierte el tiempo elegido en segundos!!
    }

  } while (empieza == 0 ); // Se repite el menu de elegir tiempo hasta que pulsemos el boton de arranque.

}

void cuentaRegresiva() {
  //-------------------------------------------------------------------------------------------------
  // 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)  {
    pausa = digitalRead(pausaPin);
    if (pausa == 0) {
      detener = !detener;
      digitalWrite(buzzer, HIGH);
      delay(200);
      digitalWrite(buzzer, LOW);
      delay(200);
    }
    if (!detener) {              // lo que hago solo elimina el descuento de segundos, entonces luce como pausa
      //delay (1000);          //Descontamos en periodos de 1 segundo
      if (millis() - time > T1000) {
          segundostotal--;
          time = millis();
      }
    }

    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
       while (1)   {                     //Bucle infinito mostrando mensaje y haciendo parpadear un led   
          lcd.clear();
          lcd.setCursor(5, 0);
          lcd.print("Tiempo");
          lcd.setCursor(3, 1);
          lcd.print("Finalizado");
         
          for (int i = 0; i < 5; i++) {
              digitalWrite(buzzer, HIGH);
              delay(200);
              digitalWrite(buzzer, LOW);
              delay(200);
          }
          lcd.clear();
          break;
      }
    }

  }
}

LuisGal

Si funciona gracias listo eso es todo ahora me falta estudiarlo.
gracias surbyte

surbyte

Entonces ahora agrega [SOLUCIONADO] a tu título

Go Up