Buzzer off


hola alguien me puede decir si este código el buzzer solo suena al final del ciclo o si suena cada segundo, si no es asi como podía hacerlo.


gracias.

code: [select]
[code//temporizador ehrja 26/02/2015
//originalmente de una duda en el ciclo do, de un codigo escrito por flecho.
//http://forum.arduino.cc/index.php?topic=300828.0

#include <liquidcrystal.h> //libreria del display lcd
#include <wire.h>
liquidcrystal lcd(7,8,9,10,11,12); //inicializamos la libreria con el numero de los pines utilizar


byte horas, minutos, segundos;

byte pinbuz = 13;
byte pinsta = a0;
byte pinhor = a1;
byte pinmin = a2;
byte pinseg = a3;

boolean sss; //start stop state
byte seguro;

unsigned long lastmillis;
void setup() {

 pinmode(pinbuz, output);              //pin salida visual y/o sonora
 pinmode(pinsta, input_pullup);        //pin boton start
 pinmode(pinhor, input_pullup);        //pin boton horas
 pinmode(pinmin, input_pullup);        //pin boton minutos
 pinmode(pinseg, input_pullup);        //pin boton segundos
 startlcd();

 //inicializamos las variables del tiempo, ese sera el valor inicial.
 horas = 1;
 minutos = 15;
 segundos = 00;
}

void loop() {

 do {//<------inicia do
   manage_sss();  //función que activa y libera el ciclo y el ciclo while
   //--------rutina escoger el tiempo en pantalla.
   lcd.home();     //regresa el cursor la posición (0,0)
   lcd.print("elige el tiempo");
   printtime();    // imprime el tiempo en la segunda linea de la pantalla

   //--------rutina botones de tiempo.
   if (digitalread(pinhor) == low)
   { delay(200);                        //retraso para evitar falso conteo
     horas++;
     if (horas > 99) horas = 0;         //horas máximas permitidas 99
   }

   if (digitalread(pinmin) == low)
   { delay(200);                         //retraso para evitar falso conteo
     minutos++;
     if (minutos > 60) minutos = 0;      //minutos máximos permitidos 60
   }

   if (digitalread(pinseg) == low)
   { delay(200);                         //retraso para evitar falso conteo
     segundos++;
     if (segundos > 60) segundos = 0;    //segundos máximos permitidos 60
   }

 }
 while (!sss); //sss = false

 while (sss) //<----inicia whie // sss = true
 { manage_sss();//<----función que activa y libera el ciclo y el ciclo while
   lcd.home();
   lcd.print("tiempo restante");
   //    printtime();  // imprime el tiempo en la segunda linea de la pantalla
   //a partir de aquÍ inicia el calculo del tiempo restante, cada 1000 ms
   if (millis() - lastmillis >= 1000)
   {
     lastmillis = millis();// junto con la comprobación, posibilita ejecutarse una vez cada segundo.
    
     if (segundos > 0 ) segundos--;    //decremento un segundo cada vez
     if (segundos == 0 && minutos > 0) //si segundos = 0 y hay minutos  
     {
       minutos--;                       //decremento un minuto cada vez
       segundos = 59;                   //decremento un segundo del minuto restado
     }
     if (minutos == 0 && horas > 0)     //si minutos = 0 y hay horas
     {
       horas--;                         //decremento una hora
       minutos = 59;                    //decremento un minuto la hora restada.
     }
   } //termina el calculo del tiempo restante
     //empieza la rutina "tiempo finalizado"
     if (horas == 0 && minutos == 0 && segundos == 0) //<----  ¿no hay tiempo?.
     {
       lcd.clear();
       lcd.setcursor(5, 0);
       lcd.print("tiempo");
       lcd.setcursor(3, 1);
       lcd.print("finalizado");


       digitalwrite(pinbuz, high);
       delay(200);
       digitalwrite(pinbuz, low);
       delay(200);
     }else printtime();  // imprime el tiempo en la segunda linea de la pantalla
   }
 }

 void manage_sss() { //función que cambia el estado de sss, y evita atascos
   //se ejecuta en ambos ciclos, para poder salir de ambos.
   if (digitalread(pinsta) == low && seguro == 0) //si el pinsta esta en low y seguro = 0
   {lcd.clear();        //agrego un clear porque cuando termina el tiempo queda f00:00:00o
     sss = !sss;        //el valor de sss = cambia su contrario
     seguro++;          //seguro cambia de cero 1 y con esto evitamos un falso cambio
   }                    //cuando el pinsta continua en low,es decir solo pasara una vez.

   if (digitalread(pinsta) == high) seguro = 0;
   //cuando pinsta sea liberado cambiara su estado high y seguro = 0
   //con esto posibilitamos que la condición anterior se pueda ejecutar nuevamente
   // y por una vez cuando sea presionado nuevamente (pinsta = low)
   //no necesita delay pues el seguro entra inmediato

 }

 void printtime() {
   // función simple que imprime el tiempo en la segunda linea
   // con esto evitamos repetir código en el ciclo y en el ciclo while
   lcd.setcursor(4, 1);
   if (horas < 10)lcd.print("0");
   lcd.print(horas);
   lcd.print(":");
   if (minutos < 10)lcd.print("0");
   lcd.print(minutos);
   lcd.print(":");
   if (segundos < 10)lcd.print("0");
   lcd.print(segundos);
 }

 void startlcd() {
   // + + + + + + + + + + + + + + + + + + + + + //
   //  ---- rutina de inicio splash screen ---- //
   // + + + + + + + + + + + + + + + + + + + + + //
   lcd.begin(16, 2);
   byte customchar1[8] = {
     b00000,
     b00100,
     b01110,
     b11111,
     b01110,
     b00100,
     b00000,
     b00000
   };
   byte customchar2[8] = {
     b00000,
     b00100,
     b01010,
     b10101,
     b01010,
     b00100,
     b00000,
     b00000
   };

   lcd.createchar(0, customchar1);
   lcd.createchar(1, customchar2);

   // --- inicia rutina --- //

   lcd.setcursor(0, 0);
   lcd.print("activacion");
   lcd.setcursor(0, 1);
   lcd.write(byte(0));
   lcd.setcursor(1, 1);
   lcd.print("--------------");
   lcd.setcursor(15, 1);
   lcd.write(byte(1));
   delay(2500);
   lcd.clear();

   lcd.setcursor(0, 0);
   lcd.print("temporizador con");
   lcd.setcursor(1, 1);
   lcd.print("arduino + lcd");
   delay(2500);
   lcd.clear();
 }]




Arduino Forum > International > Español > Proyectos (Moderators: surbyte, Hector_A) > Buzzer off


arduino

Comments