lcd y cronometro

Muchas Gracias por interesarse en mi problema… Les cuento los que me pasa… Tengo un codigo que lo que hace es mostrar por lcd unos mensajes ademas tengo unos rele conectado a mi placa arduino mega los cuales se enciende y se apagan tras un determinado tiempo y hasta ahi funciona todo bien… el tema es que necesito poner un cronometro que valla contando los segundos que pasan desde que se apaga el rele hasta que se vuelve a encender y no logro hacerlo… les muestro el codigo

const int buttonPin = 9;
int buttonState = 0;
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //defino pines del lcd
int lcd_key     = 0;
int adc_key_in  = 0;
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5



int read_LCD_buttons()  
  { adc_key_in = analogRead(0);      // Leemos A0
    // Mis botones dan:  0, 145, 329,507,743
    // Y ahora los comparamos con un margen comodo
    if (adc_key_in > 900) return btnNONE;     // Ningun boton pulsado 
    if (adc_key_in < 50)   return btnRIGHT; 
    if (adc_key_in < 250)  return btnUP;
    if (adc_key_in < 450)  return btnDOWN;
    if (adc_key_in < 650)  return btnLEFT;
    if (adc_key_in < 850)  return btnSELECT; 

    return btnNONE;  // Por si todo falla
  }

  int contador(){
    lcd.setCursor(0, 1);
 lcd.print(millis()/1000);
  }

void setup()
{


 lcd.begin(16, 2);              // Inicializar el LCD
      lcd.setCursor(0,0);
      lcd.print("SYSTEM");     // imprimo simles mensajes
      lcd.setCursor(0,1);
      lcd.print("****************");
      delay(3000);
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("   INICIANDO");
      lcd.setCursor(0,1);
      lcd.print(" COMPROBACION");
      delay(5000);
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("SISTEMA CORRECTO");
      delay(5000);
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("   SISTEMA EN");
      lcd.setCursor(0,1);
      lcd.print(" FUNCIONAMIENTO");
     
  
      

      
     
      


pinMode(47, OUTPUT);
pinMode(49, OUTPUT);
pinMode(51, OUTPUT); //DECLARO PINES COMO SALIDA
pinMode(53, OUTPUT);
pinMode(buttonPin, INPUT);

digitalWrite(47, HIGH);
digitalWrite(49, HIGH);
digitalWrite(51, HIGH);
digitalWrite(53, HIGH);

}



void loop() {
 
// lcd.setCursor(9,1);              // Cursor a linea 2, posicion 9
//      lcd.print(millis()/1000);        // Imprime segundos
//      lcd.setCursor(13, 0);            // Cursor a linea 1, posicion 13
//      lcd.print(lcd_key);                  // Imprime el valor leido en la puerta A0
//      lcd.setCursor(0,1);              // Cursor a linea 2, posicion 1

 
      lcd_key = read_LCD_buttons();
      if( lcd_key == btnRIGHT)
              lcd.print("RIGHT ");
      else if ( lcd_key == btnLEFT )
              lcd.print("LEFT   ");
      else if ( lcd_key == btnUP)
              lcd.print("UP    ");
      else if ( lcd_key == btnDOWN)
              lcd.print("DOWN  ");
      else if ( lcd_key == btnSELECT)
              lcd.print("SELECT");
      else if ( lcd_key == btnNONE)
              lcd.print("NONE  ");


    

 buttonState = digitalRead(buttonPin);

 if (buttonState == HIGH) {     
   digitalWrite(47, LOW); //ENCIENDO Y APAGO RELE DEPENDIENDO EL TIEMPO
 delay(6000);
 digitalWrite(47, HIGH);
 delay(54000); 

  digitalWrite(47, LOW);
 delay(6000);
 digitalWrite(47, HIGH);
 delay(54000); 

 digitalWrite(47, LOW);
 delay(6000);
 digitalWrite(47, HIGH);
 delay(54000); 

 digitalWrite(47, LOW);
 delay(6000);
 digitalWrite(47, HIGH);
 delay(54000); 

 
 } 
 

}

Para que el cronometro? O es para ver cuanto tiempo falta para que cambie el relé?

Claro, seria para ver cuanto falta para el cambio del rele..!! Gracias por tratar de ayudarme!

Para hacer lo que pides no puedes usar delay.
Delay detiene la ejecución del programa hasta que se cumple el intervalo indicado.
tienes que usar millis()

A ver si funciona mas o menos bien, debes ubicar donde quieres que muestre el tiempo que transcurre. Lo puse como tiempo hasta que cambie

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //defino pines del lcd

const int buttonPin   = 9;

byte buttonState      = 0;
byte buttonStateAnt   = 0;
int lcd_key           = 0;
int adc_key_in        = 0;

#define btnRIGHT    0
#define btnUP       1
#define btnDOWN     2
#define btnLEFT     3
#define btnSELECT   4
#define btnNONE     5

enum tipos {CERO=0, UNO};
tipos estado;
unsigned long t_start, Intervalo, t2_start;

int read_LCD_buttons()  { 

  adc_key_in = analogRead(0);      // Leemos A0
  
  // Mis botones dan:  0, 145, 329,507,743
  // Y ahora los comparamos con un margen comodo
  if (adc_key_in > 900) return btnNONE;     // Ningun boton pulsado 
  if (adc_key_in < 50)   return btnRIGHT; 
  if (adc_key_in < 250)  return btnUP;
  if (adc_key_in < 450)  return btnDOWN;
  if (adc_key_in < 650)  return btnLEFT;
  if (adc_key_in < 850)  return btnSELECT; 

  return btnNONE;  // Por si todo falla
}

int contador() {
    lcd.setCursor(0, 1);
    lcd.print(millis()/1000);
}

void setup()   {

  lcd.begin(16, 2);              // Inicializar el LCD
  pinMode(47, OUTPUT);
  pinMode(49, OUTPUT);
  pinMode(51, OUTPUT); //DECLARO PINES COMO SALIDA
  pinMode(53, OUTPUT);
  pinMode(buttonPin, INPUT);

  digitalWrite(47, HIGH);
  digitalWrite(49, HIGH);
  digitalWrite(51, HIGH);
  digitalWrite(53, HIGH);

  lcd.setCursor(0,0);
  lcd.print("SYSTEM");     // imprimo simles mensajes
  lcd.setCursor(0,1);
  lcd.print("****************");
  delay(3000);
  lcd.clear();

  lcd.setCursor(0,0);
  lcd.print("   INICIANDO");
  lcd.setCursor(0,1);
  lcd.print(" COMPROBACION");       // COmproabación de que?
  delay(5000);

  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("SISTEMA CORRECTO");    // No verificaste nada
  delay(5000);
  
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("   SISTEMA EN");
  lcd.setCursor(0,1);
  lcd.print(" FUNCIONAMIENTO");     // Esto no se hace.

  estado = CERO;
  t2_start = t_start = millis();  // inicializo variable comparación millis()
  Intervalo = 6000UL;
}

void loop() {

  // lcd.setCursor(9,1);              // Cursor a linea 2, posicion 9
  //      lcd.print(millis()/1000);        // Imprime segundos
  //      lcd.setCursor(13, 0);            // Cursor a linea 1, posicion 13
  //      lcd.print(lcd_key);                  // Imprime el valor leido en la puerta A0
  //      lcd.setCursor(0,1);              // Cursor a linea 2, posicion 1

  lcd_key = read_LCD_buttons();

  switch (lcd_key) {
    case btnRIGHT: 
                  lcd.print("RIGHT ");
                  break;
    case btnLEFT: 
                  lcd.print("LEFT   ");
                  break;
    case btnUP:
                  lcd.print("UP    ");
                  break;
    case btnDOWN:
                  lcd.print("DOWN  ");
                  break;
    case btnSELECT:
                  lcd.print("SELECT");
                  break;
    case btnNONE: lcd.print("NONE  ");
                  break;
  }

  buttonState = digitalRead(buttonPin);

  if (buttonState == HIGH && buttonStateAnt == LOW) { 
    for (byte i=0; i<5; i++) {
        switch (estado) {
            case CERO: 
                        digitalWrite(47, LOW);              //ENCIENDO Y APAGO RELE DEPENDIENDO EL TIEMPO
                        if (millis()- t_start > Intervalo) {   // 6 segundos
                           estado = UNO;
                           t_start = millis();
                           Intervalo = 54000UL;
                        }
                        break;
            case UNO: 
                        digitalWrite(47, HIGH);              //ENCIENDO Y APAGO RELE DEPENDIENDO EL TIEMPO
                        if (millis()- t_start > Intervalo) {   // 54 segundos
                           estado = CERO;
                           t_start = millis();
                           Intervalo = 6000UL;
                        }
                        break;
        }  // fin del switch
    } // fin del for
  } // fin del if

  buttonStateAnt = buttonState;
  if (millis() - t2_start > 250UL) {    // Cada 200 mseg actualizar pantalla
      lcd.setCursor(0,0);             // definir donde mostrar el tiempo
      lcd.print((Intervalo-millis()+t_start)/1000);  // si no quieres que muestre tiempo hasta prox cambio
      // lcd.print((millis()-t_start)/1000);               lo pones de este modo y comenta el anterior.
      t2_start = millis();
  }
}