#include <WiFi.h>
#include <WiFiUdp.h>
#include <NTPClient.h>
#include <Adafruit_NeoPixel.h>
#define NUMPIXELS 110
#define LEDPIN 21
#define MINUTELEDPIN 22
#define RED 30
#define GREEN 23
#define BLUE 230
const char* ssid = "Wokwi-GUEST";
const char* password = "";
WiFiUDP ntpUDP;
const long utcOffsetInSeconds = 7200; // Korrektur für Zeitzone
NTPClient timeClient(ntpUDP, "pool.ntp.org", utcOffsetInSeconds, 60000);
Adafruit_NeoPixel LEDQlockTwo = Adafruit_NeoPixel(NUMPIXELS, LEDPIN, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel MinuteLEDS = Adafruit_NeoPixel(4, MINUTELEDPIN, NEO_GRB + NEO_KHZ800);
const int ledMap[10][11] = {
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
{21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11},
{22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32},
{43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33},
{44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54},
{65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55},
{66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76},
{87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77},
{88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98},
{109, 108, 107, 106, 105, 104, 103, 102, 101, 100, 99}
};
const int minuteLedMap[4] = {0, 1, 3, 2};
int currentHour = 0;
int currentMinute = 0;
// Funktion um alle Pixel zu leeren
void clearAllPixels() {
for (int i = 0; i < NUMPIXELS; i++) {
LEDQlockTwo.setPixelColor(i, LEDQlockTwo.Color(0, 0, 0));
}
LEDQlockTwo.show();
}
// Funktion um einzelne Wörter aufleuchten zu lassen
void lightUpWord(int row, int startCol, int length) {
for (int i = 0; i < length; i++) {
LEDQlockTwo.setPixelColor(ledMap[row][startCol + i], LEDQlockTwo.Color(RED, GREEN, BLUE)); // Farbe anpassen
}
}
void singleMinutes(int minute) {
int onesPlace = minute % 10;
// Überprüfe den Wert der Einerstelle
if (onesPlace >= 1 && onesPlace <= 4) {
for(int i = 0; i < onesPlace; i++){ // MinutenLEDS je nach Einerstelle angesteuert
MinuteLEDS.setPixelColor(minuteLedMap[i], MinuteLEDS.Color(RED, GREEN, BLUE));
}
MinuteLEDS.show();
}
else if (onesPlace >= 6 && onesPlace <= 9) {
for(int i = 0; i < onesPlace; i++){ // MinutenLEDS je nach Einerstelle angesteuert
MinuteLEDS.setPixelColor(minuteLedMap[i-5], MinuteLEDS.Color(RED, GREEN, BLUE));
}
MinuteLEDS.show();
}
else{
for(int i = 0; i < 4; i++){
MinuteLEDS.setPixelColor(i, MinuteLEDS.Color(0, 0, 0));
}
MinuteLEDS.show();
}
}
void displayTime(int hour, int minute) {
clearAllPixels();
// Immer leuchtende Wörter
lightUpWord(0, 0, 2); // "ES"
lightUpWord(0, 3, 3); // "IST"
// Zeitanzeige
if (minute >= 5 && minute < 10) {
lightUpWord(0, 7, 4); // "FÜNF"
lightUpWord(3, 7, 4); // "NACH"
} else if (minute >= 10 && minute < 15) {
lightUpWord(1, 0, 4); // "ZEHN"
lightUpWord(3, 7, 4); // "NACH"
} else if (minute >= 15 && minute < 20) {
lightUpWord(2, 4, 7); // "VIERTEL"
lightUpWord(3, 7, 4); // "NACH"
} else if (minute >= 20 && minute < 25) {
lightUpWord(1, 4, 7); // "ZWANZIG"
lightUpWord(3, 7, 4); // "NACH"
} else if (minute >= 25 && minute < 30) {
lightUpWord(0, 7, 4); // "FÜNF"
lightUpWord(3, 0, 3); // "VOR"
lightUpWord(4, 0, 4); // "HALB"
hour++;
} else if (minute >= 30 && minute < 35) {
lightUpWord(4, 0, 4); // "HALB"
hour++;
} else if (minute >= 35 && minute < 40) {
lightUpWord(0, 7, 4); // "FÜNF"
lightUpWord(3, 7, 4); // "NACH"
lightUpWord(4, 0, 4); // "HALB"
hour++;
} else if (minute >= 40 && minute < 45) {
lightUpWord(1, 4, 7); // "ZWANZIG"
lightUpWord(3, 0, 3); // "VOR"
hour++;
} else if (minute >= 45 && minute < 50) {
lightUpWord(2, 4, 7); // "VIERTEL"
lightUpWord(3, 0, 3); // "VOR"
hour++;
} else if (minute >= 50 && minute < 55) {
lightUpWord(1, 0, 4); // "ZEHN"
lightUpWord(3, 0, 3); // "VOR"
hour++;
} else if (minute >= 55 && minute <=59) {
lightUpWord(0, 7, 4); // "FÜNF"
lightUpWord(3, 0, 3); // "VOR"
hour++;
}
singleMinutes(minute); // Steuert die Minuten LEDS an, z.B. bei 5.04 Uhr leuchten alle 4 weitere LEDS
// Stunden
switch (hour) {
case 0: lightUpWord(8, 6, 5); break; // "ZWÖLF"
case 1: lightUpWord(5, 0, 3); break; // "EIN"
case 2: lightUpWord(5, 7, 4); break; // "ZWEI"
case 3: lightUpWord(6, 0, 4); break; // "DREI"
case 4: lightUpWord(6, 7, 4); break; // "VIER"
case 5: lightUpWord(4, 7, 4); break; // "FÜNF"
case 6: lightUpWord(7, 0, 5); break; // "SECHS"
case 7: lightUpWord(8, 0, 6); break; // "SIEBEN"
case 8: lightUpWord(7, 7, 4); break; // "ACHT"
case 9: lightUpWord(9, 3, 4); break; // "NEUN"
case 10: lightUpWord(9, 0, 4); break; // "ZEHN"
case 11: lightUpWord(4, 5, 3); break; // "ELF"
case 12: lightUpWord(8, 6, 5); break; // "ZWÖLF"
case 13: lightUpWord(6, 0, 4); lightUpWord(9, 0, 4); break; // "DREI ZEHN"
case 14: lightUpWord(6, 7, 4); lightUpWord(9, 0, 4); break; // "VIER ZEHN"
case 15: lightUpWord(4, 7, 4); lightUpWord(9, 0, 4); break; // "FÜNF ZEHN"
case 16: lightUpWord(7, 0, 4); lightUpWord(9, 0, 4); break; // "SECH ZEHN"
case 17: lightUpWord(8, 0, 4); lightUpWord(9, 0, 4); break; // "SIEB ZEHN"
case 18: lightUpWord(7, 7, 4); lightUpWord(9, 0, 4); break; // "ACHT ZEHN"
case 19: lightUpWord(8, 0, 6); break; // "SIEBEN"
case 20: lightUpWord(7, 7, 4); break; // "ACHT"
case 21: lightUpWord(9, 3, 4); break; // "NEUN"
case 22: lightUpWord(9, 0, 4); break; // "ZEHN"
case 23: lightUpWord(4, 5, 3); break; // "ELF"
case 24: lightUpWord(8, 6, 5); break; // "ZWÖLF" - Wird für Ausnahmefälle, wie 23.30 Uhr gebraucht
}
// "UHR" nur anzeigen, wenn Minute == 0
if (minute < 5) {
lightUpWord(9, 8, 3); // "UHR"
}
LEDQlockTwo.show();
}
// DEBUGGING
void inputTime() {
Serial.println("Bitte geben Sie die Stunde ein (0-23): ");
while (Serial.available() == 0) {} // Warten auf Eingabe
currentHour = Serial.parseInt();
Serial.println("Bitte geben Sie die Minute ein (0-59): ");
while (Serial.available() == 0) {} // Warten auf Eingabe
currentMinute = Serial.parseInt();
Serial.printf("Eingegebene Uhrzeit: %02d:%02d\n", currentHour, currentMinute);
}
// DEBUGGING
void setup() {
Serial.begin(115200);
LEDQlockTwo.begin();
LEDQlockTwo.setBrightness(255);
MinuteLEDS.begin();
MinuteLEDS.setBrightness(255);
WiFi.begin(ssid, password);
// WLAN verbindet
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected.");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
timeClient.begin();
}
int previousMinute;
void loop() {
timeClient.update();
int currentHour = timeClient.getHours();
int currentMinute = timeClient.getMinutes();
if(previousMinute != currentMinute){
displayTime(currentHour, currentMinute);
previousMinute = currentMinute;
}
delay(1000); // Update jede Sekunde
}
// Animation
void startUpAnimation(int num){
switch (num)
{
case 1:
for(int x; x<NUMPIXELS; x++){
LEDQlockTwo.setPixelColor(x, LEDQlockTwo.Color(RED, GREEN, BLUE)); // Farbe anpassen
LEDQlockTwo.show();
delay(5);
}
for (int i= NUMPIXELS; i >= 0 ; i--)
{
LEDQlockTwo.setPixelColor(i, LEDQlockTwo.Color(0, 0, 0)); // Farbe anpassen
LEDQlockTwo.show();
delay(5);
}
break;
case 2: break;
}
}