Go Down

Topic: Ajuda : Atualização de display e temporizador (Read 284 times) previous topic - next topic

pedronc

Apr 25, 2019, 02:49 pm Last Edit: Apr 25, 2019, 06:27 pm by pedronc
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

giova014

#1
Apr 25, 2019, 10:42 pm Last Edit: Apr 25, 2019, 10:43 pm by giova014
Uma estrutura não bloqueante seria da seguinte maneira:

Code: [Select]
// 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
}
Arduino!!

pedronc

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

Go Up