#include <Wire.h>
#include <RTClib.h>
RTC_DS1307 rtc;
// Segment pins (A-G, DP)
const uint8_t segPins[8] = {13, 12, 14, 27, 26, 25, 33, 32};
// Digit selection pins (common cathode)
const uint8_t digitPins[6] = {19, 18, 5, 17, 16, 4};
// Standard 7-segment patterns (0-9, DP off)
const byte digitPattern[10] = {
B00111111, // 0
B00000110, // 1
B01011011, // 2
B01001111, // 3
B01100110, // 4
B01101101, // 5
B01111101, // 6
B00000111, // 7
B01111111, // 8
B01101111 // 9
};
void setup() {
// Initialize segment pins
for (int i = 0; i < 8; i++) {
pinMode(segPins[i], OUTPUT);
digitalWrite(segPins[i], LOW);
}
// Initialize digit pins
for (int i = 0; i < 6; i++) {
pinMode(digitPins[i], OUTPUT);
digitalWrite(digitPins[i], HIGH); // Off by default
}
// Initialize RTC
Wire.begin();
if (!rtc.begin()) {
while (1); // Halt if RTC not found
}
if (!rtc.isrunning()) {
// Set to compile time if RTC not running
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
Serial.begin(115200);
}
void displayDigit(uint8_t digit, uint8_t value) {
// Turn off all digits first
for (int i = 0; i < 6; i++) {
digitalWrite(digitPins[i], HIGH);
}
// Set segments
byte pattern = digitPattern[value];
for (int i = 0; i < 8; i++) {
digitalWrite(segPins[i], bitRead(pattern, i));
}
// Activate current digit (common cathode)
digitalWrite(digitPins[digit], LOW);
}
void loop() {
static uint32_t lastUpdate = 0;
static uint8_t digits[6] = {0};
// Update time every second
if (millis() - lastUpdate >= 1000) {
DateTime now = rtc.now();
digits[0] = now.hour() / 10; // Hour tens
digits[1] = now.hour() % 10; // Hour ones
digits[2] = now.minute() / 10; // Minute tens
digits[3] = now.minute() % 10; // Minute ones
digits[4] = now.second() / 10; // Second tens
digits[5] = now.second() % 10; // Second ones
lastUpdate = millis();
// Serial debug output
Serial.printf("Time: %02d:%02d:%02d\n",
now.hour(), now.minute(), now.second());
}
// Display multiplexing (2ms per digit)
for (int i = 0; i < 6; i++) {
displayDigit(i, digits[i]);
delay(2);
}
}