Go Down

Topic: Alternar dados no LCD a cada 2 segundos (Read 4583 times) previous topic - next topic

NJPinheiro


Isso pode ser facilmente contornado, fazendo uma alteração simples

Code: [Select]
xxxx

Veja se entende a alteração e as implicações.


OK,
depois de feito até parece fácil :)

Antes tínhamos o tempo a ser "zerado" dentro do if
Code: [Select]
if (millis() - tempoInfo > 2000) {
      menuEcra++;
      if (menuEcra >= 3) {
        menuEcra = 1;
      }
      tempoInfo = millis();
    }
 

Agora passou para fora, e está a "zerar" imediatamente antes da exibição da temperatura max/min, consequentemente ficou a afectar a função switch.

Vou agora procurar responder ás outras questões colocadas no reply 10


Uma última nota. Não gosto desta linha:
Code: [Select]
if ((keypad.getKey() == NO_KEY)  && millis() - tempo > 180000)

Porque é que nos outros locais do programa é utilizada a tecla que é lida no início da função loop() e aqui é feito novamente uma leitura? Esta linha deveria ser:
Code: [Select]
if ((Key == NO_KEY)  && millis() - tempo > 180000)



Eu tentei alterar, mas dá erro ao compilar, diz-me que a variável Key não está declarada.

A questão do estado = false não estou a perceber bem :~

PS:Isto está-se a complicar, eu não chegava lá, pelo menos de uma maneira tão "limpa".
      Claro que com o delay dava para fazer o que pretendo, mas não fica tão "limpo" porque o delay parava tudo...ou
     seja enquanto o delay estivesse a correr não era possível carregar/ler outras teclas.
     O objectivo deste fds vai ser substituir todos os delay`s que tenho no código...vamos ver se chego a "bom porto".

Obg
NJPinheiro

luisilva

#16
Sep 03, 2014, 11:27 pm Last Edit: Sep 04, 2014, 01:05 am by luisilva Reason: 1
A resolução do problema não foi exactamente essa. Na primeira situação:
Code: [Select]

  else if (estado==true && Key==NO_KEY && passaInfo == true) {
    if (millis() - tempoInfo > 2000) {
      menuEcra++;
      if (menuEcra >= 3) {
        menuEcra = 1;
      }
      tempoInfo = millis();
    }
    switch (menuEcra) {
       case 1:
        lcd.clear();
        MostraInfo(TARGET, 0, 0, "Temperatura Max");
        MostraInfo(TARGET, 1, 1, "do dia");
        lcd.setCursor(8, 1);
        lcd.print(max_temp_dia);
        MostraInfo(TARGET, 13, 1, "C");
        break;
      case 2:
        lcd.clear();
        MostraInfo(TARGET, 0, 0, "Temperatura Min");
        MostraInfo(TARGET, 1, 1, "do dia");
        lcd.setCursor(8, 1);
        lcd.print(min_temp_dia);
        MostraInfo(TARGET, 13, 1, "C");
        break;
    }
  }

A escrita do ecrã estava a ser feita muitas vezes (cada vez que o programa passava por este bloco, porque estava fora do if (millis() - tempoInfo > 2000)). Na escrita era feita a limpeza do ecrã (lcd.clear();) e depois era escrita outra vez a mesma informação (que já lá estava) no ecrã. Isto era feito muitas vezes e muito rápido, por isso é que dava a sensação que o ecrã piscava.

No segundo código:
Code: [Select]

 else if (estado == true && Key == NO_KEY && passaInfo == true) {
   if (millis() - tempoInfo > 2000) {
     menuEcra++;
     if (menuEcra >= 3) {
       menuEcra = 1;
     }
     
     tempoInfo = millis();
     
     switch (menuEcra) {
       case 1:
         lcd.clear();
         MostraInfo(TARGET, 0, 0, "Temperatura Max");
         MostraInfo(TARGET, 1, 1, "do dia");
         lcd.setCursor(8, 1);
         lcd.print(max_temp_dia);
         MostraInfo(TARGET, 13, 1, "C");
         break;
       case 2:
         lcd.clear();
         MostraInfo(TARGET, 0, 0, "Temperatura Min");
         MostraInfo(TARGET, 1, 1, "do dia");
         lcd.setCursor(8, 1);
         lcd.print(min_temp_dia);
         MostraInfo(TARGET, 13, 1, "C");
         break;
     }
   }
 }


O código que escreve o ecrã passou para dentro do if (millis() - tempoInfo > 2000), assim o ecrã deixa de estar a ser sempre escrito, e passa a ser escrito apenas quando é necessário, isto é, quando este if é executado, isto é, de 2 em 2 segundos.

Em relação à outra questão, não faz sentido, a variável é usada em muitos sítio, não sei porque é que nesse sítio ela não está declarada e em outros locais não muito distantes já está.

Go Up