From fb98d1c28bed114459eceac4922416ba6d86d0a8 Mon Sep 17 00:00:00 2001 From: Kai Lauterbach Date: Thu, 27 Apr 2023 16:40:27 +0200 Subject: [PATCH] Added dynamic handling of the on/off buttons of the lights. Added a graph which shows the current timing control data. --- firmware/firmware.ino | 502 ++++++++++++++++++++---------------- firmware/timing_control.ino | 28 +- 2 files changed, 290 insertions(+), 240 deletions(-) diff --git a/firmware/firmware.ino b/firmware/firmware.ino index d02fa71..9e2d623 100644 --- a/firmware/firmware.ino +++ b/firmware/firmware.ino @@ -10,36 +10,36 @@ //********* Config block *********// -uint8_t pins[LIGHTS_COUNT] = {12, 15, 13, 14}; +uint8_t pins[LIGHTS_COUNT] = { 12, 15, 13, 14 }; -IPAddress strip_ip ( 192, 168, 0, 26); // choose an unique IP Adress -IPAddress gateway_ip ( 192, 168, 0, 1); // Router IP -IPAddress subnet_mask( 255, 255, 255, 0); -IPAddress dns ( 192, 168, 0, 1); +IPAddress strip_ip(192, 168, 0, 26); // choose an unique IP Adress +IPAddress gateway_ip(192, 168, 0, 1); // Router IP +IPAddress subnet_mask(255, 255, 255, 0); +IPAddress dns(192, 168, 0, 1); //********************************// #define LIGHT_VERSION 2.1 #define LAST_STATE_STARTUP_LIGHT_LAST_STATE 0 -#define LAST_STATE_STARTUP_LIGHT_ON_STATE 1 -#define LAST_STATE_STARTUP_LIGHT_OFF_STATE 2 +#define LAST_STATE_STARTUP_LIGHT_ON_STATE 1 +#define LAST_STATE_STARTUP_LIGHT_OFF_STATE 2 -#define LIGHT_STATE_ON 1 +#define LIGHT_STATE_ON 1 #define LIGHT_STATE_OFF 0 -#define TIMING_CONTROL_ENABLED 1 +#define TIMING_CONTROL_ENABLED 1 #define TIMING_CONTROL_DISABLED 0 -#define SCENE_RELEAX 0 -#define SCENE_BRIGHT 1 +#define SCENE_RELEAX 0 +#define SCENE_BRIGHT 1 #define SCENE_NIGHTLY 2 // 10 bit PWM -#define PWM_OFF 0 // 0V -#define PWM_MIN 640 // 15V - minimum light amount (~1%) -#define PWM_MAX 1023 // 24V - maximum light amount (100%) -#define BRI_TO_PWM_FACTOR 1.506 // 24V-15V = 9V range; 9V ≙ 1024-640 = 384 counts; 384/255 counts =~ 1,506 counts +#define PWM_OFF 0 // 0V +#define PWM_MIN 640 // 15V - minimum light amount (~1%) +#define PWM_MAX 1023 // 24V - maximum light amount (100%) +#define BRI_TO_PWM_FACTOR 1.506 // 24V-15V = 9V range; 9V ≙ 1024-640 = 384 counts; 384/255 counts =~ 1,506 counts //********************************// @@ -63,29 +63,23 @@ uint32_t last_lightengine_activity = 0; //********************************// -void apply_scene(uint8_t new_scene, uint8_t light) -{ - if (new_scene == SCENE_RELEAX) - { +void apply_scene(uint8_t new_scene, uint8_t light) { + if (new_scene == SCENE_RELEAX) { bri[light] = 144; - } else if (new_scene == SCENE_BRIGHT) - { + } else if (new_scene == SCENE_BRIGHT) { bri[light] = 254; - } else if (new_scene == SCENE_NIGHTLY) - { + } else if (new_scene == SCENE_NIGHTLY) { bri[0] = 25; - bri[1] = 0; - bri[2] = 0; - bri[3] = 0; + bri[1] = 0; + bri[2] = 0; + bri[3] = 0; } } //********************************// -void process_lightdata(uint8_t light, float tt) -{ - if (light_state[light]) - { +void process_lightdata(uint8_t light, float tt) { + if (light_state[light]) { step_level[light] = (bri[light] - current_bri[light]) / tt; } else { @@ -95,29 +89,22 @@ void process_lightdata(uint8_t light, float tt) //********************************// -void lightEngine() -{ +void lightEngine() { - if (millis() < (last_lightengine_activity + TIME_LIGHTENGINE_INTERVAL_MS)) - { + if (millis() < (last_lightengine_activity + TIME_LIGHTENGINE_INTERVAL_MS)) { // abort processing, the transition setting is a delay of seconds return; } last_lightengine_activity = millis(); - for (int i = 0; i < LIGHTS_COUNT; i++) - { + for (int i = 0; i < LIGHTS_COUNT; i++) { - if (light_state[i]) - { - if (bri[i] != current_bri[i]) - { + if (light_state[i]) { + if (bri[i] != current_bri[i]) { in_transition = true; current_bri[i] += step_level[i] / BRI_MOD_STEPS_PER_SEC; - if ((step_level[i] > 0.0 && current_bri[i] > bri[i]) || - (step_level[i] < 0.0 && current_bri[i] < bri[i])) - { + if ((step_level[i] > 0.0 && current_bri[i] > bri[i]) || (step_level[i] < 0.0 && current_bri[i] < bri[i])) { current_bri[i] = bri[i]; //Serial.println("Reached target bri[" + (String)i + "] = " + (String)bri[i]); } @@ -128,12 +115,10 @@ void lightEngine() } } else { - if (current_bri[i] != 0) - { + if (current_bri[i] != 0) { in_transition = true; current_bri[i] -= step_level[i] / BRI_MOD_STEPS_PER_SEC; - if (current_bri[i] < 0) - { + if (current_bri[i] < 0) { current_bri[i] = 0; //Serial.println("Reached target bri[" + (String)i + "] = " + (String)bri[i]); } @@ -144,10 +129,9 @@ void lightEngine() } } - } // for loop end + } // for loop end - if (in_transition) - { + if (in_transition) { delay(6); in_transition = false; } @@ -155,15 +139,12 @@ void lightEngine() //********************************// -uint16_t calcPWM(float tbri) -{ +uint16_t calcPWM(float tbri) { uint16_t tmp_pwm = PWM_OFF; - if (tbri > 0.0) - { + if (tbri > 0.0) { tmp_pwm = PWM_MIN + (int)(tbri * BRI_TO_PWM_FACTOR); } - if (tmp_pwm > PWM_MAX) - { + if (tmp_pwm > PWM_MAX) { tmp_pwm = PWM_MAX; } //Serial.println((String)tbri + " => " + (String)tmp_pwm); @@ -172,53 +153,43 @@ uint16_t calcPWM(float tbri) //********************************// -void read_eeprom_config() -{ - for (uint8_t light = 0; light < LIGHTS_COUNT; light++) - { +void read_eeprom_config() { + for (uint8_t light = 0; light < LIGHTS_COUNT; light++) { apply_scene(EEPROM.read(EEPROM_SCENE_ADDRESS), light); step_level[light] = bri[light] / 150.0; - if (EEPROM.read(EEPROM_LAST_STATE_STARTUP_ADDRESS) == LAST_STATE_STARTUP_LIGHT_LAST_STATE || - (EEPROM.read(EEPROM_LAST_STATE_STARTUP_ADDRESS) == LAST_STATE_STARTUP_LIGHT_ON_STATE && - EEPROM.read(EEPROM_LAST_STATE_ADDRESS + light) == LIGHT_STATE_ON)) - { - light_state[light] = true; // set the light state to on + if (EEPROM.read(EEPROM_LAST_STATE_STARTUP_ADDRESS) == LAST_STATE_STARTUP_LIGHT_LAST_STATE || (EEPROM.read(EEPROM_LAST_STATE_STARTUP_ADDRESS) == LAST_STATE_STARTUP_LIGHT_ON_STATE && EEPROM.read(EEPROM_LAST_STATE_ADDRESS + light) == LIGHT_STATE_ON)) { + light_state[light] = true; // set the light state to on } } uint8_t tmp = EEPROM.read(EEPROM_TIMING_CONTROL_ENABLED_ADDRESS); - if (tmp == TIMING_CONTROL_DISABLED) - { + if (tmp == TIMING_CONTROL_DISABLED) { tc_enabled = TIMING_CONTROL_DISABLED; - } else if (tmp == TIMING_CONTROL_ENABLED) - { + } else if (tmp == TIMING_CONTROL_ENABLED) { tc_enabled = TIMING_CONTROL_ENABLED; - + } else { - + EEPROM.write(EEPROM_TIMING_CONTROL_ENABLED_ADDRESS, TIMING_CONTROL_DISABLED); EEPROM.commit(); tc_enabled = TIMING_CONTROL_DISABLED; } - if (EEPROM.read(EEPROM_LAST_STATE_STARTUP_ADDRESS) == 255) - { + if (EEPROM.read(EEPROM_LAST_STATE_STARTUP_ADDRESS) == 255) { // set the default value on uninitialized EEPROM EEPROM.write(EEPROM_LAST_STATE_STARTUP_ADDRESS, 0); EEPROM.commit(); } #ifdef USE_STATIC_IP - if (EEPROM.read(EEPROM_DYNAMIC_IP_ADDRESS) == 255) - { + if (EEPROM.read(EEPROM_DYNAMIC_IP_ADDRESS) == 255) { EEPROM.write(EEPROM_DYNAMIC_IP_ADDRESS, 0); EEPROM.commit(); } #else - if (EEPROM.read(EEPROM_DYNAMIC_IP_ADDRESS) == 255) - { + if (EEPROM.read(EEPROM_DYNAMIC_IP_ADDRESS) == 255) { EEPROM.write(EEPROM_DYNAMIC_IP_ADDRESS, 1); EEPROM.commit(); } @@ -227,21 +198,18 @@ void read_eeprom_config() //********************************// -void setup() -{ +void setup() { EEPROM.begin(256); Serial.begin(SERIAL_BAUD_RATE); - if (EEPROM.read(EEPROM_DYNAMIC_IP_ADDRESS) == 0) - { + if (EEPROM.read(EEPROM_DYNAMIC_IP_ADDRESS) == 0) { WiFi.config(strip_ip, gateway_ip, subnet_mask, dns); } read_eeprom_config(); - for (int j = 0; j < 200; j++) - { + for (int j = 0; j < 200; j++) { lightEngine(); } @@ -254,8 +222,7 @@ void setup() Serial.print("IP: "); Serial.println(myIP); - if (!light_state[0]) - { + if (!light_state[0]) { // Show that we are connected analogWrite(pins[0], 100); delay(500); @@ -267,32 +234,29 @@ void setup() pinMode(LED_BUILTIN, OUTPUT); // Initialize the LED_BUILTIN pin as an output digitalWrite(LED_BUILTIN, HIGH); // Turn the LED off by making the voltage HIGH - httpUpdateServer.setup(&server); // start http server + httpUpdateServer.setup(&server); // start http server init_webserver(); tc_init(); server.begin(); -} // end of setup +} // end of setup //********************************// -void loop() -{ +void loop() { server.handleClient(); lightEngine(); - if (tc_enabled == TIMING_CONTROL_ENABLED) - { + if (tc_enabled == TIMING_CONTROL_ENABLED) { tc_update_loop(); } } //********************************// -void handleNotFound() -{ +void handleNotFound() { String message = "File Not Found\n\n"; message += "URI: "; message += server.uri(); @@ -302,8 +266,7 @@ void handleNotFound() message += server.args(); message += "\n"; - for (uint8_t i = 0; i < server.args(); i++) - { + for (uint8_t i = 0; i < server.args(); i++) { message += " " + server.argName(i) + ": " + server.arg(i) + "\n"; } server.send(404, "text/plain", message); @@ -311,62 +274,49 @@ void handleNotFound() //********************************// -void init_webserver() -{ +void init_webserver() { #ifndef DISABLE_WEB_CONTROL - server.on("/state", HTTP_PUT, []() - { // HTTP PUT request used to set a new light state + server.on("/state", HTTP_PUT, []() { // HTTP PUT request used to set a new light state DynamicJsonDocument root(1024); DeserializationError error = deserializeJson(root, server.arg("plain")); - if (error) - { + if (error) { server.send(404, "text/plain", "FAIL. " + server.arg("plain")); } else { - for (JsonPair state : root.as()) - { + for (JsonPair state : root.as()) { const char* key = state.key().c_str(); int light = atoi(key) - 1; JsonObject values = state.value(); int transitiontime = 4; uint8_t tmp = EEPROM.read(EEPROM_LAST_STATE_STARTUP_ADDRESS); - if (values.containsKey("on")) - { - if (values["on"]) - { + if (values.containsKey("on")) { + if (values["on"]) { light_state[light] = true; - if (tmp == LAST_STATE_STARTUP_LIGHT_LAST_STATE && - EEPROM.read(EEPROM_LAST_STATE_ADDRESS + light) == LIGHT_STATE_OFF) - { + if (tmp == LAST_STATE_STARTUP_LIGHT_LAST_STATE && EEPROM.read(EEPROM_LAST_STATE_ADDRESS + light) == LIGHT_STATE_OFF) { EEPROM.write(EEPROM_LAST_STATE_ADDRESS + light, LIGHT_STATE_ON); } } else { light_state[light] = false; - if (tmp == LAST_STATE_STARTUP_LIGHT_LAST_STATE && - EEPROM.read(EEPROM_LAST_STATE_ADDRESS + light) == LIGHT_STATE_ON) - { + if (tmp == LAST_STATE_STARTUP_LIGHT_LAST_STATE && EEPROM.read(EEPROM_LAST_STATE_ADDRESS + light) == LIGHT_STATE_ON) { EEPROM.write(EEPROM_LAST_STATE_ADDRESS + light, LIGHT_STATE_OFF); } } } - if (values.containsKey("bri")) - { + if (values.containsKey("bri")) { bri[light] = values["bri"]; } - if (values.containsKey("bri_inc")) - { - bri[light] += (int) values["bri_inc"]; + if (values.containsKey("bri_inc")) { + bri[light] += (int)values["bri_inc"]; if (bri[light] > 255) bri[light] = 255; else if (bri[light] < 1) bri[light] = 1; } - if (values.containsKey("transitiontime")) - { + if (values.containsKey("transitiontime")) { transitiontime = values["transitiontime"]; } process_lightdata(light, transitiontime); @@ -377,8 +327,7 @@ void init_webserver() } }); - server.on("/state", HTTP_GET, []() - { // HTTP GET request used to fetch current light state + server.on("/state", HTTP_GET, []() { // HTTP GET request used to fetch current light state uint8_t light = server.arg("light").toInt() - 1; DynamicJsonDocument root(1024); root["on"] = light_state[light]; @@ -388,9 +337,8 @@ void init_webserver() server.send(200, "text/plain", output); }); - server.on("/detect", []() - { // HTTP GET request used to discover the light type - char macString[32] = {0}; + server.on("/detect", []() { // HTTP GET request used to discover the light type + char macString[32] = { 0 }; sprintf(macString, "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); DynamicJsonDocument root(1024); root["name"] = light_name; @@ -405,75 +353,65 @@ void init_webserver() server.send(200, "text/plain", output); }); - server.on("/tc_data_blocks", []() - { + server.on("/tc_data_blocks", []() { String output = tc_getJsonData(); server.send(200, "application/json", output); }); -#endif // DISABLE_WEB_CONTROL +#endif // DISABLE_WEB_CONTROL - server.on("/", []() - { + server.on("/", []() { #ifndef DISABLE_WEB_CONTROL static float transitiontime = 4.0; - if (server.hasArg("transition")) - { + if (server.hasArg("transition")) { transitiontime = server.arg("transition").toFloat(); } // startup behavior switch handling - if (server.hasArg("startup")) - { + if (server.hasArg("startup")) { int startup = server.arg("startup").toInt(); - if (EEPROM.read(EEPROM_LAST_STATE_STARTUP_ADDRESS) != startup) - { + if (EEPROM.read(EEPROM_LAST_STATE_STARTUP_ADDRESS) != startup) { EEPROM.write(EEPROM_LAST_STATE_STARTUP_ADDRESS, startup); - for (uint8_t i = 0; i < LIGHTS_COUNT; i++) - { + for (uint8_t i = 0; i < LIGHTS_COUNT; i++) { uint8_t tmp = (light_state[i] == true ? LIGHT_STATE_ON : LIGHT_STATE_OFF); - if (EEPROM.read(EEPROM_LAST_STATE_ADDRESS + i) != tmp) - { + if (EEPROM.read(EEPROM_LAST_STATE_ADDRESS + i) != tmp) { EEPROM.write(EEPROM_LAST_STATE_ADDRESS + i, tmp); } } EEPROM.commit(); - Serial.print("Startup behavior set to "); Serial.println(EEPROM.read(EEPROM_LAST_STATE_STARTUP_ADDRESS)); + Serial.print("Startup behavior set to "); + Serial.println(EEPROM.read(EEPROM_LAST_STATE_STARTUP_ADDRESS)); } } -#endif // DISABLE_WEB_CONTROL +#endif // DISABLE_WEB_CONTROL // timing controller switch handling - if (server.hasArg("tc")) - { - if (server.arg("tc") == "true") - { - if (tc_enabled == TIMING_CONTROL_DISABLED) - { - if (EEPROM.read(EEPROM_TIMING_CONTROL_ENABLED_ADDRESS) != TIMING_CONTROL_ENABLED) - { + if (server.hasArg("tc")) { + if (server.arg("tc") == "true") { + if (tc_enabled == TIMING_CONTROL_DISABLED) { + if (EEPROM.read(EEPROM_TIMING_CONTROL_ENABLED_ADDRESS) != TIMING_CONTROL_ENABLED) { tc_enabled = TIMING_CONTROL_ENABLED; EEPROM.write(EEPROM_TIMING_CONTROL_ENABLED_ADDRESS, TIMING_CONTROL_ENABLED); EEPROM.commit(); - Serial.print("Timing control = "); Serial.println(EEPROM.read(EEPROM_TIMING_CONTROL_ENABLED_ADDRESS)); + Serial.print("Timing control = "); + Serial.println(EEPROM.read(EEPROM_TIMING_CONTROL_ENABLED_ADDRESS)); } } - } else { // tc is set to false or something else + } else { // tc is set to false or something else - if (tc_enabled == TIMING_CONTROL_ENABLED) - { + if (tc_enabled == TIMING_CONTROL_ENABLED) { tc_enabled = TIMING_CONTROL_DISABLED; - if (EEPROM.read(EEPROM_TIMING_CONTROL_ENABLED_ADDRESS) != TIMING_CONTROL_DISABLED) - { + if (EEPROM.read(EEPROM_TIMING_CONTROL_ENABLED_ADDRESS) != TIMING_CONTROL_DISABLED) { EEPROM.write(EEPROM_TIMING_CONTROL_ENABLED_ADDRESS, TIMING_CONTROL_DISABLED); EEPROM.commit(); - Serial.print("Timing control = "); Serial.println(EEPROM.read(EEPROM_TIMING_CONTROL_ENABLED_ADDRESS)); + Serial.print("Timing control = "); + Serial.println(EEPROM.read(EEPROM_TIMING_CONTROL_ENABLED_ADDRESS)); } } } @@ -482,98 +420,87 @@ void init_webserver() #ifndef DISABLE_WEB_CONTROL // scene switch handling - if (server.hasArg("scene")) - { + if (server.hasArg("scene")) { scene = server.arg("scene").toInt(); - if (EEPROM.read(EEPROM_SCENE_ADDRESS) != scene) - { + if (EEPROM.read(EEPROM_SCENE_ADDRESS) != scene) { EEPROM.write(EEPROM_SCENE_ADDRESS, scene); EEPROM.commit(); - Serial.print("Scene set to "); Serial.println(EEPROM.read(EEPROM_SCENE_ADDRESS)); + Serial.print("Scene set to "); + Serial.println(EEPROM.read(EEPROM_SCENE_ADDRESS)); } - } - if (server.hasArg("dip")) - { + if (server.hasArg("dip")) { uint8_t tmp = EEPROM.read(EEPROM_DYNAMIC_IP_ADDRESS); uint8_t tmp2 = (server.arg("dip") == "true" ? 1 : 0); - if (tmp != tmp2) - { + if (tmp != tmp2) { EEPROM.write(EEPROM_DYNAMIC_IP_ADDRESS, tmp2); EEPROM.commit(); - Serial.print("Set dynamic IP to "); Serial.println(EEPROM.read(EEPROM_DYNAMIC_IP_ADDRESS)); + Serial.print("Set dynamic IP to "); + Serial.println(EEPROM.read(EEPROM_DYNAMIC_IP_ADDRESS)); } } // process the received data for every light - for (int light = 0; light < LIGHTS_COUNT; light++) - { - - if (server.hasArg("bri" + (String)light)) - { - bri[light] = (int)server.arg("bri" + (String)light).toInt(); - Serial.print("Brightness set to "); Serial.println(bri[light]); + for (int light = 0; light < LIGHTS_COUNT; light++) { + if (server.hasArg("bri" + (String)light)) { + bri[light] = (int)server.arg("bri" + (String)light).toInt(); + Serial.print("Brightness set to "); + Serial.println(bri[light]); } - - if (server.hasArg("on" + (String)light)) - { + + if (server.hasArg("on" + (String)light)) { uint8_t tmp = EEPROM.read(EEPROM_LAST_STATE_STARTUP_ADDRESS); - if (server.arg("on" + (String)light) == "true" && light_state[light] == false) - { + if (server.arg("on" + (String)light) == "true" && light_state[light] == false) { light_state[light] = true; - if (tmp == 0 && EEPROM.read(EEPROM_LAST_STATE_ADDRESS + light) == 0) - { + if (tmp == 0 && EEPROM.read(EEPROM_LAST_STATE_ADDRESS + light) == 0) { EEPROM.write(EEPROM_LAST_STATE_ADDRESS + light, LIGHT_STATE_ON); } - Serial.print("Light "); Serial.print(light); Serial.print(" state set to "); Serial.println(light_state[light]); + Serial.print("Light "); + Serial.print(light); + Serial.print(" state set to "); + Serial.println(light_state[light]); - } else if (server.arg("on" + (String)light) == "false" && light_state[light] == true) - { + } else if (server.arg("on" + (String)light) == "false" && light_state[light] == true) { light_state[light] = false; - if (tmp == 0 && EEPROM.read(EEPROM_LAST_STATE_ADDRESS + light) == 1) - { + if (tmp == 0 && EEPROM.read(EEPROM_LAST_STATE_ADDRESS + light) == 1) { EEPROM.write(EEPROM_LAST_STATE_ADDRESS + light, LIGHT_STATE_OFF); } - Serial.print("Light "); Serial.print(light); Serial.print(" state set to "); Serial.println(light_state[light]); + Serial.print("Light "); + Serial.print(light); + Serial.print(" state set to "); + Serial.println(light_state[light]); } EEPROM.commit(); - } // start alerting for every light - if (server.hasArg("alert")) - { - if (light_state[light]) - { + if (server.hasArg("alert")) { + if (light_state[light]) { current_bri[light] = 0; } else { current_bri[light] = 255; } - } // set the light step level - if (server.hasArg("transition") && light_state[light]) - { + if (server.hasArg("transition") && light_state[light]) { Serial.println("Webinterface transitiontime = " + (String)transitiontime); transitiontime = server.arg("transition").toFloat(); step_level[light] = ((float)bri[light] - current_bri[light]) / transitiontime; } - } // process all lights + } // process all lights -#endif // DISABLE_WEB_CONTROL +#endif // DISABLE_WEB_CONTROL - if (server.hasArg("resettc")) - { // reqrite the tc config and reboot + if (server.hasArg("resettc")) { // reqrite the tc config and reboot tc_write_default(); ESP.reset(); } - if (server.hasArg("reset")) - { + if (server.hasArg("reset")) { ESP.reset(); } @@ -583,8 +510,10 @@ void init_webserver() http_content += ""; http_content += ""; http_content += ""; - http_content += ""; // Reload the page every 15 seconds automatically + //http_content += ""; // Reload the page every 15 seconds automatically http_content += "Light Setup"; + http_content += ""; + http_content += ""; http_content += ""; http_content += ""; http_content += ""; @@ -600,15 +529,16 @@ void init_webserver() http_content += "
"; #ifndef DISABLE_WEB_CONTROL - http_content += "
"; + http_content += "
"; // Light control - for (uint8 light_num = 0; light_num < LIGHTS_COUNT; light_num++) - { - http_content += "

Light " + (String)(light_num+1) + "

"; + for (uint8 light_num = 0; light_num < LIGHTS_COUNT; light_num++) { + http_content += "

Light " + (String)(light_num + 1) + "

"; http_content += "
"; http_content += ""; - http_content += "ON"; - http_content += "OFF"; + http_content += "ON"; + http_content += "OFF"; http_content += "
"; http_content += "
"; @@ -627,15 +557,23 @@ void init_webserver() } // timer data processing, startup state and scene for all of the lights - http_content += "
"; + http_content += "
"; + http_content += "
"; + http_content += "

"; http_content += "

Config

"; http_content += "
"; http_content += ""; http_content += ""; http_content += "
"; @@ -643,17 +581,27 @@ void init_webserver() http_content += ""; http_content += ""; http_content += ""; http_content += "
"; http_content += ""; int tc_val = EEPROM.read(EEPROM_TIMING_CONTROL_ENABLED_ADDRESS); - http_content += "ON"; - http_content += "OFF"; + http_content += "ON"; + http_content += "OFF"; http_content += "
"; http_content += "
"; @@ -680,12 +628,15 @@ void init_webserver() http_content += "

Network

"; http_content += "
"; http_content += ""; - http_content += "ON"; - http_content += "OFF"; + http_content += "ON"; + http_content += "OFF"; http_content += "
"; - if (dip == 0) - { + if (dip == 0) { http_content += "
"; http_content += ""; http_content += ""; @@ -700,11 +651,112 @@ void init_webserver() http_content += "
"; } + // The save button http_content += "
"; http_content += ""; http_content += "
"; -#endif // DISABLE_WEB_CONTROL + http_content += ""; + +#endif // DISABLE_WEB_CONTROL http_content += ""; http_content += "
"; @@ -712,11 +764,9 @@ void init_webserver() http_content += ""; server.send(200, "text/html", http_content); - }); - server.on("/reset", []() - { // trigger manual reset + server.on("/reset", []() { // trigger manual reset server.send(200, "text/html", "reset"); delay(1000); ESP.restart(); diff --git a/firmware/timing_control.ino b/firmware/timing_control.ino index f14c3d2..026961a 100644 --- a/firmware/timing_control.ino +++ b/firmware/timing_control.ino @@ -20,7 +20,7 @@ //***********************************// /* Globals */ -bool tc_testOngoing = true; +bool tc_testOngoing = false; uint32_t tc_last_check = 60000; @@ -49,9 +49,9 @@ uint8_t example_timer_data_block[] = { 18, 0, 205, 205, 205, 205, // 4: 80% all for 5 hours 19, 0, 50, 50, 50, 50, // 5: 20% all 19, 30, 50, 0, 50, 0, // 6: 20% all blues + 20, 0, 25, 0, 25, 0, // 9: disabled 20, 30, 25, 0, 0, 0, // 7: 10% ch1 blues 21, 0, 0, 0, 0, 0, // 8: 0% all - 20, 0, 0, 0, 0, 0, // 9: disabled }; uint8_t test_timer_data_block[] = { @@ -141,7 +141,7 @@ void tc_update_main() tc_updateTime(); // search for the current active time slot - for (int i = NUMBER_OF_TIMER_DATA_BLOCKS-1; i >= 0 && target_data_block == 255; i--) + for (int i = NUMBER_OF_TIMER_DATA_BLOCKS-1; i >= 0 && target_data_block == 255; --i) { //Serial.println((String)tc_data[i].hh + ":" + (String)tc_data[i].mm); @@ -369,33 +369,33 @@ bool tc_check_no_data_block() String tc_getJsonData() { - String output = "["; - for (uint8_t i = 0; i < LENGTH_OF_TIMER_DATA_BLOCK; i++) + String output = "{\"tcdata\":["; + for (uint8_t i = 0; i < NUMBER_OF_TIMER_DATA_BLOCKS; i++) { output += "{\"hour\":" + (String)(int)tc_data[i].hh + ","; - output += "\"min\":" + (String)(int)tc_data[i].mm + ","; - output += "\"ch1\":" + (String)(int)tc_data[i].ch1 + ","; - output += "\"ch2\":" + (String)(int)tc_data[i].ch2 + ","; - output += "\"ch3\":" + (String)(int)tc_data[i].ch3 + ","; - output += "\"ch4\":" + (String)(int)tc_data[i].ch4 + "}"; - if (i < LENGTH_OF_TIMER_DATA_BLOCK-1) + output += "\"min\":" + (String)(int)tc_data[i].mm + ","; + output += "\"ch1\":" + (String)(int)tc_data[i].ch1 + ","; + output += "\"ch2\":" + (String)(int)tc_data[i].ch2 + ","; + output += "\"ch3\":" + (String)(int)tc_data[i].ch3 + ","; + output += "\"ch4\":" + (String)(int)tc_data[i].ch4 + "}"; + if (i < NUMBER_OF_TIMER_DATA_BLOCKS-1) { output += ","; } } - output += "]"; + output += "], \"currenttime\": \"" + (String)timeClient.getHours() + ":" + (String)timeClient.getMinutes() + "\"}"; return output; } //********************************// -tc_jsonDataBlockToEEPROM(String json_data_string) +void tc_jsonDataBlocksToEEPROM(String json_data_string) { StaticJsonDocument<512> doc; deserializeJson(doc, json_data_string); // Loop through each data block in the JSON data and store it in the tc_data array - for (uint8_t i = 0; i < LENGTH_OF_TIMER_DATA_BLOCK; i++) + for (uint8_t i = 0; i < NUMBER_OF_TIMER_DATA_BLOCKS; i++) { JsonObject obj = doc[i]; tc_data[i].hh = obj["hour"];