#include <LedControl.h>
// Definiciones para el display matricial
#define DATA_IN 2 // Pin de entrada de datos
#define CLK_PIN 3 // Pin de reloj
#define CS_PIN 4 // Pin de selección de chip
#define MAX_DEVICES 4 // Número de módulos en cascada
LedControl lc = LedControl(DATA_IN, CLK_PIN, CS_PIN, MAX_DEVICES);
// 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;
// Sumar todos los caracteres desde el segundo (después de '>') hasta antes del carácter '<'
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() {
static uint8_t index = 0;
while (Serial.available()) {
char c = Serial.read();
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 Display
void Display() {
if (newData) {
newData = false;
char hour[3], minute[3], temperature[5];
uint8_t checksumReceived, checksumCalculated;
// Parsear los datos recibidos
sscanf(receivedData, ">%2s%2s%4s%hhu<", hour, minute, temperature, &checksumReceived);
// Calcular el checksum
checksumCalculated = calculateChecksum(receivedData);
// Depuración
Serial.print("Received: ");
Serial.println(receivedData);
Serial.print("Hour: ");
Serial.println(hour);
Serial.print("Minute: ");
Serial.println(minute);
Serial.print("Temperature: ");
Serial.println(temperature);
Serial.print("Checksum received: ");
Serial.println(checksumReceived);
Serial.print("Checksum calculated: ");
Serial.println(checksumCalculated);
// Validar checksum
if (checksumReceived == checksumCalculated) {
// Limpiar el display
for (int i = 0; i < MAX_DEVICES; i++) {
lc.clearDisplay(i);
}
// Mostrar la hora en los primeros dos displays
lc.setChar(0, 0, hour[0], false);
lc.setChar(0, 1, hour[1], false);
lc.setChar(0, 2, ':', false); // Agregar los dos puntos entre horas y minutos
lc.setChar(0, 3, minute[0], false);
lc.setChar(0, 4, minute[1], false);
// Mostrar la temperatura en los siguientes dos displays
lc.setChar(1, 0, 'T', false);
lc.setChar(1, 1, temperature[0], false);
lc.setChar(1, 2, temperature[1], false);
lc.setChar(1, 3, temperature[2], false);
lc.setChar(1, 4, 'C', false); // Grados Celsius
} else {
Serial.println("Checksum invalid!");
}
}
}
void setup() {
Serial.begin(9600);
lc.shutdown(0, false);
lc.setIntensity(0, 8);
lc.clearDisplay(0);
}
void loop() {
serialEvent(); // Verificar si hay nuevos datos
Display(); // Actualizar el display
}