#define SECONDS 5
#include <RTClib.h>
int pin_a = 2;
int pin_b = 3;
int pin_c = 4;
int pin_d = 5;
int pin_e = 6;
int pin_f = 7;
int pin_g = 8;
int pin_colon = 9;
int pins[] = {pin_a, pin_b, pin_c, pin_d, pin_e, pin_f, pin_g};
int pin_digit0 = 10;
int pin_digit1 = 11;
int pin_digit2 = 12;
int pin_digit3 = 13;
int pins_digits[] = {pin_digit0, pin_digit1, pin_digit2, pin_digit3};
int time_digits[] = {0, 0, 0, 0, 0, 0};
int position = 0;
RTC_DS1307 rtc;
void setup() {
for (int i = 0; i < 7; i++) {
pinMode(pins[i], OUTPUT);
digitalWrite(pins[i], LOW);
}
pinMode(pin_colon, OUTPUT);
digitalWrite(pin_colon, LOW);
for (int i = 0; i < 4; i++) {
pinMode(pins_digits[i], OUTPUT);
digitalWrite(pins_digits[i], LOW);
}
Serial.begin(9600);
rtc.begin();
}
void loop() {
DateTime now = rtc.now();
time_digits[0] = now.hour() / 10;
time_digits[1] = now.hour() % 10;
time_digits[2] = now.minute() / 10;
time_digits[3] = now.minute() % 10;
time_digits[4] = now.second() / 10;
time_digits[5] = now.second() % 10;
display();
delay(10);
}
const boolean pin_states[10][7] = {
{true, true, true, true, true, true, false}, //'0'
{false, true, true, false, false, false, false}, //'1'
{true, true, false, true, true, false, true}, //'2'
{true, true, true, true, false, false, true}, //'3'
{false, true, true, false, false, true, true}, //'4'
{true, false, true, true, false, true, true}, //'5'
{true, false, true, true, true, true, true}, //'6'
{true, true, true, false, false, false, false}, //'7'
{true, true, true, true, true, true, true}, //'8'
{true, true, true, true, false, true, true} //'9'
};
void display() {
// deactivate active position
digitalWrite(pins_digits[position], LOW);
// every loop, another position is drawn independently
position = (position + 1) % 4;
int value = time_digits[position];
for (int i = 0; i < 7; i++) {
// activate correct segments
digitalWrite(pins[i], pin_states[value][i] ? LOW : HIGH);
}
digitalWrite(pins_digits[position], HIGH);
digitalWrite(pin_colon, time_digits[5] % 2 == 0 ? HIGH : LOW);
}