Estou montando um datalogger para exibir a data e a hora no lcd 16x2 . Estou coma seguinte dificuldade, no mes da data não mostra o número zero e nos minutos da hora também não mostra o zero e os segundos também está mostrando uma contagem maluca nos 10 primeiros segundos e depois normaliza.Este é codigo que eu fiz:

  #include /font>Wire.h>        //Biblioteca para manipulação do protocolo I2C  #include /font>DS3231.h>      //Biblioteca para manipulação do DS3231  #include /font>LiquidCrystal_I2C.h>  //Biblioteca para manipulação do LCD
   
DS3231 rtc; //Criação do objeto do tipo DS3231
RTCDateTime dataehora; //Criação do objeto do tipo RTCDateTime
LiquidCrystal_I2C lcd(0x3f,16,2); //Seta o endereço do LCD para para 0x3F para 16 caracteres 2 linhas



void setup()
{
Serial.begin(9600); //Inicialização da comunicação serial
rtc.begin(); //Inicialização do RTC DS3231

rtc.setDateTime(__DATE__, __TIME__); //Configurando valores iniciais
//do RTC DS3231
lcd.begin();
}

void loop()
{
dataehora = rtc.getDateTime(); //Atribuindo valores instantâneos de
//data e hora à instância dataehora


Serial.print(dataehora.year); //Imprimindo o Ano
Serial.print("2018");
Serial.print(dataehora.month); //Imprimindo o Mês
Serial.print("06");
Serial.print(dataehora.day); //Imprimindo o Dia
Serial.print("12");
Serial.print(dataehora.hour); //Imprimindo a Hora
Serial.print("22");
Serial.print(dataehora.minute); //Imprimindo o Minuto
Serial.print("04");
Serial.print(dataehora.second); //Imprimindo o Segundo
Serial.println("00");

delay(1000); //Tempo p atualização do valor enviado pela porta
//serial


//Mostra no lcd
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Data");
lcd.setCursor(5,0);
lcd.print(dataehora.day);
lcd.setCursor(7,0);
lcd.print("/");
lcd.setCursor(8,0);
lcd.print(dataehora.month);
lcd.setCursor(10,0);
lcd.print("/");
lcd.setCursor(11,0);
lcd.print(dataehora.year);
lcd.setCursor(0,1);
lcd.print("Hora");
lcd.setCursor(5,1);
lcd.print(dataehora.hour);
lcd.setCursor(7,1);
lcd.print(":");
lcd.setCursor(8,1);
lcd.print(dataehora.minute);
lcd.setCursor(10,1);
lcd.print(":");
lcd.setCursor(11,1);
lcd.print(dataehora.second);

}


Como que eu corrijo este problema?

Exibições: 751

Anexos

Responder esta

Respostas a este tópico

Isso é chatinho mesmo de fazer.

Acontece que se o numero for 1 ele escreve "1"... Não escreve "01".

Tem que dar uma rebolada pra resolver. Se vc simplesmente formatar para 2 casas ele escreve " 1" e não "01".

Quando usava 8051 simplesmente fazia minha propria rotina de apresentação de byte em 2 caracteres, coisa como:

wrlcd(0x40+((dado/10)%10)); // escreve no lcd o caracter ascii (0x40 ("0") somado com o resto da divisão de (dado/10) por 10) que é a dezena.

wrlcd(0x40+(dado%10)); // agora para dado, a unidade.

Parece e é bobo, mas isso executa muuuuuito mais rápido e é muito mais limpo para o processador que as chamadas padrão feitas para as bibliotecas. Para o 8051 inclusive apenas uma divisão era feita. A divisão de inteiro já gerava em um registrador o resultado e em outro o resto. O compilador tinha a inteligencia de reservar esse valor para ser reutilizado logo depois.

Olhando pelos exemplos na internet existem muitas outras sugestões.

Uma que já vi é somar 100 e mandar escrever formatado para 2 casas. Aih o que seria 02 vira 102 e imprimindo vc consegue o "02". Prefiro a minha gambiarra...

Consegui. Eu coloquei vários if e aparentemente deu certo. Obrigado pela ajuda

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço