#include <Wire.h>
#include <RTClib.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Adafruit_NeoPixel.h>
#define PIN_LED_DATA 7
#define NUM_LEDS 154
#define PIN_BUTTON_MINUTES A0
#define PIN_BUTTON_HOURS A1
#define PIN_TEMP_SENSOR 8
#define PIN_RTC_SDA 20
#define PIN_RTC_SCL 21
RTC_DS1307 rtc;
OneWire oneWire(PIN_TEMP_SENSOR);
DallasTemperature sensors(&oneWire);
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN_LED_DATA, NEO_GRB + NEO_KHZ800);
int digitAddresses[4][10][4] = {
// Digit 1
{
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 14, 22, 23, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37 },
{9, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 28 },
{0, 1, 6, 7, 8, 9, 12, 13, 14, 18, 22, 23, 25, 28, 29, 30, 31 },
{0, 1, 7, 8, 9, 13, 14, 22, 23, 26, 28, 29, 30, 31, 32, 34, 35, 36, 37 },
{4, 5, 10, 12, 16, 19, 24, 27, 29, 30, 31, 32, 33, 34, 35, 36, 37 },
{0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 13, 14, 17, 22, 23, 25, 28, 29, 33, 34, 35, 36 },
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 13, 14, 18, 22, 23, 26, 28, 29, 33, 34, 35, 36, 37 },
{0, 9, 14, 23, 29, 30, 31, 32, 33, 34, 35, 36, 37 },
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 13, 14, 18, 22, 23, 26, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37 },
{0, 1, 2, 3, 4, 8, 9, 11, 13, 14, 18, 22, 23, 26, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37 }
},
// Digit 2
{
{38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 51, 52, 60, 61, 66, 67, 68, 69, 70, 71, 72, 73, 74, 65 },
{47, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60 },
{38, 39, 44, 45, 46, 47, 50, 51, 52, 56, 60, 61, 63, 66, 67, 68, 69, 75 },
{38, 39, 45, 46, 47, 51, 52, 60, 61, 64, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75 },
{42, 43, 48, 50, 54, 57, 62, 65, 67, 68, 69, 70, 71, 72, 73, 74, 75 },
{38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 51, 52, 55, 60, 61, 63, 66, 67, 71, 72, 73, 74 },
{38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 49, 51, 52, 56, 60, 61, 64, 66, 67, 71, 72, 73, 74, 75 },
{38, 47, 52, 61, 67, 68, 69, 70, 71, 72, 73, 74, 75 },
{38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 49, 51, 52, 56, 60, 61, 64, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75 },
{38, 39, 40, 41, 42, 46, 47, 49, 51, 52, 56, 60, 61, 64, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75 }
},
// Digit 3
{
{76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 89, 90, 98, 99, 104, 105, 106, 107, 108, 109, 110, 111, 112, 103 },
{85, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 104 },
{76, 77, 82, 83, 84, 85, 88, 89, 90, 94, 98, 99, 101, 104, 105, 106, 107 },
{76, 77, 82, 83, 84, 89, 90, 98, 99, 102, 104, 105, 106, 107, 108, 110, 111, 112, 113 },
{79, 80, 85, 88, 92, 95, 100, 103, 105, 106, 107, 108, 109, 110, 111, 112, 113 },
{76, 77, 78, 79, 80, 82, 83, 84, 85, 10, 89, 90, 93, 98, 99, 101, 104, 105, 109, 110, 111, 112 },
{76, 85, 90, 99, 105, 106, 107, 108, 109, 110, 111, 112, 113 },
{76, 85, 90, 99, 105, 106, 107, 108, 109, 110, 111, 112, 113 },
{76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 87, 89, 90, 94, 98, 99, 102, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113 },
{76, 77, 78, 79, 80, 84, 85, 87, 89, 90, 94, 98, 99, 102, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113 }
},
// Digit 4
{
{114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 142, 143, 144, 145, 146, 147, 148, 149, 150, 141 },
{123, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 142 },
{114, 115, 120, 121, 122, 123, 126, 127, 128, 132, 136, 137, 139, 142, 143, 144, 145 },
{114, 115, 121, 122, 123, 127, 128, 136, 137, 140, 142, 143, 144, 145, 146, 148, 149, 150, 151 },
{118, 119, 124, 126, 130, 133, 138, 141, 143, 144, 145, 146, 147, 148, 149, 150, 151 },
{114, 115, 116, 117, 118, 120, 121, 122, 123, 139, 142, 143, 147, 148, 149, 150 },
{114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 125, 127, 128, 132, 136, 137, 140, 142, 143, 147, 148, 149, 150, 151 },
{114, 123, 128, 137, 143, 144, 145, 146, 147, 148, 149, 150, 151 },
{114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 125, 127, 128, 132, 136, 137, 140, 142, 143, 147, 148, 149, 150, 151 },
{114, 115, 116, 117, 118, 122, 123, 125, 127, 128, 132, 136, 137, 140, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151 }
}
};
void setup() {
Serial.begin(9600);
pinMode(PIN_BUTTON_MINUTES, INPUT);
pinMode(PIN_BUTTON_HOURS, INPUT);
Wire.begin();
rtc.begin();
if (!rtc.isrunning()) {
Serial.println("RTC is NOT running!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
sensors.begin();
strip.begin();
strip.show(); // Initialize all pixels to 'off'
}
void loop() {
DateTime now = rtc.now();
int currentMinute = now.minute();
int currentHour = now.hour();
int currentSecond = now.second();
// Display time for 45 seconds
for (int i = 0; i < 45; i++) {
displayTime(currentMinute, currentHour, currentSecond);
delay(1000);
currentSecond = (currentSecond + 1) % 60;
}
// Display temperature for 8 seconds
for (int i = 0; i < 8; i++) {
displayTemperature();
delay(1000);
}
}
void displayTime(int minute, int hour, int second) {
// Clear display
strip.clear();
// Display minutes
displayDigit(minute % 10, 0);
displayDigit(minute / 10, 1);
// Display hours
displayDigit(hour % 10, 2);
displayDigit(hour / 10, 3);
// Flash seconds LEDs
if (second % 2 == 0) {
strip.setPixelColor(152, strip.Color(255, 0, 0)); // LED 152 ON
strip.setPixelColor(153, strip.Color(255, 0, 0)); // LED 153 ON
} else {
strip.setPixelColor(152, strip.Color(0, 0, 0)); // LED 152 OFF
strip.setPixelColor(153, strip.Color(0, 0, 0)); // LED 153 OFF
}
strip.show();
}
void displayTemperature() {
// Clear display
strip.clear();
// Turn on temperature display LEDs
strip.setPixelColor(35, strip.Color(0, 255, 0)); // LED 35 ON
strip.setPixelColor(36, strip.Color(0, 255, 0)); // LED