/* __________________________________________________________________________ Mini Word Clock with WS2812-B 144 LEDs/m LED-Stripe(s) the "brain" is a Wemos D1 mini Made by joergeli 23.02.2022 http://arduino.joergeli.de ######################################################### Compiled with Arduino-IDE 1.8.10 and esp8266 core V2.7.1 ######################################################### Features: # Word-Clock shows the time every 5 miutes in words (German) # Time is fetched via NTP # Every 5th minute all LEDs fade to the next time string # Every minute additionally one of 4 single LEDs lights up # The color of the LEDs changes at every full hour # A "Cylon"-animation (=color-animation) is performed every full hour # Automatic changing of daylight-saving # Wifi manager is included, so it's easy to connect the Mini-WordClock to WiFi # Any changes can be programmed via OTA ( = Over The Air via WiFi) # Housing can be completely printed out with a 3D printer __________________________________________________________________________ */ #include // https://github.com/tzapu/WiFiManager #include // we need wifi to get internet access #include // time() ctime() #include // for flashing over WLAN ( OTA = Over The Air) #define FASTLED_ALLOW_INTERRUPTS 0 // reduces flickering #include #define LED_PIN 12 // = D6 to LED-Stripe DataIn #define LED_TYPE WS2812 #define NUM_LEDS 139 // 0-138 #define COLOR_ORDER GRB CRGB leds[NUM_LEDS]; // for WiFi Intro #define TEMPERATURE_1 Tungsten100W #define TEMPERATURE_2 OvercastSky #define DISPLAYTIME 1 #define BLACKTIME 0 #define internalLED D4 // D4 to onboard-LED // PINs single Minute-LEDs #define LED4 D7 // D7 to 4-Minute-LED #define LED3 D3 // D3 to 3-Minute-LED #define LED2 D2 // D2 to 2-Minute-LED #define LED1 D1 // D1 to 1-Minute-LED const int secondsLED = D5; // D5 to Seconds-LED CRGB zColor[] = { CRGB::Yellow, CRGB::Red, CRGB::Blue, CRGB::Cyan, CRGB::Gold, CRGB::Magenta, CRGB::Orange, CRGB::Pink, CRGB::Purple, CRGB::Green, CRGB::SpringGreen, CRGB::Violet, CRGB::White }; CRGB farbe; int flag = 0; // changes to 1 at full hour int cylonFlag = 0; // for cancelling 5 Minutes fading //######################################################################################## // Set your own variables in this section !!! // NTP-Parameter #define MY_NTP_SERVER "194.25.134.196" // = ntp1.t-online.de #define MY_TZ "CET-1CEST,M3.5.0/02,M10.5.0/03" // timezone = Europe/Berlin //Die Sommerzeitumstellung erfolgt im dritten Monat (M3), der fuenften Woche (5), am Sonntag (0) um zwei Uhr (/02). //Die Winterzeitumstellung erfolgt im 10 Monat (M10) wieder in der fuenften Woche (5) am Sonntag(0) um drei Uhr (/03). // siehe https://werner.rothschopf.net/201802_arduino_esp8266_ntp.htm const char* OTA_host = "Vertikal-Uhr WiFi V3"; // name of the virtual port in the Arduino-IDE //darken LEDS at night from 20:00 to 07:00 o'clock int darkenLEDs_from = 20; // 0-23 darken from 8 pm int darkenLEDs_til = 7; // 0-23 brighten from 7 am int brightness_day = 28; // 0-255 //recommended: 18 int brightness_night = 6; // 0-255 //recommended: 1 //######################################################################################## time_t now; // this is the epoch tm tm; // the structure tm holds time information in a more convient way String wochentag; int lastAktual = 0; int halb = 0; //_________________________________________________________________________________________ void startOTAhandling() { ArduinoOTA.onStart([]() { Serial.println("Start updating"); }); ArduinoOTA.onEnd([]() { Serial.println("\nEnd"); }); ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { Serial.printf("Progress: %u%%\r", (progress / (total / 100))); }); ArduinoOTA.onError([](ota_error_t error) { Serial.printf("Error[%u]: ", error); if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed"); else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed"); else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed"); else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed"); else if (error == OTA_END_ERROR) Serial.println("End Failed"); }); String Hostname = OTA_host; // OTA Name ArduinoOTA.setHostname(Hostname.c_str()); ArduinoOTA.begin(); Serial.println(""); Serial.println("OTAhandling started ..."); Serial.println(""); } // end of startOTAhandling() //_____________________________________________________________________________ void minute_animation(){ // animation of the single minute-LEDs at every minute digitalWrite(LED1,LOW); digitalWrite(LED2,LOW); digitalWrite(LED3,LOW); digitalWrite(LED4,LOW); for ( int i =0; i < 3; i++) { delay(35); digitalWrite(LED1,HIGH); delay(35); digitalWrite(LED4,HIGH); delay(35); digitalWrite(LED1,LOW); delay(35); digitalWrite(LED4,LOW); delay(35); digitalWrite(LED2,HIGH); delay(35); digitalWrite(LED3,HIGH); delay(35); digitalWrite(LED2,LOW); delay(35); digitalWrite(LED3,LOW); } } //_____________________________________________________________________________ // Fade all LEDs down void fadeall() { for(int i = 0; i < NUM_LEDS; i++) { leds[i].nscale8(250); } } //__________________________________________________________________________________________ // "Cylon"-Animation void cylon(){ //FastLED.setBrightness(18); for (int c=0; c<2; c++) { static uint8_t hue = 0; Serial.print("x"); // First slide the led in one direction for(int i = 0; i < NUM_LEDS; i++) { leds[i] = CHSV(hue++, 255, 255); FastLED.show(); fadeall(); delay(6); // Wait a little bit before we loop around and do it again } Serial.print("x"); // Now go in the other direction. for(int i = (NUM_LEDS)-1; i >= 0; i--) { leds[i] = CHSV(hue++, 255, 255); FastLED.show(); fadeall(); delay(6); // Wait a little bit before we loop around and do it again } } //end of for c FastLED.clear(); // all LEDs off FastLED.show(); } // end of void cylon() //__________________________________________________________________________________________ void showTime() { time(&now); // read the current time localtime_r(&now, &tm); // update the structure tm with the current time /* // Only for debugging Serial.print("year:"); Serial.print(tm.tm_year + 1900); // years since 1900 Serial.print(" tmonth:"); Serial.print(tm.tm_mon + 1); // January = 0 (!) Serial.print(" tday:"); Serial.print(tm.tm_mday); // day of month Serial.print(" thour:"); Serial.print(tm.tm_hour); // hours since midnight 0-23 Serial.print(" tmin:"); Serial.print(tm.tm_min); // minutes after the hour 0-59 Serial.print(" tsec:"); Serial.print(tm.tm_sec); // seconds after the minute 0-61* Serial.print(" twday:"); Serial.print(tm.tm_wday); // days since Sunday 0-6 int tag = tm.tm_wday; if(tag == 0){wochentag = "Sontag";} else if(tag == 1){wochentag = "Montag";} else if(tag == 2){wochentag = "Dienstag";} else if(tag == 3){wochentag = "Mittwoch";} else if(tag == 4){wochentag = "Donnerstag";} else if(tag == 5){wochentag = "Freitag";} else if(tag == 6){wochentag = "Samstag";} Serial.print(" Wochentag: "); Serial.print(wochentag); if (tm.tm_isdst == 1){ // Daylight Saving Time flag Serial.print(" Sommerzeit");} else { Serial.print(" Keine Sommerzeit"); Serial.println(""); } */ // ############################################## // tm.tm_hour = 21; // 0-23 only for debugging // tm.tm_min = 59; // 0-59 only for debugging // tm.tm_sec = 30; // 0-59 only for debugging // tm.tm_isdst = 1; // 0/1 only for debugging // ############################################## } //end of void showTime() //__________________________________________________________________________________________ void LED_Anzeige(){ // FastLED.clear(); // all LEDs off // FastLED.show(); int halb = 0; int stund = 0; int Stunde = tm.tm_hour; int Minute = tm.tm_min; int Sekunde = tm.tm_sec; if (Stunde > 12){ Stunde = Stunde -12; } // convert 24h to 12h if (Stunde == 0 && (Minute >= 0 && Minute <= 14) ){ Stunde = 12; } // from 0-14 minutes after midnight --> hour = 12 if (Stunde == 12 && Minute >= 15 && Minute <= 59){ Stunde = 1; } //only if Stunde == 12 and! minutes between 15-59 minutes --> hour = 1 else if (Minute >= 15 && Minute <= 59){ Stunde = Stunde + 1; } //only between 15-59 minutes --> hour = hour +1 if (Minute <= 4){ halb = 0; stund = 1; } //only between 0-4 minutes --> light up "UHR" (=o'clock) = full hour /* if (Stunde == 12 && tm.tm_isdst == 1){Stunde = Stunde = 1;} // Sommerzeit / Daylight-Saving else if (tm.tm_isdst == 1){Stunde = Stunde + 1;} // Sommerzeit / Daylight-Saving */ Serial.println(); Serial.print("Stunde: "); Serial.print(Stunde); Serial.print(":"); Serial.print(Minute); Serial.print(":"); Serial.println(Sekunde); /* First initialization of LED-colors after boot, reboot or reset, because otherwise no color is defined, until next full hour is reached */ if( flag == 0) { if( Stunde == 0) {farbe = CRGB(CRGB::White);} // White if( Stunde == 1) {farbe = CRGB(CRGB::Yellow);} // Yellow if( Stunde == 2) {farbe = CRGB(CRGB::Red);} // Red if( Stunde == 3) {farbe = CRGB(CRGB::Blue);} // Blue if( Stunde == 4) {farbe = CRGB(CRGB::Cyan);} // Cyan if( Stunde == 5) {farbe = CRGB(CRGB::Magenta);} // Magenta if( Stunde == 6) {farbe = CRGB(CRGB::Green);} // Green if( Stunde == 7) {farbe = CRGB(CRGB::Purple);} // Purple if( Stunde == 8) {farbe = CRGB(CRGB::Gold);} // Gold if( Stunde == 9) {farbe = CRGB(CRGB::Blue);} // Blue if( Stunde == 10) {farbe = CRGB(CRGB::Red);} // Red if( Stunde == 11) {farbe = CRGB(CRGB::Green);} // Green if( Stunde == 12) {farbe = CRGB(CRGB::White);} // White } // end of if flag=0 // Change color of all LEDs at every full hour if( Stunde == 0 && Minute == 0 && Sekunde == 0) {flag=1; farbe = CRGB(CRGB::White);} // White if( Stunde == 1 && Minute == 0 && Sekunde == 0) {flag=1; farbe = CRGB(CRGB::Yellow);} // Yellow if( Stunde == 2 && Minute == 0 && Sekunde == 0) {flag=1; farbe = CRGB(CRGB::Red);} // Red if( Stunde == 3 && Minute == 0 && Sekunde == 0) {flag=1; farbe = CRGB(CRGB::Blue);} // Blue if( Stunde == 4 && Minute == 0 && Sekunde == 0) {flag=1; farbe = CRGB(CRGB::Cyan);} // Cyan if( Stunde == 5 && Minute == 0 && Sekunde == 0) {flag=1; farbe = CRGB(CRGB::Magenta);} // Magenta if( Stunde == 6 && Minute == 0 && Sekunde == 0) {flag=1; farbe = CRGB(CRGB::Green);} // Green if( Stunde == 7 && Minute == 0 && Sekunde == 0) {flag=1; farbe = CRGB(CRGB::Purple);} // Purple if( Stunde == 8 && Minute == 0 && Sekunde == 0) {flag=1; farbe = CRGB(CRGB::Gold);} // Gold if( Stunde == 9 && Minute == 0 && Sekunde == 0) {flag=1; farbe = CRGB(CRGB::Blue);} // Blue if( Stunde == 10 && Minute == 0 && Sekunde == 0) {flag=1; farbe = CRGB(CRGB::Red);} // Red if( Stunde == 11 && Minute == 0 && Sekunde == 0) {flag=1; farbe = CRGB(CRGB::Green);} // Green if( Stunde == 12 && Minute == 0 && Sekunde == 0) {flag=1; farbe = CRGB(CRGB::White);} // White /* ##### LED-Positions ##### 0,1,2,3,4 UHR //OK 5,6,7,8,9 ELF //OK 10,11,12,13,14,15 NEUN //OK 16,17,18,19,20,21 EINS //OK 23,24,25,26,27,28 FUNF //OK 29,30,31,32,33,34 ZEHN //OK 36,37,38,39,40,41 ACHT //OK 42,43,44,45,46,47,48 ZWOLF //OK 50,51,52,53,54,55 SECHS //OK 56,57,58,59,60,61 ZWEI //OK 63,64,65,66,67,68,69 SIEBEN //OK 70,71,72,73,74,75 DREI //OK 78,79,80,81,82,83 VIER //OK 84,85,86,87,88,89 NACH //OK 91,92,93,94,95,96 HALB //OK 97,98,99,100,101,102,103,104 VIERTEL //OK 106,107,108,109,110,111 DREI //OK 112,113,114,115,116,117 FUNF //OK 119,120,121,122,123,124 VOR //OK 125,126,127,128,129,130 ZEHN //OK 132,133,134,135,136,137,138 ES IST //OK */ //minute-LEDs at LED-stripe ############################################ //ES IST / it is 132,133,134,135,136,137,138 neu --> always on leds[132] = farbe; leds[133] = farbe; leds[134] = farbe; leds[135] = farbe; leds[136] = farbe; leds[137] = farbe; leds[138] = farbe; //FUNF NACH 112,113,114,115,116,117 neu 84,85,86,87,88,89 neu if (Minute >= 5 && Minute <= 9){ Serial.print(" FUENF NACH "); halb = 0; leds[112] = farbe; leds[113] = farbe; leds[114] = farbe; leds[115] = farbe; leds[116] = farbe; leds[117] = farbe; leds[84] = farbe; leds[85] = farbe; leds[86] = farbe; leds[87] = farbe; leds[88] = farbe; leds[89] = farbe; } //ZEHN NACH 125,126,127,128,129,130 neu 84,85,86,87,88,89 neu if (Minute >= 10 && Minute <= 14){ Serial.print(" ZEHN NACH "); halb = 0; leds[125] = farbe; leds[126] = farbe; leds[127] = farbe; leds[128] = farbe; leds[129] = farbe; leds[130] = farbe; leds[84] = farbe; leds[85] = farbe; leds[86] = farbe; leds[87] = farbe; leds[88] = farbe; leds[89] = farbe; } //VIERTEL 97,98,99,100,101,102,103,104 neu if (Minute >= 15 && Minute <= 19){ Serial.print(" VIERTEL "); halb = 0; leds[97] = farbe; leds[98] = farbe; leds[99] = farbe; leds[100] = farbe; leds[101] = farbe; leds[102] = farbe; leds[103] = farbe; leds[104] = farbe; } //ZEHN VOR HALB 125,126,127,128,129,130 neu 119,120,121,122,123,124 neu (91,92,93,94,95,96 neu) if (Minute >= 20 && Minute <= 24){ Serial.print(" ZEHN VOR HALB "); halb = 1; leds[125] = farbe; leds[126] = farbe; leds[127] = farbe; leds[128] = farbe; leds[129] = farbe; leds[130] = farbe; leds[119] = farbe; leds[120] = farbe; leds[121] = farbe; leds[122] = farbe; leds[123] = farbe; leds[124] = farbe; } //FUNF VOR HALB 112,113,114,115,116,117 neu 119,120,121,122,123,124 neu (91,92,93,94,95,96 neu) if (Minute >= 25 && Minute <= 29){ Serial.print(" FUENF VOR HALB "); halb = 1; leds[112] = farbe; leds[113] = farbe; leds[114] = farbe; leds[115] = farbe; leds[116] = farbe; leds[117] = farbe; leds[119] = farbe; leds[120] = farbe; leds[121] = farbe; leds[122] = farbe; leds[123] = farbe; leds[124] = farbe; } //HALB (91,92,93,94,95,96 neu) //separate routine: if halb ==1 if (Minute >= 30 && Minute <= 34){ Serial.print(" HALB "); halb = 1; } //FUNF NACH HALB 112,113,114,115,116,117 neu 84,85,86,87,88,89 neu (91,92,93,94,95,96 neu) if (Minute >= 35 && Minute <= 39){ Serial.print(" FUENF NACH HALB "); halb = 1; leds[112] = farbe; leds[113] = farbe; leds[114] = farbe; leds[115] = farbe; leds[116] = farbe; leds[117] = farbe; leds[84] = farbe; leds[85] = farbe; leds[86] = farbe; leds[87] = farbe; leds[88] = farbe; leds[89] = farbe; } //ZEHN NACH HALB 125,126,127,128,129,130 neu 84,85,86,87,88,89 neu (91,92,93,94,95,96 neu) if (Minute >= 40 && Minute <= 44){ Serial.print(" ZEHN NACH HALB "); halb = 1; leds[125] = farbe; leds[126] = farbe; leds[127] = farbe; leds[128] = farbe; leds[129] = farbe; leds[130] = farbe; leds[84] = farbe; leds[85] = farbe; leds[86] = farbe; leds[87] = farbe; leds[88] = farbe; leds[89] = farbe; } //DREI Viertel 106,107,108,109,110,111 neu 97,98,99,100,101,102,103,104 neu if (Minute >= 45 && Minute <= 49){ Serial.print(" DREI VIERTEL "); halb = 0; leds[106] = farbe; leds[107] = farbe; leds[108] = farbe; leds[109] = farbe; leds[110] = farbe; leds[111] = farbe; leds[97] = farbe; leds[98] = farbe; leds[99] = farbe; leds[100] = farbe; leds[101] = farbe; leds[102] = farbe; leds[103] = farbe; leds[104] = farbe; } //ZEHN VOR 125,126,127,128,129,130 neu 119,120,121,122,123,124 neu if (Minute >= 50 && Minute <= 54){ Serial.print(" ZEHN VOR "); halb = 0; leds[125] = farbe; leds[126] = farbe; leds[127] = farbe; leds[128] = farbe; leds[129] = farbe; leds[130] = farbe; leds[119] = farbe; leds[120] = farbe; leds[121] = farbe; leds[122] = farbe; leds[123] = farbe; leds[124] = farbe; } //FUNF VOR 112,113,114,115,116,117 119,120,121,122,123,124 neu if (Minute >= 55 && Minute <= 59){ Serial.print(" FUENF VOR "); halb = 0; leds[112] = farbe; leds[113] = farbe; leds[114] = farbe; leds[115] = farbe; leds[116] = farbe; leds[117] = farbe; leds[119] = farbe; leds[120] = farbe; leds[121] = farbe; leds[122] = farbe; leds[123] = farbe; leds[124] = farbe; } //hour-LEDs at LED-stripe ############################################ //16,17,18,19,20,21 EINS //OK if ( Stunde == 1 ) { Serial.println(" EINS "); leds[16] = farbe; leds[17] = farbe; leds[18] = farbe; leds[19] = farbe; leds[20] = farbe; leds[21] = farbe; } //56,57,58,59,60,61 ZWEI //OK if ( Stunde == 2 ) { Serial.println(" ZWEI "); leds[56] = farbe; leds[57] = farbe; leds[58] = farbe; leds[59] = farbe; leds[60] = farbe; leds[61] = farbe; } //70,71,72,73,74,75 DREI //OK if ( Stunde == 3 ) { Serial.println(" DREI "); leds[70] = farbe; leds[71] = farbe; leds[72] = farbe; leds[73] = farbe; leds[74] = farbe; leds[75] = farbe; } //78,79,80,81,82,83 VIER //OK if ( Stunde == 4 ) { Serial.println(" VIER "); leds[78] = farbe; leds[79] = farbe; leds[80] = farbe; leds[81] = farbe; leds[82] = farbe; leds[83] = farbe; } //23,24,25,26,27,28 FUNF //OK if ( Stunde == 5 ) { Serial.println(" FUENF "); leds[23] = farbe; leds[24] = farbe; leds[25] = farbe; leds[26] = farbe; leds[27] = farbe; leds[28] = farbe; } //50,51,52,53,54,55 SECHS //OK if ( Stunde == 6 ) { Serial.println(" SECHS "); leds[50] = farbe; leds[51] = farbe; leds[52] = farbe; leds[53] = farbe; leds[54] = farbe; leds[55] = farbe; } //63,64,65,66,67,68,69 SIEBEN //OK if ( Stunde == 7 ) { Serial.println(" SIEBEN "); leds[63] = farbe; leds[64] = farbe; leds[65] = farbe; leds[66] = farbe; leds[67] = farbe; leds[68] = farbe; leds[69] = farbe; } //36,37,38,39,40,41 ACHT //OK if ( Stunde == 8 ) { Serial.println(" ACHT "); leds[36] = farbe; leds[37] = farbe; leds[38] = farbe; leds[39] = farbe; leds[40] = farbe; leds[41] = farbe; } //10,11,12,13,14,15 NEUN //OK if ( Stunde == 9 ) { Serial.println(" NEUN "); leds[10] = farbe; leds[11] = farbe; leds[12] = farbe; leds[13] = farbe; leds[14] = farbe; leds[15] = farbe; } //29,30,31,32,33,34 ZEHN //OK if ( Stunde == 10 ) { Serial.println(" ZEHN "); leds[29] = farbe; leds[30] = farbe; leds[31] = farbe; leds[32] = farbe; leds[33] = farbe; leds[34] = farbe; } //5,6,7,8,9 ELF //OK if ( Stunde == 11 ) { Serial.println(" ELF "); leds[5] = farbe; leds[6] = farbe; leds[7] = farbe; leds[8] = farbe; leds[9] = farbe; } //42,43,44,45,46,47,48 ZWOLF //OK if ( Stunde == 12 ) { Serial.println(" ZWOELF "); leds[42] = farbe; leds[43] = farbe; leds[44] = farbe; leds[45] = farbe; leds[46] = farbe; leds[47] = farbe; leds[48] = farbe; } //################################################### // illuminate "HALB"-lettering 91,92,93,94,95,96 neu if(halb == 1){ leds[91] = farbe; leds[92] = farbe; leds[93] = farbe; leds[94] = farbe; leds[95] = farbe; leds[96] = farbe; } else { leds[91] = CRGB( 0, 0, 0); leds[92] = CRGB( 0, 0, 0); leds[93] = CRGB( 0, 0, 0); leds[94] = CRGB( 0, 0, 0); leds[95] = CRGB( 0, 0, 0); leds[96] = CRGB( 0, 0, 0); } // illuminate "UHR"-lettering (o'clock) 0,1,2,3,4 neu if(stund == 1){ Serial.println(" UHR "); leds[0] = farbe; leds[1] = farbe; leds[2] = farbe; leds[3] = farbe; leds[4] = farbe; } else { leds[0] = CRGB( 0, 0, 0); leds[1] = CRGB( 0, 0, 0); leds[2] = CRGB( 0, 0, 0); leds[3] = CRGB( 0, 0, 0); leds[4] = CRGB( 0, 0, 0); } FastLED.show(); // finally: let the LEDs light up in the appropriate color depending on the time //################################################### // animation of the single minute-LEDs every minute if(Sekunde == 0 ){ minute_animation(); } // drive the 4 single minute-LEDS in the bottom stand if((Minute-(Minute/5)*5)==1){ Serial.println(" + 1 Minute "); digitalWrite(LED1,HIGH); digitalWrite(LED2,LOW); digitalWrite(LED3,LOW); digitalWrite(LED4,LOW); } else if((Minute-(Minute/5)*5)==2){ Serial.println(" + 2 Minuten "); digitalWrite(LED1,HIGH); digitalWrite(LED2,HIGH); digitalWrite(LED3,LOW); digitalWrite(LED4,LOW); } else if((Minute-(Minute/5)*5)==3){ Serial.println(" + 3 Minuten "); digitalWrite(LED1,HIGH); digitalWrite(LED2,HIGH); digitalWrite(LED3,HIGH); digitalWrite(LED4,LOW); } else if((Minute-(Minute/5)*5)==4){ Serial.println(" + 4 Minuten "); digitalWrite(LED1,HIGH); digitalWrite(LED2,HIGH); digitalWrite(LED3,HIGH); digitalWrite(LED4,HIGH); } else { digitalWrite(LED1,LOW); digitalWrite(LED2,LOW); digitalWrite(LED3,LOW); digitalWrite(LED4,LOW); } /* // For debugging only int L1 = digitalRead(LED1); int L2 = digitalRead(LED2); int L3 = digitalRead(LED3); int L4 = digitalRead(LED4); Serial.print("L1: "); Serial.print(L1); Serial.print("\tL2: "); Serial.print(L2); Serial.print("\tL3: "); Serial.print(L3); Serial.print("\tL4: "); Serial.println(L4); */ } // End of void LEDS() //__________________________________________________________________________________________ void setup(){ //################## Serial.begin(115200); LEDS.addLeds(leds,NUM_LEDS); FastLED.setBrightness(40); //(Brightness only! for Boot-Sequence and first "Cylon"-Animation // while not connected with WiFI all LEDs shining in red color for(int i=0; i<=NUM_LEDS-1; i++){ delay(12); leds[i] = CRGB(CRGB::Red); // brighten sequenz FastLED.show(); } WiFi.mode(WIFI_STA); // explicitly set mode, esp defaults to STA+AP //WiFiManager, Local intialization. Once its business is done, there is no need to keep it around WiFiManager wm; // Automatically connect using saved credentials, // if connection fails, it starts an access point with the specified name ( "Config-AP"), // if empty will auto generate SSID, if password is blank it will be anonymous AP (wm.autoConnect()) // then goes into a blocking loop awaiting configuration and will return success result bool res; res = wm.autoConnect("Config-AP"); // anonymous ap if(!res) { Serial.println("Failed to connect"); // ESP.restart(); } else { //if you get here you have connected to the WiFi Serial.println(""); Serial.print("WiFi connected to "); Serial.print(WiFi.SSID()); Serial.print("\tIP: "); Serial.println(WiFi.localIP()); for(int i=NUM_LEDS-1; i>=0; i--){ // fade down fadeall(); delay(20); FastLED.show(); } cylon(); // "Cylon"-Animation } //end of WiFi-Manager ############################################### configTime(MY_TZ, MY_NTP_SERVER); // --> Here is the IMPORTANT ONE LINER needed in your sketch! // minute-LEDs pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); pinMode(LED3, OUTPUT); pinMode(LED4, OUTPUT); pinMode(secondsLED, OUTPUT); pinMode(internalLED, OUTPUT); digitalWrite(internalLED, HIGH); // Turn off onboard-LED FastLED.clear(); // all LEDs off FastLED.show(); startOTAhandling(); delay (500); showTime(); LED_Anzeige(); } // end of setup ####################### //__________________________________________________________________________________________ void loop() { //################## ArduinoOTA.handle(); //for OTA-flashing showTime(); int Aktual = tm.tm_min ; int sek = tm.tm_sec; // Show "Cylon"-Animation at full hour if(tm.tm_min == 0 && tm.tm_sec == 0 ){ //if(tm.tm_min == 5 && tm.tm_sec == 0 ){ // only for testing cylonFlag = 1; // Set other brightness-values only while "Cylon-Animation" is running if( tm.tm_hour >= darkenLEDs_til && tm.tm_hour < darkenLEDs_from){ FastLED.setBrightness(45); } else {FastLED.setBrightness(10);} cylon(); FastLED.clear(); // all LEDs off FastLED.show(); // Reset brightness to day-/night-values if( tm.tm_hour >= darkenLEDs_til && tm.tm_hour < darkenLEDs_from){ FastLED.setBrightness(brightness_day); } else {FastLED.setBrightness(brightness_night);} LED_Anzeige(); } //----------------------------------------------------------------- // update the LED-Stripe only when the minute changes - reduces flickering if (Aktual != lastAktual ) { lastAktual= Aktual; if( tm.tm_hour >= darkenLEDs_til && tm.tm_hour < darkenLEDs_from){ FastLED.setBrightness(brightness_day); } else {FastLED.setBrightness(brightness_night);} if (Aktual % 5 != 0){ LED_Anzeige(); Serial.println("LEDs refreshed"); } } //-------------------------------- // Fading only every 5th minute, but not! when "Cylon"-Animation has run before if (Aktual % 5 == 0 && sek == 0 && cylonFlag == 0 ){ lastAktual= Aktual; for(int i=NUM_LEDS-1; i>=0; i--){ // fade down fadeall(); delay(17); FastLED.show(); } // set brightness to 0 FastLED.setBrightness(0); FastLED.show(); // brighten LEDs at day if( tm.tm_hour >= darkenLEDs_til && tm.tm_hour < darkenLEDs_from){ LED_Anzeige(); for(int i=0; i<= brightness_day; i++){ FastLED.setBrightness(i); FastLED.show(); delay(150); } } // brighten LEDs at night else { LED_Anzeige(); for(int i=0; i<= brightness_night; i++){ FastLED.setBrightness(i); FastLED.show(); delay(140); } } Serial.println("LEDs refreshed with fading"); } //end of Aktual % 5 //----------------------------------------------------------------- // Blink seconds-LED every 1 second if (tm.tm_sec % 2) { digitalWrite(secondsLED, LOW); } else { digitalWrite(secondsLED, HIGH); } if (cylonFlag == 1 ){ cylonFlag = 0; } } // end of loop //__________________________________________________________________________________________