Temporizador (solucionado)

Hola amigos soy nuevo en el foro,e empezado hace nada en este mundo después de leer y requeteleer varios foros,tutoriales videos etc, me voy enterando de algo aunque de programar nada y de electrónica tampoco, todo se anduviera os pido a alguno de vosotros por favor que si me podeis mandar los códigos de algún temporizador y su esquema completo con pulsadores incluidos,despues de bajar varios y hacer el cableado ninguno me funciona correctamente sobre todo los pulsadores,el lcd si me va bien y la cuenta atrás tb,pero los pulsadores no me van ninguno,unos los hacen con resistencias otros sin ellas y probando y probando no sale todo bien.

Gracias.

Flecho

<>

//TEMPORIZADOR

#include <LiquidCrystal.h> //Libreria del display LCD

LiquidCrystal lcd(7,8,9,10,11,12); //Inicializamos la libreria con el numero de los pines a utilizar

int buzzer = 13; //Alarma (LED)
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 = A5; //Pulsador de arranque
int empieza = 1024; // Variable para almacenaje del pulsador de arranque

int buth = A1; //Pulsador de Horas
int butm = A3; //Pulsador de Minutos
int buts = A4; //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

// definicion del nuevo caracter
byte customChar1[8] = {
B00000,
B00100,
B01110,
B11111,
B01110,
B00100,
B00000,
B00000
};
byte customChar2[8] = {
B00000,
B00100,
B01010,
B10101,
B01010,
B00100,
B00000,
B00000
};

void escribeLCD1(int valor)
{
lcd.write(valor);
}

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

lcd.createChar(0, customChar1);
lcd.createChar(1, customChar2);
}

void loop()
{
if(msg==0) //Mostramos el mensaje de bienvenida solo una vez
{
lcd.setCursor(0,0);
lcd.print("ACTIVACION");
lcd.setCursor(0,1);
escribeLCD1(0);
lcd.setCursor(1,1);
lcd.print("--------------");
lcd.setCursor(15,1);
escribeLCD1(1);
lcd.clear();

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

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

if(varbuts != 0) // CORREGIDO 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) // CORREGIDO Si el boton de arranque, fue pulsado…
{
segundostotal = asegundos + (aminutos * 60) + (ahoras * 60 * 60); //Convierte el tiempo elegido en segundos!!
}

} while(empieza == 0); // CORREGIDO 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);
}
}
}

}

Pon tu código usando el tag de la hoja con los símbolos <> y te podemos ayudar a corregirlo, pero no pidas que te hagamos todo el trabajo de cero, porque eso no lo vamos a hacer.

Gracias por tu atención carmeloco no pretendo que me hagan nada desde cero pero me e quedado estancado y me estoy volviendo loco,no se como se hace eso de la hoja, e puesto el código en el primer post,como te digo toda va bien,compila sin errores lcd luce bien,salen las horas minutos y segundos y empieza desde una hora el temporizador al acabar la hora finaliza y da bien el pantallazo.pero los pulsadores no van ninguno.

un saludo .

El problema no es que este mal el código, el problema es el do while yo también he tenido problemas con este, sin saber que es.

Cambialo por while o por if y listo.

Hola ehrja geacias por echar un cable,como te digo llevopoco tiempo en programacion y la verdad que no se muy bien como cambiar lo que dices,con lo que tengo echo me a costado una barbaridad entre unas cosas y otras,te refieres a cambiar la extension del fichero? Si no es asi me podias orientar un poco mas?

Gracias

Si estas usando los pines analogicos como digitales para saber si se han pulsado no puedes poner :

varbuth = analogRead(buth); //Leemos boton de horas
varbutm = analogRead(butm); //Leemos boton de minutos
varbuts = analogRead(buts); //Leemos boton de segundos

si no:

varbuth = digitalRead(buth); //Leemos boton de horas
varbutm = digitalRead(butm); //Leemos boton de minutos
varbuts = digitalRead(buts); //Leemos boton de segundos

y por claridad en el codigo ,cuando quieras saber si estan pulsados:

if(varbuth == HIGH)

Si lo usas asi,sera necesario que pongas resistencias de pull down (de 10k) para que no te queden
las entradas al aire sin señal,si no las tienes ,puedes activar las de pull up que lleva la placa,pero cambiando la logica ,es decir cuando recibas señal tendras un LOW en el pin:

if(varbuth == LOW)  // si esta en low esta recibiendo señal.

resistencias pull up/down

hombre pues si nos compartes el diagrama, de como tienes conectado tus cables y botones te podria ayudar un poco.

No se si tienes resistencias pulldown, si no tienes podemos usar las pullup de los pines por software.

Flecho:
Gracias por tu atención carmeloco no pretendo que me hagan nada desde cero pero me e quedado estancado y me estoy volviendo loco,no se como se hace eso de la hoja, e puesto el código en el primer post,como te digo toda va bien,compila sin errores lcd luce bien,salen las horas minutos y segundos y empieza desde una hora el temporizador al acabar la hora finaliza y da bien el pantallazo.pero los pulsadores no van ninguno.

Te ha pedido camerloco primero y yo nuevamente que edites tu post#1 con tu código para que luzca apropiadamente.
Por favor hazlo para que todos sigamos respondiendo.
Tambien te piden esquemas.
A ver si colaboras, es por tu bien. No por nuestro.
Si tu post es mas claro otros lo entenderán mejor.

Gracias a todos por vuestra colaboracion os explico el problema.

Estava usando este codigo en un arduino uno,cuando este estaba desarrollado para un arduino mega 2560 ,me volvi loco al no tener experiencia,solucion lo e cambiado por otro codigo para arduino uno y ya anda.

Gracias nuevamente.

P.d.( realmente no se como cambiar el post como decies,os referies a la cabecra? Dusculpad pero ando aun perdidoor este foro)

hombre no hay mayor problema les pongo el código original de Flecho:

//TEMPORIZADOR 

#include <LiquidCrystal.h> //Libreria del display LCD

LiquidCrystal lcd(7,8,9,10,11,12); //Inicializamos la libreria con el numero de los pines a utilizar

int buzzer = 13;           //Alarma (LED)
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 = A5;            //Pulsador de arranque
int empieza = 1024;        // Variable para almacenaje del pulsador de arranque

int buth = A1;             //Pulsador de Horas
int butm = A3;             //Pulsador de Minutos
int buts = A4;             //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

// definicion del nuevo caracter
byte customChar1[8] = {
   B00000,
   B00100,
   B01110,
   B11111,
   B01110,
   B00100,
   B00000,
   B00000
};
byte customChar2[8] = {
   B00000,
   B00100,
   B01010,
   B10101,
   B01010,
   B00100,
   B00000,
   B00000
};

void escribeLCD1(int valor)
{
    lcd.write(valor);
}

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
  
  lcd.createChar(0, customChar1); 
  lcd.createChar(1, customChar2);
}

void loop() 
{   
    if(msg==0)             //Mostramos el mensaje de bienvenida solo una vez
    {
    lcd.setCursor(0,0);
    lcd.print("ACTIVACION"); 
    lcd.setCursor(0,1);
    escribeLCD1(0); 
    lcd.setCursor(1,1);
    lcd.print("--------------");   
    lcd.setCursor(15,1);
    escribeLCD1(1);     
    lcd.clear();
    
      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) // CORREGIDO Si el boton ha sido pulsado, aumentamos las horas en una unidad
{
ahoras = ahoras + 1 ;
delay(250);
}

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

if(varbuts != 0) // CORREGIDO 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) // CORREGIDO Si el boton de arranque, fue pulsado…
{
segundostotal = asegundos + (aminutos * 60) + (ahoras * 60 * 60); //Convierte el tiempo elegido en segundos!!
}

} while(empieza == 0); // CORREGIDO 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);
            }      
         }
    }
     
}

Mira según veo aunque a primera vista se ve muy limpio, viendolo mas detenidamente, el código si tiene problemas, aunque tienes idea de lo que necesitas así que si eres novato vas bien, si quieres podemos hacerlo que funcione pero vamos por partes.

He leído muchas veces en el foro ingles que el do while solo se ejecuta una sola vez, así que por lo tanto tendremos que descartar esta idea y usaremos otra secuencia de control, me parece que un simple if puede valer.

Si me sigues continuo con el tema, para que veas que si se puede.

Do while se ejecuta 1 vez si eso es lo que esta dentro del while sino puede ejectuarse infinitamente o N veces.

} while(empieza == 0);

aca claramente se ejecuta ciclicamente hasta que empieza vale 0

He tenido problemas con el do-while pero hasta ahora me he limitado a cambiar la sentencia de control.

He armado un código pequeño para probar el comportamiento del do y hasta ahora me ha desconcertado, no funciona como creo que debería pero seguramente estoy mal. Ya lo pondré en otro hilo si no encuentro una explicación lógica, y a ver si podemos platicarlo.

Hola.
Sencillamente, en while... do, la condición se evalúa antes del código que enmarca, con lo que dicho código se puede ejecutar cero veces. En do....while, la condición se evalúa al final, con lo que se va a ejecutar siempre al menos una vez.

Muchas gracias por esforzarte tanto en querer arreglarlo ehrja,ya lo tengo solucionado,puse un codigo mas pequeño,ahora estoy con otro proyecto parecido pero cn keypad y tengo error de codigos e abierto otro hilo con ese problema.

Gracias a todos.

Flecho.

Flecho:
Muchas gracias por esforzarte tanto en querer arreglarlo ehrja,ya lo tengo solucionado,puse un codigo mas pequeño,ahora estoy con otro proyecto parecido pero cn keypad y tengo error de codigos e abierto otro hilo con ese problema.

Gracias a todos.

Flecho.

No te preocupes quiero sacarme esa duda y ya tengo una pista de como usar el do - while, ahora me pongo reparar ese código.

Código del temporizado para una pantalla lcd i2c
botones:
A0:start
A1:horas
A2:minutos
A3:segundos
13:buzzer

Funciona con un ciclo do y un ciclo while.

//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_I2C.h>
#include <Wire.h>

LiquidCrystal_I2C lcd(0x20, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

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

Para pantallas directas al arduino.

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

eres un maquina! gracias ehrja, que otros tb puedan usarlo gracias a ti.

Flecho.