Display LCD - Problemas ao Exibir Contagem Regressiva

Eu fiz um código simples para exibir uma contagem regressiva no visor LCD.

O LCD exibe a contagem regressiva normal até 10 abaixo disso, ao invés de aparecer 09 -> 08... o número passa para a direita, ficando 90 ->  80-> ... Apesar de se tratar das unidades 9 e 8 respectivamente, no visor aparece como se fosse 90 e 80.

A impressão que eu tenho, é que a exibição do número no regressão é a mesma que na progressão, onde na mudança de unidade, troca o número da esquerda.

A contagem regressiva é exibida assim:


13 12 11 10 90 08 70 60 50 40 30 20 10 00.

Quando deveria ficar assim:

13 12 11 10 09 08 07 06 05 04 03 02 01 00.

Este é o código que eu fiz:

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
 
int cont = 015;
 
void setup()
{
lcd.begin(16, 2);
}
  void loop()
    {
  if(cont <= 0)
      {
    cont = 015;
      }
  else
    {
    cont--;
 
    }
delay(500);
lcd.setCursor(1, 0);
lcd.print("CONT. REGRESSIVA");
lcd.setCursor(1, 1);
lcd.print("TEMPO: " );
lcd.print(cont);

    }

Exibições: 1742

Responder esta

Respostas a este tópico

Oi Sr. M, boa tarde.

Teste este code:

http://pastebin.com/rQQSUSDk

 Vai aparecer assim:  13 12 11 10 9 8 7 6 5 4 3 2 1 0.

Rui

Boa tarde

A noite eu vou testar, agora estou sem meu arduino por perto.

Vamos com calma; eu não entendi o que você fez. Mandou o LCD imprimir 5 espaços vazios depois do número.
Qual a função disso? Como isso vai resolver esse problema e por que?

O código está certo. O problema é que o LCD mantém o último caractere na tela.

Para corrigir, limpe o lcd depois do delay:

delay(500);

lcd.clear();

Eu já tinha visto isso. É uma solução horrível.

Mas já que você tocou no assunto, tem como o LCD limpar uma linha ou coluna específica?

Tem sim. É a solução que o Rui te enviou, colocando 5 espaços vazios.

Outra forma (melhor prática) é criando uma função para formatar o número com o número de casas desejadas.

Certa vez eu precisei formatar um número com zeros à esquerda. Existem funções prontas para isso nas bibliotecas do Arduino, mas preferi desenvolver uma específica:

Veja, essa função recebe um número do tipo float e devolve uma string formatada com o caractere que você quiser à esquerda. Você passa o número de dígitos e qual caractere quer o preenchimento.

dessa forma o lcd vai exibir sempre corretamente:

//Fill a float value with a desired pattern on the left
String leftPad(float value, int numDigits, char pattern) {
  String retVal = String((int)value); //Convert the value to String without decimal part
  // Fill with the pattern on the left
  int lenPad = numDigits - retVal.length();
  for (int x = 1; x <= lenPad; x++){
    retVal = pattern + retVal;   
  }
  return retVal;
}

No meu caso eu imprimi a humidade do ambiente com espaços à esquerda:

lcd.print("Humidity: " + leftPad(dhtHumidity,5,' ') + "%");

Qual é a biblioteca que faz isso?
Estava pensando em fazer uma biblioteca para formatação de números, mas se já tiver pronta...


sprintf() para ints:

https://liudr.wordpress.com/2012/01/16/sprintf/

dtostrf() Para floats:

http://forum.arduino.cc/index.php?topic=73083.0

Não fiquei satisfeito com essas, por isso criei minha própria função.

A escolha vai depender do tipo de aplicação que vc está desenvolvendo. (rapidez, economia de memória, etc)

Posso dar uma sugestão bem gambiarra?

e se você colocar um "if" verificando se o numero e menor que 10 ai se for vc da um clean no LCD e escreve de novo a contagem dai vai sumir este zero misterioso ai q esta te incomodando.

sempre que a contagem chegar a 9 ela da um clean na tela  LCD.

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup(){
lcd.begin(16, 2);
}
  void loop()    {
for (int i=15;i<-1;i--){     
delay(500);
if (i==9){lcd.clear();}
lcd.setCursor(1, 0);
lcd.print("CONT. REGRESSIVA");
lcd.setCursor(1, 1);
lcd.print("TEMPO: " );
lcd.print(i);
}
 }

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço