#include <RTClib.h>
#include <Wire.h>
// Define pins for each LED column
const int leds[][4] = {
{22, 23}, // Hours, 2 LEDs
{24, 25, 26, 27}, // Hours, 4 LEDs
{28, 29, 30}, // Minutes, 3 LEDs
{31, 32, 33, 34}, // Minutes, 4 LEDs
{35, 36, 37}, // Seconds, 3 LEDs
{38, 39, 40, 41} // Seconds, 4 LEDs
};
// Define pins for BCD input (4 bits for hours, 6 bits for minutes, and 6 bits for seconds)
const int hourPins[] = {22, 23, 24, 25};
const int minutePins[] = {26, 27, 28, 29, 30, 31};
const int secondPins[] = {32, 33, 34, 35, 36, 37};
void setup() {
// Set LED pins as OUTPUT
for (int i = 0; i < 6; i++) {
for (int j = 0; j < sizeof(leds[0]) / sizeof(leds[0][0]); j++) {
pinMode(leds[i][j], OUTPUT);
}
}
// Set BCD input pins as INPUT
for (int i = 0; i < 4; i++) {
pinMode(hourPins[i], INPUT);
}
for (int i = 0; i < 6; i++) {
pinMode(minutePins[i], INPUT);
pinMode(secondPins[i], INPUT);
}
// Initialize Serial communication
Serial.begin(9600);
}
void loop() {
// Read BCD values for hours, minutes, and seconds
int hours = readBCD(hourPins);
int minutes = readBCD(minutePins);
int seconds = readBCD(secondPins);
// Display BCD values on LEDs
displayBCD(hours, 0, 2); // Display hours using the first column (2 LEDs)
displayBCD(hours, 2, 4); // Display hours using the second column (4 LEDs)
delay(1000); // Wait for 1 second
displayBCD(minutes, 4, 3); // Display minutes using the third column (3 LEDs)
displayBCD(minutes, 7, 4); // Display minutes using the fourth column (4 LEDs)
delay(1000); // Wait for 1 second
displayBCD(seconds, 10, 3); // Display seconds using the fifth column (3 LEDs)
displayBCD(seconds, 13, 4); // Display seconds using the sixth column (4 LEDs)
delay(1000); // Wait for 1 second
// Print the time to the Serial Monitor
Serial.print("Time: ");
Serial.print(hours);
Serial.print(":");
if (minutes < 10) {
Serial.print("0");
}
Serial.print(minutes);
Serial.print(":");
if (seconds < 10) {
Serial.print("0");
}
Serial.println(seconds);
}
int readBCD(const int pins[]) {
int value = 0;
for (int i = 0; i < sizeof(pins) / sizeof(pins[0]); i++) {
value |= digitalRead(pins[i]) << i;
}
return value;
}
void displayBCD(int value, int startLED, int numLEDs) {
// Display BCD value on LEDs
for (int i = 0; i < numLEDs; i++) {
digitalWrite(leds[startLED][i], (value >> (3 - i)) & 0x01); // Adjusted for row-wise binary representation
}
}