#include <SPI.h>
#include <RTClib.h>
RTC_DS1307 miRTC;
// Pines asignados para el protocolo SPI
const int CS_PIN = 10;
const int MOSI_PIN = 11;
const int MISO_PIN = 13;
const int SCK_PIN = 12;
// Registros de la matriz LED MAX7219
#define MAX7219_REG_NOOP 0x00
#define MAX7219_REG_DIGIT0 0x01
#define MAX7219_REG_DIGIT1 0x02
#define MAX7219_REG_DIGIT2 0x03
#define MAX7219_REG_DIGIT3 0x04
#define MAX7219_REG_DIGIT4 0x05
#define MAX7219_REG_DIGIT5 0x06
#define MAX7219_REG_DIGIT6 0x07
#define MAX7219_REG_DIGIT7 0x08
#define MAX7219_REG_DECODEMODE 0x09
#define MAX7219_REG_INTENSITY 0x0A
#define MAX7219_REG_SCANLIMIT 0x0B
#define MAX7219_REG_SHUTDOWN 0x0C
#define MAX7219_REG_DISPLAYTEST 0x0F
#define BOTONminutos
#define BOTONsegundos
#define BOTON_RTC
uint8_t numero[7] = {0b0111, 0b1000, 0b1000, 0b0110, 0b1000, 0b1000, 0b0111};
uint8_t digitos[10][7] = {
{0b0110, 0b1001, 0b1001, 0b1001, 0b1001, 0b1001, 0b0110}, //digito 0
{0b0010, 0b0011, 0b0010, 0b0010, 0b0010, 0b0010, 0b0111}, //digito 1
{0b0110, 0b1001, 0b1000, 0b0100, 0b0010, 0b0001, 0b1111}, //digito 2
{0b0110, 0b1001, 0b1000, 0b0110, 0b1000, 0b1001, 0b0110}, //digito 3
{0b0100, 0b0110, 0b0101, 0b0101, 0b1111, 0b0100, 0b0100}, //digito 4
{0b1111, 0b0001, 0b0001, 0b0111, 0b1000, 0b1000, 0b0111}, //digito 5
{0b0110, 0b1001, 0b0001, 0b0111, 0b1001, 0b1001, 0b0110}, //digito 6
{0b1111, 0b1000, 0b0100, 0b0010, 0b0010, 0b0010, 0b0010}, //digito 7
{0b0110, 0b1001, 0b1001, 0b0110, 0b1001, 0b1001, 0b0110}, //digito 8
{0b0110, 0b1001, 0b1001, 0b1110, 0b1000, 0b1001, 0b0110}, //digito 9
};
int minutos,segundos;
void setup() {
// Configurar pines SPI
SPI.begin(SCK_PIN, MISO_PIN, MOSI_PIN, CS_PIN);
// Configurar el pin CS
pinMode(CS_PIN, OUTPUT); // Asegurarse que el pin CS esté configurado como salida
pinMode(BOTONminutos,INPUT_PULLUP);
pinMode(BOTONsegundos, INPUT_PULLUP);
pinMode(BOTON_RTC, INPUT_PULLUP);
digitalWrite(CS_PIN, HIGH); // Desactivar el chip select
// Inicializar el MAX7219
sendToMax7219(MAX7219_REG_SCANLIMIT, 0x07); // Usar todos los dígitos (0-7)
sendToMax7219(MAX7219_REG_DECODEMODE, 0x00); // Sin decodificación BCD
sendToMax7219(MAX7219_REG_SHUTDOWN, 0x01); // Salir del modo shutdown
sendToMax7219(MAX7219_REG_INTENSITY, 0x0F); // Máxima intensidad (0x00 a 0x0F)
//Para el RTC
miRTC.begin();
miRTC.adjust(DateTime(2024, 10, 6, 9, minutos, segundos));
minutos=0;
segundos=0;
}
void loop() {
// Leemos la fecha y hora
DateTime now = miRTC.now();
//Sumamos 1 a los minutos
if(digitalRead(BOTONminutos)==LOW){
while(digitalRead(BOTONminutos)==LOW);
for(int i=0; i<7; i++) {
sendToMax7219_5M4(i+1, digitos[minutos][i]<<4 | digitos[0][i], digitos[0][i]<<4 | digitos[0][i]);
}
minutos++;
}
if(digitalRead(BOTONsegundos)==LOW){
while(digitalRead(BOTONsegundos)==LOW);
for(int i=0; i<7; i++) {
sendToMax7219_5M4(i+1, digitos[0][i]<<4 | digitos[0][i], digitos[segundos][i]<<4 | digitos[0][i]);
}
segundos++;
}
if(digitalRead(BOTON_RTC)==LOW){
delay(5);
//mostramos en pantalla
for(int i=0; i<7; i++) {
//sendToMax7219(i+1, numero[i]<<4 | numero[i]);
sendToMax7219_5M4(i+1, digitos[minutos][i]<<4 | digitos[3][i], digitos[segundos][i]<<4 | digitos[2][i]);
}
}
// Imprimimos la hora actual
Serial.printf("Hora actual: %02d:%02d:%02d\n", now.hour(), now.minute(), now.second());
// Retardo de 1s
delay(1000);
}
// Función para enviar datos al MAX7219 por protocolo PSI
void sendToMax7219(uint8_t reg, uint8_t data) {
digitalWrite(CS_PIN, LOW); // Seleccionar el dispositivo (CS bajo)
SPI.transfer(reg); // Enviar fila
SPI.transfer(data); // Enviar dato
digitalWrite(CS_PIN, HIGH); // Deseleccionar el dispositivo (CS alto)
}
// Función para enviar datos al MAX7219 por protocolo PSI
void sendToMax7219_5M4(uint8_t reg, uint8_t data, uint8_t data2){
digitalWrite(CS_PIN, LOW); // Seleccionar el dispositivo (CS bajo)
SPI.transfer(reg); // Enviar fila
SPI.transfer(data); // Enviar dato
SPI.transfer(reg); // Enviar fila
SPI.transfer(data2); // Enviar dato
digitalWrite(CS_PIN, HIGH); // Deseleccionar el dispositivo (CS alto)
}