Rediced read access to EEPROM by preloading data. Refactorized the setup function into separate functions.

This commit is contained in:
Kai Lauterbach 2023-04-25 08:18:36 +02:00
parent 32b7f9c8b2
commit 4f0a191d0b
2 changed files with 126 additions and 138 deletions

View file

@ -15,5 +15,4 @@
#define EEPROM_LAST_DEFAULT_BLOCK_ADDRESS 20 #define EEPROM_LAST_DEFAULT_BLOCK_ADDRESS 20
#define EEPROM_TIMING_DATA_ADDRESS (EEPROM_TIMING_CONTROL_ENABLED_ADDRESS + LIGHTS_COUNT) // Stored data date per light ELE_USED; HH; MM; CH1; CH2; CH3; CH4; #define EEPROM_TIMING_DATA_ADDRESS (EEPROM_TIMING_CONTROL_ENABLED_ADDRESS + LIGHTS_COUNT) // Stored data date per light ELE_USED; HH; MM; CH1; CH2; CH3; CH4;
#define TC_TIME_CHECK_INTERVAL_MS 600000 #define TC_TIME_CHECK_INTERVAL_MS 600000

View file

@ -12,16 +12,9 @@
uint8_t pins[LIGHTS_COUNT] = {12, 15, 13, 14}; uint8_t pins[LIGHTS_COUNT] = {12, 15, 13, 14};
#define use_hardware_switch false // To control on/off state and brightness using GPIO/Pushbutton, set this value to true.
//For GPIO based on/off and brightness control, it is mandatory to connect the following GPIO pins to ground using 10k resistor
#define button1_pin 4 // on and brightness up
#define button2_pin 5 // off and brightness down
#ifdef USE_STATIC_IP
IPAddress strip_ip ( 192, 168, 0, 26); // choose an unique IP Adress IPAddress strip_ip ( 192, 168, 0, 26); // choose an unique IP Adress
IPAddress gateway_ip ( 192, 168, 0, 1); // Router IP IPAddress gateway_ip ( 192, 168, 0, 1); // Router IP
IPAddress subnet_mask( 255, 255, 255, 0); IPAddress subnet_mask( 255, 255, 255, 0);
#endif
//********************************// //********************************//
@ -47,6 +40,8 @@ IPAddress subnet_mask( 255, 255, 255, 0);
#define PWM_MAX 1023 // 24V - maximum light amount (100%) #define PWM_MAX 1023 // 24V - maximum light amount (100%)
#define PWM_INC 4 // 24V-15V = 9V range; 9V ≙ 1024/640 = 383 counts; 383/100% = 3,83 counts (1%) / % => round up 4 counts / % (~1%) #define PWM_INC 4 // 24V-15V = 9V range; 9V ≙ 1024/640 = 383 counts; 383/100% = 3,83 counts (1%) / % => round up 4 counts / % (~1%)
//********************************//
uint8_t scene; uint8_t scene;
uint8_t tc_enabled; uint8_t tc_enabled;
@ -63,23 +58,7 @@ byte mac[6];
ESP8266WebServer server(80); ESP8266WebServer server(80);
ESP8266HTTPUpdateServer httpUpdateServer; ESP8266HTTPUpdateServer httpUpdateServer;
void handleNotFound() //********************************//
{
String message = "File Not Found\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += (server.method() == HTTP_GET) ? "GET" : "POST";
message += "\nArguments: ";
message += server.args();
message += "\n";
for (uint8_t i = 0; i < server.args(); i++)
{
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}
server.send(404, "text/plain", message);
}
void apply_scene(uint8_t new_scene, uint8_t light) void apply_scene(uint8_t new_scene, uint8_t light)
{ {
@ -98,6 +77,8 @@ void apply_scene(uint8_t new_scene, uint8_t light)
} }
} }
//********************************//
void process_lightdata(uint8_t light, float transitiontime) void process_lightdata(uint8_t light, float transitiontime)
{ {
transitiontime *= 16; transitiontime *= 16;
@ -109,6 +90,8 @@ void process_lightdata(uint8_t light, float transitiontime)
} }
} }
//********************************//
void lightEngine() void lightEngine()
{ {
for (int i = 0; i < LIGHTS_COUNT; i++) for (int i = 0; i < LIGHTS_COUNT; i++)
@ -123,7 +106,7 @@ void lightEngine()
{ {
current_bri[i] = bri[i]; current_bri[i] = bri[i];
} }
analogWrite(pins[i], (int)(current_bri[i] * 4)); analogWrite(pins[i], (int)(current_bri[i] * 4)); // TODO warum * 4?
} }
} else { } else {
@ -135,7 +118,7 @@ void lightEngine()
{ {
current_bri[i] = 0; current_bri[i] = 0;
} }
analogWrite(pins[i], (int)(current_bri[i] * 4)); analogWrite(pins[i], (int)(current_bri[i] * 4)); // TODO warum * 4?
} }
} }
} }
@ -145,77 +128,13 @@ void lightEngine()
delay(6); delay(6);
in_transition = false; in_transition = false;
} else if (use_hardware_switch == true)
{
if (digitalRead(button1_pin) == HIGH)
{
int i = 0;
while (digitalRead(button1_pin) == HIGH && i < 30)
{
delay(20);
i++;
}
for (int light = 0; light < LIGHTS_COUNT; light++)
{
if (i < 30)
{
// there was a short press
light_state[light] = true;
}
else {
// there was a long press
bri[light] += 56;
if (bri[light] > 254)
{
// don't increase the brightness more then maximum value
bri[light] = 254;
}
}
process_lightdata(light, 4);
}
} else if (digitalRead(button2_pin) == HIGH)
{
int i = 0;
while (digitalRead(button2_pin) == HIGH && i < 30)
{
delay(20);
i++;
}
for (int light = 0; light < LIGHTS_COUNT; light++)
{
if (i < 30)
{
// there was a short press
light_state[light] = false;
} else {
// there was a long press
bri[light] -= 56;
if (bri[light] < 1)
{
// don't decrease the brightness less than minimum value.
bri[light] = 1;
}
}
process_lightdata(light, 4);
}
}
} }
} }
void setup() //********************************//
void read_eeprom_config()
{ {
EEPROM.begin(512);
Serial.begin(SERIAL_BAUD_RATE);
#ifdef USE_STATIC_IP
WiFi.config(strip_ip, gateway_ip, subnet_mask);
#endif
for (uint8_t light = 0; light < LIGHTS_COUNT; light++) for (uint8_t light = 0; light < LIGHTS_COUNT; light++)
{ {
apply_scene(EEPROM.read(EEPROM_SCENE_ADDRESS), light); apply_scene(EEPROM.read(EEPROM_SCENE_ADDRESS), light);
@ -229,11 +148,12 @@ void setup()
} }
} }
if (EEPROM.read(EEPROM_TIMING_CONTROL_ENABLED_ADDRESS) == TIMING_CONTROL_DISABLED) uint8_t tmp = EEPROM.read(EEPROM_TIMING_CONTROL_ENABLED_ADDRESS);
if (tmp == TIMING_CONTROL_DISABLED)
{ {
tc_enabled = TIMING_CONTROL_DISABLED; tc_enabled = TIMING_CONTROL_DISABLED;
} else if (EEPROM.read(EEPROM_TIMING_CONTROL_ENABLED_ADDRESS) == TIMING_CONTROL_ENABLED) } else if (tmp == TIMING_CONTROL_ENABLED)
{ {
tc_enabled = TIMING_CONTROL_ENABLED; tc_enabled = TIMING_CONTROL_ENABLED;
@ -264,6 +184,22 @@ void setup()
EEPROM.commit(); EEPROM.commit();
} }
#endif #endif
}
//********************************//
void setup()
{
EEPROM.begin(512);
Serial.begin(SERIAL_BAUD_RATE);
if (EEPROM.read(EEPROM_DYNAMIC_IP_ADDRESS) == 0)
{
WiFi.config(strip_ip, gateway_ip, subnet_mask);
}
read_eeprom_config();
for (int j = 0; j < 200; j++) for (int j = 0; j < 200; j++)
{ {
@ -294,13 +230,47 @@ void setup()
httpUpdateServer.setup(&server); // start http server httpUpdateServer.setup(&server); // start http server
if (use_hardware_switch == true) init_webserver();
{
pinMode(button1_pin, INPUT);
pinMode(button2_pin, INPUT);
}
server.on("/state", HTTP_PUT, []()
tc_init();
server.begin();
} // end of setup
void loop()
{
server.handleClient();
lightEngine();
if (tc_enabled == TIMING_CONTROL_ENABLED)
{
tc_update();
}
}
void handleNotFound()
{
String message = "File Not Found\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += (server.method() == HTTP_GET) ? "GET" : "POST";
message += "\nArguments: ";
message += server.args();
message += "\n";
for (uint8_t i = 0; i < server.args(); i++)
{
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}
server.send(404, "text/plain", message);
}
void init_webserver()
{
server.on("/state", HTTP_PUT, []()
{ // HTTP PUT request used to set a new light state { // HTTP PUT request used to set a new light state
DynamicJsonDocument root(1024); DynamicJsonDocument root(1024);
DeserializationError error = deserializeJson(root, server.arg("plain")); DeserializationError error = deserializeJson(root, server.arg("plain"));
@ -317,18 +287,21 @@ void setup()
JsonObject values = state.value(); JsonObject values = state.value();
int transitiontime = 4; int transitiontime = 4;
uint8_t tmp = EEPROM.read(EEPROM_LAST_STATE_STARTUP_ADDRESS);
if (values.containsKey("on")) if (values.containsKey("on"))
{ {
if (values["on"]) if (values["on"])
{ {
light_state[light] = true; light_state[light] = true;
if (EEPROM.read(EEPROM_LAST_STATE_STARTUP_ADDRESS) == 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); EEPROM.write(EEPROM_LAST_STATE_ADDRESS + light, LIGHT_STATE_ON);
} }
} else { } else {
light_state[light] = false; light_state[light] = false;
if (EEPROM.read(EEPROM_LAST_STATE_STARTUP_ADDRESS) == 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); EEPROM.write(EEPROM_LAST_STATE_ADDRESS + light, LIGHT_STATE_OFF);
} }
@ -389,26 +362,39 @@ void setup()
server.on("/", []() server.on("/", []()
{ {
float transitiontime = 4; static float transitiontime = 4.0;
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(); int startup = server.arg("startup").toInt();
EEPROM.write(EEPROM_LAST_STATE_STARTUP_ADDRESS, startup); if (EEPROM.read(EEPROM_LAST_STATE_STARTUP_ADDRESS) != startup)
EEPROM.commit(); {
Serial.print("Startup behavior set to "); Serial.println(EEPROM.read(EEPROM_LAST_STATE_STARTUP_ADDRESS)); EEPROM.write(EEPROM_LAST_STATE_STARTUP_ADDRESS, startup);
EEPROM.commit();
Serial.print("Startup behavior set to "); Serial.println(EEPROM.read(EEPROM_LAST_STATE_STARTUP_ADDRESS));
}
} }
// timing controller switch handling
if (server.hasArg("tc")) if (server.hasArg("tc"))
{ {
if (server.arg("tc") == "true") if (server.arg("tc") == "true")
{ {
if (tc_enabled == TIMING_CONTROL_DISABLED) if (tc_enabled == TIMING_CONTROL_DISABLED)
{ {
tc_enabled = TIMING_CONTROL_ENABLED; if (EEPROM.read(EEPROM_TIMING_CONTROL_ENABLED_ADDRESS) != TIMING_CONTROL_ENABLED)
EEPROM.write(EEPROM_TIMING_CONTROL_ENABLED_ADDRESS, TIMING_CONTROL_ENABLED); {
EEPROM.commit(); tc_enabled = TIMING_CONTROL_ENABLED;
Serial.print("Timing control = "); Serial.println(EEPROM.read(EEPROM_TIMING_CONTROL_ENABLED_ADDRESS)); 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));
}
} }
} else { // tc is set to false or something else } else { // tc is set to false or something else
@ -416,22 +402,30 @@ void setup()
if (tc_enabled == TIMING_CONTROL_ENABLED) if (tc_enabled == TIMING_CONTROL_ENABLED)
{ {
tc_enabled = TIMING_CONTROL_DISABLED; tc_enabled = TIMING_CONTROL_DISABLED;
EEPROM.write(EEPROM_TIMING_CONTROL_ENABLED_ADDRESS, TIMING_CONTROL_DISABLED); if (EEPROM.read(EEPROM_TIMING_CONTROL_ENABLED_ADDRESS) != TIMING_CONTROL_DISABLED)
EEPROM.commit(); {
Serial.print("Timing control = "); Serial.println(EEPROM.read(EEPROM_TIMING_CONTROL_ENABLED_ADDRESS)); 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));
}
} }
} }
} }
// scene switch handling
if (server.hasArg("scene")) if (server.hasArg("scene"))
{ {
scene = server.arg("scene").toInt(); scene = server.arg("scene").toInt();
EEPROM.write(EEPROM_SCENE_ADDRESS, scene); if (EEPROM.read(EEPROM_SCENE_ADDRESS) != scene)
EEPROM.commit(); {
Serial.print("Scene set to "); Serial.println(EEPROM.read(EEPROM_SCENE_ADDRESS)); EEPROM.write(EEPROM_SCENE_ADDRESS, scene);
EEPROM.commit();
Serial.print("Scene set to "); Serial.println(EEPROM.read(EEPROM_SCENE_ADDRESS));
}
} }
// process the received data for every light
for (int light = 0; light < LIGHTS_COUNT; light++) for (int light = 0; light < LIGHTS_COUNT; light++)
{ {
@ -444,17 +438,18 @@ void setup()
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") if (server.arg("on" + (String)light) == "true")
{ {
light_state[light] = true; light_state[light] = true;
if (EEPROM.read(EEPROM_LAST_STATE_STARTUP_ADDRESS) == 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); EEPROM.write(EEPROM_LAST_STATE_ADDRESS + light, LIGHT_STATE_ON);
} }
} else { } else {
light_state[light] = false; light_state[light] = false;
if (EEPROM.read(EEPROM_LAST_STATE_STARTUP_ADDRESS) == 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); EEPROM.write(EEPROM_LAST_STATE_ADDRESS + light, LIGHT_STATE_OFF);
} }
@ -466,7 +461,9 @@ void setup()
} }
if (server.hasArg("alert")) { // start alerting for every light
if (server.hasArg("alert"))
{
if (light_state[light]) if (light_state[light])
{ {
@ -477,6 +474,7 @@ void setup()
} }
// switch the light
if (light_state[light]) if (light_state[light])
{ {
step_level[light] = ((float)bri[light] - current_bri[light]) / transitiontime; step_level[light] = ((float)bri[light] - current_bri[light]) / transitiontime;
@ -487,7 +485,7 @@ void setup()
} }
if (server.hasArg("resettc")) if (server.hasArg("resettc"))
{ { // reqrite the tc config and reboot
tc_write_default(); tc_write_default();
ESP.reset(); ESP.reset();
} }
@ -497,6 +495,7 @@ void setup()
ESP.reset(); ESP.reset();
} }
// Generate HTML page
String http_content = "<!doctype html>"; String http_content = "<!doctype html>";
http_content += "<html>"; http_content += "<html>";
http_content += "<head>"; http_content += "<head>";
@ -541,8 +540,12 @@ void setup()
http_content += "</div>"; http_content += "</div>";
http_content += "<br>"; http_content += "<br>";
// Light control http_content += "<div class=\"pure-control-group\">";
http_content += "<label for=\"transition\">Transition time (s)</label>";
http_content += "<input id=\"transition\" name=\"transition\" type=\"text\" placeholder=\"10\" value\"" + (String)transitiontime + "\">";
http_content += "</div>";
// Light control
for (uint8 light_num = 0; light_num < LIGHTS_COUNT; light_num++) for (uint8 light_num = 0; light_num < LIGHTS_COUNT; light_num++)
{ {
http_content += "<h3>Light " + (String)(light_num+1) + "</h3>"; http_content += "<h3>Light " + (String)(light_num+1) + "</h3>";
@ -551,6 +554,7 @@ void setup()
http_content += "<a class=\"pure-button"; if ( light_state[light_num]) http_content += " pure-button-primary"; http_content += "\" href=\"/?on" + (String)light_num + "=true\">ON</a>"; http_content += "<a class=\"pure-button"; if ( light_state[light_num]) http_content += " pure-button-primary"; http_content += "\" href=\"/?on" + (String)light_num + "=true\">ON</a>";
http_content += "<a class=\"pure-button"; if (!light_state[light_num]) http_content += " pure-button-primary"; http_content += "\" href=\"/?on" + (String)light_num + "=false\">OFF</a>"; http_content += "<a class=\"pure-button"; if (!light_state[light_num]) http_content += " pure-button-primary"; http_content += "\" href=\"/?on" + (String)light_num + "=false\">OFF</a>";
http_content += "</div>"; http_content += "</div>";
http_content += "<div class=\"pure-control-group\">"; http_content += "<div class=\"pure-control-group\">";
http_content += "<label for=\"state\"><strong>State</strong></label>"; http_content += "<label for=\"state\"><strong>State</strong></label>";
http_content += "</div>"; http_content += "</div>";
@ -631,19 +635,4 @@ void setup()
}); });
server.onNotFound(handleNotFound); server.onNotFound(handleNotFound);
tc_init();
server.begin();
} // end of setup
void loop()
{
server.handleClient();
lightEngine();
if (tc_enabled == TIMING_CONTROL_ENABLED)
{
tc_update();
}
} }