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//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 a 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 do y el ciclo while
   //--------RUTINA ESCOGER EL TIEMPO EN PANTALLA.
   lcd.home();     //regresa el cursor a 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 do 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 a 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 a su contrario
     seguro++;          //seguro cambia de cero a 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 a 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 do 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();
 }]

Hola Flecho, tanto tiempo!!!

Tu buzzer suena solo en este caso

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);
     }

Si horas == 0 && minutos == 0 && segundos == 0
es tu final de ciclo pues suena ahi, durante 200 mseg y se apaga.

Gracias surbyte !! al encender tb suena el buzer ,seria muy complicado que en este mismo código agregar que el segundero sonara el bit cada segundo?

Garcias de nuevo y un saludo a todo el foro.

Mientras lo hago tu edita el post 1 por favor.
Yo pondré aqui la respuesta con lo que necesitas.
Mira creo que abusas del uso de delay(200) porque no considerar retirarlos en las areas sensibles del código como cuando ajustas hora,minutos y segundos.

Usa esta librería Bounce2. yo usaba otra de nombre Switch que hace lo mismo pero esta funciona muy bien.
reemplaza todos las lecturas de teclas o botones y quita esos 200mseg. De por si con 20 o 50 son suficientes. Supongo que tienes resistencia pullup o pulldown encada botón, no es asi?

Bien aca esta la reforma, solo que el anidado de tus 200mseg con los 200 del buzzer mucho no me gusta porque suman mucho.

//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 a 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;
bool SuenaBuzzer = false;

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 do y el ciclo while
   //--------RUTINA ESCOGER EL TIEMPO EN PANTALLA.
   lcd.home();     //regresa el cursor a 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 do 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.
     SuenaBuzzer = true;
     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 a 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");

       SuenaBuzzer = true;
       
     }else printTime();  // imprime el tiempo en la segunda linea de la pantalla
   }
   if (SuenaBuzzer) ActivoBuzzer();
 }


void ActivoBuzzer() {
    digitalWrite(pinBuz, HIGH);
    delay(200);
    digitalWrite(pinBuz, LOW);
    delay(200);
    SuenaBuzzer = false;
 }


 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 a su contrario
     seguro++;          //seguro cambia de cero a 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 a 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 do 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();
 }

Gracias surbyte,lo probare a ver que tal va,si efectivamente tengo resistencias pullup en los pulsadores, en cuanto tenga tiempo libre que ando escaso me pondré manos a la obra y ya te contare.

Un saludo.

hola de nuevo! ya coloque tú código surbyte y me baje la librería tb pero me da un erros y no compila,no creo que sea del lcd pues tengo esa librería tb el error es este:

Arduino:1.6.3 (Windows 7), Placa:"Arduino Uno"

Opciones de compilación cambiadas, reconstruyendo todo
sketch_may05a.ino: In function 'void startLCD()':
sketch_may05a.ino:196:15: error: expected '}' at end of input
Multiple libraries were found for "LiquidCrystal.h"
Used: C:\Users\Microsoft-Net\Documents\Arduino\libraries\LiquidCrystal
Not used: C:\Program Files (x86)\Arduino\libraries\LiquidCrystal
Error de compilación

This report would have more information with
"Show verbose output during compilation"
activala desde Archivo > Preferencias

un saludo.

Si pero ahi se queja en la librería LCD no con Bounce2.h.

mirá esta linea

Multiple libraries were found for "LiquidCrystal.h"
Varias librerías LiquidCrystal.h

busca a ver si realmente es así.

Ya si por eso te digo tengo esa libreria y otros codigos que tiran de ella,la e sacado aparte de su carpeta a ver si tira y me sigue sin compilar.

Pero no es Bounce2 la culpable.
No leiste que dice que tenés multiples librerias LiquidCrystal.h?

Multiple libraries were found for "LiquidCrystal.h"

Y cual es la solucion? Quitar esa libreria y poner solo la que me pide?

Gracias por ser tan pasible.

Ya veo tu problema. Lo vi ayer en una máquina mientras lo ayudaba por control Remoto.
Seguro tienes Win 8 y en tu instalación tienes SUPONGO, librerias de LiquidCrystal en un sitio y en otro.

Busca en tu PC LiquidCrystal a ver las referencias que aparecen.
Si salen dos carpetas es que atiné con la explicación del error.
Y si no. Me equivoqué.

Debería quedar solo la del c:\archivos de programa (x86)\arduino\libraries solo esta

nada chico esto no lo puedo arrancar,tengo w7 e echo lo que me dices por si acaso y no va de ninguna manera te dejo unas capturas de lo que tengo.

e dejado solo la carpeta que me dijistes y ahora da este error diferente:

Arduino:1.6.3 (Windows 7), Placa:"Arduino Uno"

sketch_may06a.ino: In function 'void startLCD()':
sketch_may06a.ino:196:15: error: expected '}' at end of input
Error de compilación

This report would have more information with
"Show verbose output during compilation"
activala desde Archivo > Preferencias

te mando un privado. Okay.