Ajuda : Atualização de display e temporizador

Estou usando a biblioteca timing.h para o temporizador.

Nela ja declaro a atualização dos segundos a cada 1000 milisegundos.

Porém preciso que esse temporizador exiba o tempo decorrido em um display lcd a partir de algumas condições que o usuário ira escolher pelo teclado matricial, e estas condições estão em um laço while junto com o temporizador para serem exibidas até que o usuário deseje passar para outra função.

Acontece que como a taxa de atualização do display é muito alta, preciso usar um delay dentro do laço while para que as informações que o LCD imprime sejam visíveis.

Ai está o problema:
Quando uso um delay (1000); o temporizador atua corretamente, porém os botões para entrar nas condições não, várias tentativas até o botão pressionado entrar na condição determinada à ele.

Quando uso qualquer delay menor, o temporizador acelera a contagem dos segundos.
Um delay(200) por exemplo, os botoes respondem imediatamente, porem um de (500) demora responder, e ambos bugam o temporizador.

Alguem sabe outra forma de controlar a atualização do display?

Segue trecho do código.

while(contB == 0){ // CONTROLE DA RESISTENCIA EM FUNCAO DA TEMERATURA
int temperatura = sensor.getTemp();
char key = keypad.getKey();

if(temperatura < 25){ //TEMPERATURA MINIMA PARA A QUAL A RESISTENCIA FICA LIGADA
digitalWrite(RES, HIGH); // ATIVA RESISTENCIA SE TEMPERATURA ESTIVER ENTRE 62 E 65
//digitalWrite(BUZ, HIGH);
digitalWrite(VAL, HIGH); // ATIVA VALVULA
digitalWrite(MOT, HIGH); // ATIVA MOTOR
lcd.clear();
lcd.setCursor(0,0);
lcd.print(“RES: ON | LTLT: ON”);
lcd.setCursor(0,1);
lcd.print(temperatura);
lcd.print(" C");
lcd.setCursor(5,1);
lcd.print(“TEMPO 00:00”);
lcd.setCursor(0,3); lcd.print(“SEGURE D: OPCOES”);
}

else if(temperatura >= 25) { // TEMPERATURA MAXIMA
digitalWrite(RES, LOW); // ATIVA RESISTENCIA SE TEMPERATURA ESTIVER ENTRE 62 E 65
//digitalWrite(BUZ, HIGH);
digitalWrite(VAL, HIGH); // ATIVA VALVULA
digitalWrite(MOT, HIGH); // ATIVA MOTOR
lcd.clear();
lcd.setCursor(0,0);
lcd.print(“RES: OFF | LTLT: ON”); // DESATIVA A RESISTENCIA SE A CONDIÇÃO NAO FOR SATISFEITA
lcd.setCursor(0,1);
lcd.print(temperatura);
lcd.print(" C");
lcd.setCursor(5,1);
lcd.print(“TEMPO 00:00”);
lcd.setCursor(0,3); lcd.print(“SEGURE D: OPCOES”);
ativaTimer=1;
}

if(ativaTimer == 1 ){

if (timerEnvio.onTimeout(1000)){segundos++;}
if (segundos == 60){minutos++; segundos=0;
if( minutos < 10){ lcd.setCursor (12,1); lcd.print(" “);}
else if (minutos >= 10){lcd.setCursor (11,1); lcd.print(” "); }} //LIMPA DISPLAY PARA ATUALIZAR OS MINUTOS

if(minutos < 10){
lcd.setCursor(12,1); lcd.print(minutos);
lcd.setCursor(13,1); lcd.print(":");
if(segundos <10){
lcd.setCursor(14,1); lcd.print(“0”);
lcd.setCursor(15,1); lcd.print(segundos);
}
else if (segundos >= 10) {lcd.setCursor(14,1); lcd.print(segundos);}
}

if (minutos >= 10){
lcd.setCursor(11,1); lcd.print(minutos);
lcd.setCursor(13,1); lcd.print(":");
if(segundos <10){
lcd.setCursor(14,1); lcd.print(“0”);
lcd.setCursor(15,1); lcd.print(segundos);
}
else if (segundos >=10) {lcd.setCursor(14,1); lcd.print(segundos);}
}
}

if (minutos == 30 ){
digitalWrite(RES, LOW);
digitalWrite(VAL, LOW); // VERIFICAR TEMPO DA VALVULA LIGADA P RESFRIAR ATE 40 GRAUS
digitalWrite(MOT, LOW);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(“PROCESSO CONCLUIDO”);
lcd.setCursor(0,3);
lcd.print(“D: MENU INICIAL”);
ativaTimer=0; //minutos=0; segundos=0;
contB = 1;
}

//if(contBreak == 1 || key == ‘2’){
if(key == ‘D’){
lcd.clear();
lcd.setCursor(0,0); lcd.print(“1: CONTINUAR”);
lcd.setCursor(0,1); lcd.print(“2: PARAR”);
break;}

delay(500);
} // FIM WHILE CONT B

Uma estrutura não bloqueante seria da seguinte maneira:

// Variaveis globais

void setup(){
  // Inicializacoes
}

void loop(){
  static unsigned long timerAtualizacao{ 0 };
  if(timerAtualizacao == 0 || millis() - timerAtualizacao > 1000){
    timerAtualizacao = millis();
    atualizaDisplay(); // Ocorre a cada 1000 milisegundos
  }
  leTeclado(); // Ocorre constantemente, nao sofre bloqueio pela funcao atualizaDisplay()
}

void atualizaDisplay(){
  // Altera os segundos e envia para o display
}

void leTeclado(){
  // Obtem tecla e realiza as acoes
}

Olá, muito obrigado pelo esclarecimento, assim que possível irei implementar essa estrutura e retorno o resultado! :slight_smile: :slight_smile: :slight_smile: :slight_smile: