#include <LedControl.h>
// Definiciones para el display matricial
#define DATA_IN 2 // Pin de entrada de datos (DIN)
#define CLK_PIN 3 // Pin de reloj (CLK)
#define CS_PIN 4 // Pin de selección de chip (CS)
#define MAX_DEVICES 4 // Número de módulos en cascada
// Crear objeto display
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;
for (int i = 1; data[i] != '<' && data[i] != '\0'; 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();
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 display
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);
// Depuración en el puerto serie
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(checksum);
// Validar checksum
uint8_t calculatedChecksum = calculateChecksum(receivedData);
Serial.print("Checksum calculated: "); Serial.println(calculatedChecksum);
if (checksum == calculatedChecksum) {
Serial.println("Checksum valid!");
// Limpiar el display
for (int i = 0; i < MAX_DEVICES; i++) {
lc.clearDisplay(i);
}
// Mostrar la hora
lc.setChar(0, 0, hour[0], false); // Primera cifra de la hora
lc.setChar(0, 1, hour[1], false); // Segunda cifra de la hora
lc.setChar(0, 2, ':', false); // Separador de hora
lc.setChar(0, 3, minute[0], false); // Primera cifra de los minutos
lc.setChar(0, 4, minute[1], false); // Segunda cifra de los minutos
// Mostrar la temperatura
lc.setChar(1, 0, temperature[0], false); // Primera cifra de la temperatura
lc.setChar(1, 1, temperature[1], false); // Segunda cifra de la temperatura
lc.setChar(1, 2, '.', false); // Punto decimal
lc.setChar(1, 3, temperature[2], false); // Decimal de la temperatura
lc.setChar(1, 4, 'C', false); // Símbolo de grados Celsius
} else {
Serial.println("Checksum invalid!");
}
}
}
// Función principal
void setup() {
Serial.begin(9600);
Serial.println("Iniciando...");
// Inicializar el display
for (int i = 0; i < MAX_DEVICES; i++) {
lc.shutdown(i, false); // Salir del modo de ahorro de energía
lc.setIntensity(i, 8); // Ajustar el brillo a un nivel medio
lc.clearDisplay(i); // Limpiar el display
}
}
void loop() {
serialEvent(); // Verificar si hay nuevos datos
Display(); // Actualizar el display
delay(1); // Esperar 1 ms
}