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?
Tags:
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
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por