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_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

View file

@ -12,16 +12,9 @@
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 gateway_ip ( 192, 168, 0, 1); // Router IP
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_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 tc_enabled;
@ -63,23 +58,7 @@ byte mac[6];
ESP8266WebServer server(80);
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)
{
@ -98,6 +77,8 @@ void apply_scene(uint8_t new_scene, uint8_t light)
}
}
//********************************//
void process_lightdata(uint8_t light, float transitiontime)
{
transitiontime *= 16;
@ -109,6 +90,8 @@ void process_lightdata(uint8_t light, float transitiontime)
}
}
//********************************//
void lightEngine()
{
for (int i = 0; i < LIGHTS_COUNT; i++)
@ -123,7 +106,7 @@ void lightEngine()
{
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 {
@ -135,7 +118,7 @@ void lightEngine()
{
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);
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++)
{
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;
} else if (EEPROM.read(EEPROM_TIMING_CONTROL_ENABLED_ADDRESS) == TIMING_CONTROL_ENABLED)
} else if (tmp == TIMING_CONTROL_ENABLED)
{
tc_enabled = TIMING_CONTROL_ENABLED;
@ -264,6 +184,22 @@ void setup()
EEPROM.commit();
}
#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++)
{
@ -294,13 +230,47 @@ void setup()
httpUpdateServer.setup(&server); // start http server
if (use_hardware_switch == true)
{
pinMode(button1_pin, INPUT);
pinMode(button2_pin, INPUT);
}
init_webserver();
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
DynamicJsonDocument root(1024);
DeserializationError error = deserializeJson(root, server.arg("plain"));
@ -317,18 +287,21 @@ void setup()
JsonObject values = state.value();
int transitiontime = 4;
uint8_t tmp = EEPROM.read(EEPROM_LAST_STATE_STARTUP_ADDRESS);
if (values.containsKey("on"))
{
if (values["on"])
{
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);
}
} else {
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);
}
@ -389,26 +362,39 @@ void setup()
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"))
{
int startup = server.arg("startup").toInt();
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));
if (EEPROM.read(EEPROM_LAST_STATE_STARTUP_ADDRESS) != startup)
{
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.arg("tc") == "true")
{
if (tc_enabled == TIMING_CONTROL_DISABLED)
{
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));
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));
}
}
} else { // tc is set to false or something else
@ -416,22 +402,30 @@ void setup()
if (tc_enabled == TIMING_CONTROL_ENABLED)
{
tc_enabled = 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));
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));
}
}
}
}
// scene switch handling
if (server.hasArg("scene"))
{
scene = server.arg("scene").toInt();
EEPROM.write(EEPROM_SCENE_ADDRESS, scene);
EEPROM.commit();
Serial.print("Scene set to "); Serial.println(EEPROM.read(EEPROM_SCENE_ADDRESS));
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));
}
}
// process the received data for every light
for (int light = 0; light < LIGHTS_COUNT; light++)
{
@ -444,17 +438,18 @@ void setup()
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] = 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);
}
} else {
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);
}
@ -466,7 +461,9 @@ void setup()
}
if (server.hasArg("alert")) {
// start alerting for every light
if (server.hasArg("alert"))
{
if (light_state[light])
{
@ -477,6 +474,7 @@ void setup()
}
// switch the light
if (light_state[light])
{
step_level[light] = ((float)bri[light] - current_bri[light]) / transitiontime;
@ -487,7 +485,7 @@ void setup()
}
if (server.hasArg("resettc"))
{
{ // reqrite the tc config and reboot
tc_write_default();
ESP.reset();
}
@ -497,6 +495,7 @@ void setup()
ESP.reset();
}
// Generate HTML page
String http_content = "<!doctype html>";
http_content += "<html>";
http_content += "<head>";
@ -541,8 +540,12 @@ void setup()
http_content += "</div>";
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++)
{
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 + "=false\">OFF</a>";
http_content += "</div>";
http_content += "<div class=\"pure-control-group\">";
http_content += "<label for=\"state\"><strong>State</strong></label>";
http_content += "</div>";
@ -631,19 +635,4 @@ void setup()
});
server.onNotFound(handleNotFound);
tc_init();
server.begin();
} // end of setup
void loop()
{
server.handleClient();
lightEngine();
if (tc_enabled == TIMING_CONTROL_ENABLED)
{
tc_update();
}
}