#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Definiciones para el LCD I2C
LiquidCrystal_I2C lcd(0x27, 16, 2); // Dirección I2C del LCD y tamaño 16x2
// Variables globales
char receivedData[20];
volatile bool newData = false;
// Función para calcular el checksum
uint8_t calculateChecksum(const char* data) {
uint8_t checksum = 0;
for (int i = 1; data[i] != '<'; i++) {
checksum += data[i];
}
return checksum;
}
// Función que se llama cada vez que hay un nuevo dato
void serialEvent() {
while (Serial.available()) {
static uint8_t index = 0;
char c = Serial.read();
Serial.print(c); // Depuración: imprimir cada carácter recibido
if (c == '>') {
index = 0; // Reiniciar el índice al encontrar el carácter de inicio
}
if (index < sizeof(receivedData) - 1) {
receivedData[index++] = c;
}
if (c == '<') {
receivedData[index] = '\0'; // Terminar la cadena
newData = true; // Indicar que hay nuevos datos
}
}
}
// Función para mostrar la información en el LCD
void Display() {
if (newData) {
newData = false;
char hour[3] = {0}, minute[3] = {0}, temperature[5] = {0};
uint8_t checksum;
sscanf(receivedData, ">%2s%2s%4s%hhu<", hour, minute, temperature, &checksum);
Serial.print("Received: "); Serial.println(receivedData); // Depuración
Serial.print("Hour: "); Serial.println(hour); // Depuración
Serial.print("Minute: "); Serial.println(minute); // Depuración
Serial.print("Temperature: "); Serial.println(temperature); // Depuración
Serial.print("Checksum received: "); Serial.println(checksum); // Depuración
// Validar checksum
if (checksum == calculateChecksum(receivedData)) {
Serial.println("Checksum valid!"); // Depuración
// Limpiar el LCD
lcd.clear();
// Mostrar la hora en la primera línea del LCD
lcd.setCursor(0, 0);
lcd.print("Hora: ");
lcd.print(hour);
lcd.print(":");
lcd.print(minute);
// Mostrar la temperatura en la segunda línea del LCD
lcd.setCursor(0, 1);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print(" C");
} else {
Serial.println("Checksum invalid!"); // Depuración
}
}
}
// Función principal
void setup() {
Serial.begin(9600);
Serial.println("Iniciando..."); // Depuración
// Inicializar el LCD
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Iniciando...");
}
void loop() {
serialEvent(); // Verificar si hay nuevos datos
Display(); // Actualizar el LCD
delay(1); // Esperar 1 ms
}