#include "RTClib.h"
const int dataPin = 12; // DS
const int latchPin = 11; // ST_CP
const int clockPin = 13; // SH_CP
const int amPin = 10; // LED green for AM
const int pmPin = 9; // LED red for PM
const int dataPin2 = 8; // DS do 5º 74HC595 (para o dia da semana)
const int latchPin2 = 7; // ST_CP do 5º 74HC595
const int clockPin2 = 6; // SH_CP do 5º 74HC595
// Segment table for numbers 0-9 (common cathode)
const byte digits[10] = {
B00111111, // 0
B00000110, // 1
B01011011, // 2
B01001111, // 3
B01100110, // 4
B01101101, // 5
B01111101, // 6
B00000111, // 7
B01111111, // 8
B01101111 // 9
};
RTC_DS1307 rtc;
void setup() {
pinMode(dataPin, OUTPUT);
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin2, OUTPUT); // Para o 5º 74HC595 (dia da semana)
pinMode(latchPin2, OUTPUT);
pinMode(clockPin2, OUTPUT);
Serial.begin(9600);
if (!rtc.begin()) {
Serial.println("Could not find RTC");
while (1);
}
pinMode(amPin, OUTPUT); // LED AM
pinMode(pmPin, OUTPUT); // LED PM
}
void loop() {
DateTime now = rtc.now(); // Gets the current time from the RTC
// Convert to 12h format
int hour = now.hour();
int minute = now.minute();
bool isPM = false;
// Check if it's PM
if (hour >= 12) {
isPM = true;
if (hour > 12) hour -= 12; // Convert to 12h format
}
// For 12h format, if the time is 0, we consider it as 12 AM (midnight)
if (hour == 0) {
hour = 12;
}
// Exibe o dia da semana com LEDs
displayDayOfWeek(now.dayOfTheWeek());
// Displays in hh:mm format (hours and minutes)
displayNumber(hour, minute);
// Turn on the AM or PM LED
if (isPM) {
digitalWrite(pmPin, HIGH); // Red LED lights up for PM
digitalWrite(amPin, LOW); // Turn off green LED for AM
} else {
digitalWrite(amPin, HIGH); // Green LED lights up for AM
digitalWrite(pmPin, LOW); // Turn off red LED for PM
}
delay(1000); // Updates every 1 second
}
void displayNumber(int hours, int minutes) {
byte displayBuffer[4];
// Extracts the digits from the hours and minutes
displayBuffer[0] = digits[(hours / 10) % 10]; // First hour house
displayBuffer[1] = digits[hours % 10]; // Second hour house
displayBuffer[2] = digits[(minutes / 10) % 10]; // First minute house
displayBuffer[3] = digits[minutes % 10]; // Second minute house
digitalWrite(latchPin, LOW);
// Sends to the 4 ICs (displays)
for (int i = 0; i < 4; i++) {
shiftOut(dataPin, clockPin, MSBFIRST, displayBuffer[i]);
}
digitalWrite(latchPin, HIGH);
}
void displayDayOfWeek(int day) {
// Mapeia os dias da semana para LEDs (0 = Domingo, 1 = Segunda, etc)
byte dayOfWeek = 1 << day; // Cria um byte onde o bit correspondente ao dia é 1 (ex: 1<<0 para Domingo, 1<<1 para Segunda, etc)
digitalWrite(latchPin2, LOW);
// Envia para o 74HC595 (dias da semana)
shiftOut(dataPin2, clockPin2, MSBFIRST, dayOfWeek);
digitalWrite(latchPin2, HIGH);
}
AM/PM
WEEK DAY