/*
7 Segment RTC Clock
5/10/2026
Written for common cathode
In a real circuit use transistor drivers on the digit pins.
*/
#include "RTClib.h"
const int SEG_PINS[] = {11, 12, 10, 7, 8, 13, 6, 9};
const int DIG_PINS[] = {A0, A1, 2, 3, 4, 5};
const bool DIGITS[][8] = {
// A B C D E F G DP
{1, 1, 1, 1, 1, 1, 0, 0}, // 0
{0, 1, 1, 0, 0, 0, 0, 0}, // 1
{1, 1, 0, 1, 1, 0, 1, 0}, // 2
{1, 1, 1, 1, 0, 0, 1, 0}, // 3
{0, 1, 1, 0, 0, 1, 1, 0}, // 4
{1, 0, 1, 1, 0, 1, 1, 0}, // 5
{1, 0, 1, 1, 1, 1, 1, 0}, // 6
{1, 1, 1, 0, 0, 0, 0, 0}, // 7
{1, 1, 1, 1, 1, 1, 1, 0}, // 8
{1, 1, 1, 1, 0, 1, 1, 0}, // 9
{0, 0, 0, 0, 0, 0, 0, 0} // blank
};
const unsigned long ONE_SEC = 1000;
int hour = 0;
int minute = 0;
int second = 0;
unsigned long prevTime = 0;
RTC_DS1307 rtc;
void writeDigit(int digit, int value) {
for (int i = 0; i < 8; i++) {
digitalWrite(SEG_PINS[i], DIGITS[value][i]);
}
digitalWrite(DIG_PINS[digit], LOW);
digitalWrite(DIG_PINS[digit], HIGH);
}
void setup() {
Serial.begin(115200);
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
while (true) {};
}
for (int i = 0; i < 8; i++) {
pinMode(SEG_PINS[i], OUTPUT);
}
for (int i = 0; i < 6; i++) {
pinMode(DIG_PINS[i], OUTPUT);
digitalWrite(DIG_PINS[i], HIGH);
}
}
void loop() {
char buffer[12];
if (millis() - prevTime >= ONE_SEC) {
DateTime now = rtc.now();
hour = now.hour();
minute = now.minute();
second = now.second();
snprintf(buffer, 12, "%2d:%02d:%02d", hour, minute, second);
Serial.println(buffer);
prevTime = millis();
}
if (hour / 10 == 0) {
writeDigit(0, 10); // blank
} else {
writeDigit(0, hour / 10);
}
writeDigit(1, hour % 10);
writeDigit(2, minute / 10);
writeDigit(3, minute % 10);
writeDigit(4, second / 10);
writeDigit(5, second % 10);
}