#include "time.h" #include #define _TASK_SLEEP_ON_IDLE_RUN //ToDo check benefit //#include #include #include #include // UpdateServer includes #ifdef ESP8266 #include # include #include #define MYTZ TZ_Europe_Berlin #include // settimeofday_cb() #include // struct timeval #include // sntp_servermode_dhcp() #elif defined(ESP32) #include // For ESP32 IotWebConf provides a drop-in replacement for UpdateServer. # include #include #endif #define MOD(a,b) ((((a)%(b))+(b))%(b)) #ifdef ESP8266 #define LDR_PIN A0 #define IOTWEBCONF_DEBUG_DISABLED #define DATA_PIN D7 //DMA RDX0/GPIO3 | Uart1 TXD1/GPIO2 | UART0 GPIO1 #elif defined(ESP32) #define LDR_PIN A6 #define DATA_PIN 17 #endif /* useful preselection NO following hour NO three block hour marking quarter hour marking */ #define NUM_LEDS 60 //24 #define SERIAL_BAUD 115200 #define RGBW const bool clockwiseRing = false; volatile bool singleSecond = false; //show seconds volatile bool allDotsOn = true; //lighten up all leds #if NUM_LEDS == 60 volatile bool followingHour = true; //move hour like an analog one #else volatile bool followingHour = false; //disabled due limited resolution #endif volatile int hourOffset = 0; void bootAnimCallback(); void clockTickCallback(); void ledRefreshCallback(); void brightnessAdjustmentCallback(); void brightnessFadingCallback(); void iotWebConfLoopCallback(); //https://github.com/esp8266/Arduino/blob/master/cores/esp8266/TZ.h #define MYTZ TZ_Europe_Berlin String currentNTP; struct tm timeinfo; time_t now; //https://github.com/arduino/esp8266/blob/master/cores/esp8266/sntp-lwip2.c //mapping for analog time representation volatile int currentSec = 30; volatile int currentMin = 50; volatile int currentHour = 50; volatile bool NTPreachable = false; volatile int MAX_BRIGHTNESS = 200; #ifdef LDR_PIN // variable for storing the potentiometer value volatile unsigned int ldrValue = 0; volatile unsigned int targetBrightness = MAX_BRIGHTNESS; #endif // WebPortal const char thingName[] = "NTP-Clock-RGBLED"; const char wifiInitialApPassword[] = "12345678"; #define STRING_LEN 63 #define NUMBER_LEN 4 // -- Maximal length the input-range attributes can have. //#define COLOR_ATTR_LENGTH 60 // -- Configuration specific key. The value should be modified if config structure was changed. #define CONFIG_VERSION "V1.1.10" #ifdef RGBW #define MINIMAL_BRIGHTNESS 5 #define LDR_SCALE 4 #define colorSaturation 255 #ifdef ESP8266 //NeoPixelBrightnessBus strip(NUM_LEDS);//RDX0 GPIO3 //NeoPixelBrightnessBus strip(NUM_LEDS); //NeoPixelBrightnessBus strip(NUM_LEDS); NeoPixelBrightnessBus strip(NUM_LEDS, DATA_PIN); #elif defined(ESP32) NeoPixelBrightnessBus strip(NUM_LEDS, DATA_PIN); //ESP32 #endif RgbwColor red(colorSaturation, 0, 0, 0); RgbwColor green(0, colorSaturation, 0, 0); RgbwColor blue(0, 0, colorSaturation, 0); RgbwColor realWhite(colorSaturation); RgbwColor white(0, 0, 0, 40); //darkish dirt RgbwColor whiter(0, 0, 0, 120); //darkish dirt RgbwColor white12(0, 0, 0, 192); //darkish dirt RgbwColor black(0); RgbwColor gold(HtmlColor( 0xFFD700 ) ); RgbwColor orangered(HtmlColor( 0xFF4500 ) ); RgbwColor orange(HtmlColor( 0xFFA500 ) ); RgbwColor darkred(HtmlColor( 0x800000) ); RgbwColor darkgreen(HtmlColor( 0x006400) ); RgbwColor lightgreen(HtmlColor( 0x30ee30) ); RgbwColor temp; RgbwColor secondsColor = black; RgbwColor minuteColor = darkred; RgbwColor hourColor = gold; RgbwColor highnoonColor = white12; RgbwColor backlightColor = white; RgbwColor hourMarkingColor = whiter; void transformtoHtmlColor (char* sOutput, RgbwColor* inputColor) { //Serial.printf("InputColor: R:%i G:%i B:%i W:%i\n", inputColor.R, inputColor.G, inputColor.B, inputColor.W); if (inputColor->IsMonotone()) { //Serial.print("White: "); Serial.println(inputColor->W); HtmlColor(RgbColor(inputColor->W, inputColor->W, inputColor->W)).ToNumericalString(sOutput, 12); //Serial.println((char*)sOutput); } else { //Serial.print("Color: "); Serial.print(inputColor->R); Serial.print(inputColor->G); Serial.println(inputColor->B); HtmlColor(RgbColor(inputColor->R, inputColor->G, inputColor->B)).ToNumericalString(sOutput, 12); //Serial.println((char*)sOutput); } } void transformHtmltoStrip(RgbwColor* outputColor, char* sInput) { HtmlColor htmlTemp; //Serial.print("HtmltoStrip "); //Serial.println((char*)sInput); htmlTemp.Parse( sInput ); RgbwColor stripColor( htmlTemp ); //Serial.printf("StripColor: R:%i G:%i B:%i W:%i\n", stripColor.R, stripColor.G, stripColor.B, stripColor.W); memcpy(outputColor, &stripColor, sizeof(stripColor)); } #endif #ifndef RGBW #define MINIMAL_BRIGHTNESS 20 #define LDR_SCALE 16 #define colorSaturation 192 #ifdef ESP8266 //NeoPixelBrightnessBus strip(NUM_LEDS);//RDX0 GPIO3 Broken due IoTWebConf NeoPixelBrightnessBus strip(NUM_LEDS); //NeoPixelBrightnessBus strip(NUM_LEDS, DATA_PIN); #elif defined(ESP32) NeoPixelBrightnessBus strip(NUM_LEDS, DATA_PIN); //ESP32 #endif RgbColor red(colorSaturation, 0, 0); RgbColor green(0, colorSaturation, 0); RgbColor blue(0, 0, colorSaturation); RgbColor realWhite(colorSaturation); RgbColor black(0); RgbColor white(30, 40, 35); //darkish dirt RgbColor whiter(120, 120, 120); //darkish dirt RgbColor white12(255, 255, 255); //darkish dirt RgbColor gold(HtmlColor( 0xFFD700 )); RgbColor orangered(HtmlColor( 0xFF4500 )); RgbColor orange(HtmlColor( 0xFFA500 )); RgbColor darkred(HtmlColor( 0x800000 )); RgbColor darkgreen(HtmlColor( 0x006400 )); RgbColor lightgreen(HtmlColor( 0x90ee90 )); RgbColor temp; RgbColor secondsColor = black; RgbColor minuteColor = darkred; RgbColor hourColor = gold; RgbColor highnoonColor = white12; RgbColor backlightColor = white; RgbColor hourMarkingColor = whiter; void transformtoHtmlColor (char* sOutput, RgbColor* inputColor) { HtmlColor(RgbColor(inputColor->R, inputColor->G, inputColor->B)).ToNumericalString(sOutput, 12); } void transformHtmltoStrip(RgbColor* outputColor, char* sInput) { HtmlColor htmlTemp; //Serial.print("HtmltoStrip "); //Serial.println((char*)sInput); htmlTemp.Parse( sInput ); RgbColor stripColor( htmlTemp ); //Serial.printf("StripColor: R:%i G:%i B:%i W:%i\n", stripColor.R, stripColor.G, stripColor.B, stripColor.W); memcpy(outputColor, &stripColor, sizeof(stripColor)); } #endif DNSServer dnsServer; WebServer server(80); #ifdef ESP8266 ESP8266HTTPUpdateServer httpUpdater; #elif defined(ESP32) HTTPUpdateServer httpUpdater; #endif IotWebConf iotWebConf(thingName, &dnsServer, &server, wifiInitialApPassword, CONFIG_VERSION); iotwebconf::ParameterGroup timeGroup = iotwebconf::ParameterGroup("Time", "Time settings"); iotwebconf::TextTParameter timezoneParam = iotwebconf::Builder>("timezone"). label("TimeZone"). defaultValue("TZ_Europe_Berlin"). build(); /* iotwebconf::TextTParameter ntpServerParam = iotwebconf::Builder>("ntpServer"). label("NTP Server"). defaultValue("pool.ntp.org"). build();*/ iotwebconf::ParameterGroup ledGroup = iotwebconf::ParameterGroup("LED", "LED settings"); iotwebconf::IntTParameter maxBrightnessParam = iotwebconf::Builder>("Max Brightness"). label("Max brightness"). defaultValue(200). min(MINIMAL_BRIGHTNESS). max(MAX_BRIGHTNESS). step(1). build(); iotwebconf::CheckboxTParameter singleSecondParam = iotwebconf::Builder("singleSecond"). label("single Second visible"). #if NUM_LEDS == 60 defaultValue(true). build(); #else defaultValue(false). build(); #endif iotwebconf::CheckboxTParameter allDotsOnParam = iotwebconf::Builder("allDotsOn"). label("all Dots lighten on"). defaultValue(true). build(); iotwebconf::CheckboxTParameter followingHourParam = iotwebconf::Builder("followingHour"). label("following Hour"). #if NUM_LEDS == 60 defaultValue(true). build(); #else defaultValue(false). build(); #endif iotwebconf::ColorTParameter hourColorParam = iotwebconf::Builder("Stundenfarbe"). label("Stundenfarbe"). defaultValue("#FFD700"). build(); iotwebconf::ColorTParameter minuteColorParam = iotwebconf::Builder("Minutenfarbe"). label("Minutenfarbe"). defaultValue("#800000"). build(); iotwebconf::ColorTParameter secondsColorParam = iotwebconf::Builder("Sekundenfarbe"). label("Sekundenfarbe"). defaultValue("#000000"). build(); iotwebconf::ColorTParameter highnoonColorParam = iotwebconf::Builder("12 Uhr Farbe"). label("12 Uhr Farbe"). defaultValue("#C0C0C0"). build(); iotwebconf::ColorTParameter backlightColorParam = iotwebconf::Builder("Hintergrundfarbe"). label("Hintergrundfarbe"). defaultValue("#1E2823"). build(); iotwebconf::ColorTParameter hourMarkingColorParam = iotwebconf::Builder("Stundenmarkierung"). label("Stundenmarkierung"). defaultValue("#787878"). build(); const char CUSTOMHTML_SCRIPT_INNER[] PROGMEM = "\n\ function colorCh(id)\n\ {\n\ var x=document.getElementById(id);\n\ var s=document.getElementById(id + 'Val');\n\ s.innerHTML = x.value;\n\ }\n\n\ document.addEventListener('DOMContentLoaded', function(event) {\n\ let elements = document.querySelectorAll('input[type=\"password\"]');\n\ for (let p of elements) {\n\ let btn = document.createElement('INPUT'); btn.type = 'button'; btn.value = '🔓'; btn.style.width = 'auto'; p.style.width = '80%'; p.parentNode.insertBefore(btn,p.nextSibling);\n\ btn.onclick = function() { if (p.type === 'password') { p.type = 'text'; btn.value = '🔒'; } else { p.type = 'password'; btn.value = '🔓'; } }\n\ };\n\ });\n"; // -- We need to create our custom HtmlFormatProvider to add some javasripts. class CustomHtmlFormatProvider : public iotwebconf::HtmlFormatProvider { protected: String getScriptInner() override { return HtmlFormatProvider::getScriptInner() + String(FPSTR(CUSTOMHTML_SCRIPT_INNER)); } }; // -- Javascript block will be added to the header. //const char CUSTOMHTML_BODY_INNER[] PROGMEM = " "; //const char CUSTOMHTML_BODY_INNER[] PROGMEM = " "; // -- An instance must be created from the class defined above. CustomHtmlFormatProvider customHtmlFormatProvider; Task bootAnim(200, TASK_FOREVER, &bootAnimCallback); Task clockTick(1000, TASK_FOREVER, &clockTickCallback); Task ntpReachableCheck(1800000, TASK_FOREVER, &ntpReachableCheckCallback); Task ledRefresh(200, TASK_FOREVER, &ledRefreshCallback); #ifdef LDR_PIN Task brightnessAdjustment(10000, TASK_FOREVER, &brightnessAdjustmentCallback); Task brightnessFading(333, TASK_FOREVER, &brightnessFadingCallback); #endif Task iotwebconfLoop(1000, TASK_FOREVER, &iotWebConfLoopCallback); Scheduler runner;