From 63ee301d2dfe63e55b48b0b7d648924d37e2de70 Mon Sep 17 00:00:00 2001 From: open Date: Thu, 2 Nov 2023 23:27:48 +0100 Subject: [PATCH] feat: preferences should work --- .gitignore | 1 + esp32-timed-switch.ino | 169 +++++++++++++++++++++++++++-------------- 2 files changed, 112 insertions(+), 58 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..722d5e7 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.vscode diff --git a/esp32-timed-switch.ino b/esp32-timed-switch.ino index b27646f..0571beb 100644 --- a/esp32-timed-switch.ino +++ b/esp32-timed-switch.ino @@ -10,14 +10,14 @@ // Init const and global objects -// Preferences +// PREFRENCES Preferences preferences; #define RW_MODE false #define RO_MODE true -// Wifi -const char* ssid = "Wokwi-GUEST"; -const char* password = ""; +// WIFI +const char* ssid = "/tmp/lab"; +const char* password = "bitte2cucung"; const uint8_t wifi_loop_max = 10; // NTP @@ -27,59 +27,73 @@ const char* ntpServer2 = "time.nist.gov"; const long gmtOffset_sec = 2 * 3600; // GMT + 2 const int daylightOffset_sec = 0; -// Timer +// TIMER hw_timer_t*timer_main = NULL; uint32_t timer_interval = 3000000; uint16_t timer_interval_in_secs = timer_interval / 1000000; ; -// Scheduler -bool scheduler_flag = true; +// SCHEDULER +bool brun_scheduler = true; uint8_t current_hour = HOUR_DEFAULT; uint8_t current_minute = MINUTE_DEFAULT; uint8_t current_second = 0; uint32_t current_ts = 0; uint32_t next_event_ts = 0; -uint16_t scheduler_1[24] = {A60,A60,A60,A60,A60,A60,A60,A60,A60,A60,A60,A60,A60,A60,A60,A60,A60,A60,A60,A60,A60,A60,A60,A60}; -uint16_t scheduler_2[24] = {A00,A00,A00,A00,A00,A00,A00,A00,A00,A00,A00,A00,A00,A00,A00,A00,A00,A00,A00,A00,A00,A00,A00,A00}; -uint16_t* scheduler_list[] = { +int scheduler_1[24] ; // = {A60,A60,A60,A60,A60,A60,A60,A60,A60,A60,A60,A60,A60,A60,A60,A60,A60,A60,A60,A60,A60,A60,A60,A60}; +int scheduler_2[24] ; // = {A00,A00,A00,A00,A00,A00,A00,A00,A00,A00,A00,A00,A00,A00,A00,A00,A00,A00,A00,A00,A00,A00,A00,A00}; +int* scheduler_list[] = { scheduler_1, scheduler_2 }; -// Pins and Hardware -unsigned int PIN_1 = 2; -unsigned int PIN_2 = 4; +// PINS +unsigned int PIN_1 = 12; +unsigned int PIN_2 = 14; +unsigned int PIN_3 = 27; +unsigned int PIN_4 = 26; +unsigned int PIN_5 = 20; +unsigned int PIN_6 = 33; +unsigned int PIN_7 = 32; +unsigned int PIN_8 = 35; unsigned int pin_list[2] = { PIN_1, PIN_2 }; -// ---------------------------------------------------------------------- +// HTTP +WiFiClient http_client; +WiFiServer http_server(80); +String request; + + // Local functions -// ---------------------------------------------------------------------- // Time helper uint32_t get_timestamp( uint8_t hour, uint8_t minute, uint8_t second){ return ( 3600 * hour + 60 * minute + second) % 86400; } -// Naive Timestamp based event igniter -bool scheduler_event_fire( uint32_t current_ts, uint32_t event_ts ){ +bool event_keep_waiting( uint32_t current_ts, uint32_t event_ts ){ - // basic case = ts:11h41m11s versus ev:11h44m0s - // ts < ev means wait + // basic case + // ts: 11h 41m 11s + // ev: 11h 44m 0s + // ts < ev => TRUE if ( current_ts < event_ts ){ - return false; + return true; } - // if time looped at midnight = ts:23h57m21s versus ev:0h1m0s - // in case of high against very low values ts > ev means wait + // if time looped at midnight + // ts: 23h 57m 21s + // ev: 0h 1m 0s + // ts > ev => TRUE (for high to very low values ) if( (current_ts - event_ts) > 600 && event_ts < 300 ) { - return false; + return true; } - // ts:11h44m11s versus ev:11h44m0s - // ts > ev means fire event - return true; + // ts: 11h 44m 11s + // ev: 11h 44m 0s + // ts > ev => FALSE + return false; } @@ -93,11 +107,12 @@ void timeavailable(struct timeval *t) // TIMER Callback void IRAM_ATTR onTimer(){ - scheduler_flag = true; + brun_scheduler = true; } -// updater local time variables for NTP and no FTP cases -void scheduler_time_update(){ + +void run_scheduler(){ + // Serial.println("onTimer::run"); // Get the current time via NTP, or downgrade if ( sntp_initialized ){ struct tm timeinfo; @@ -124,19 +139,13 @@ void scheduler_time_update(){ } } } + } -} - -// Scheduler's main loop -void scheduler_action(){ - - // Serial.println("onTimer::run"); - scheduler_time_update(); // If not expected to run exit current_ts = get_timestamp( current_hour, current_minute, current_second ); - // Serial.printf("onTimer::check event %d %d\n", current_ts, next_event_ts); - if( ! scheduler_event_fire( current_ts, next_event_ts ) ){ + Serial.printf("onTimer::check event %d %d\n", current_ts, next_event_ts); + if( event_keep_waiting( current_ts, next_event_ts ) ){ return; } @@ -147,11 +156,11 @@ void scheduler_action(){ // Run the relays reconfiguration for ( int i = 0; i < 2; i++ ) { // Get a pointer to the current array - uint16_t* scheduler = scheduler_list[i]; + int* scheduler = scheduler_list[i]; unsigned int pin = pin_list[i]; // Set the expected status uint8_t minutes_by_5 = (current_minute / 5); - uint16_t hourly_12_values = scheduler[current_hour]; + int hourly_12_values = scheduler[current_hour]; // Serial.printf("Check hour(%d) >> minutes(%d x 5)\n", hourly_12_values, minutes_by_5); char buffer[40]; @@ -170,10 +179,6 @@ void scheduler_action(){ return; } -// ---------------------------------------------------------------------- -// Arduino functions -// ---------------------------------------------------------------------- - void setup(){ // HARDWARE @@ -182,36 +187,36 @@ void setup(){ Serial.println("Starting."); pinMode(PIN_1, OUTPUT); pinMode(PIN_2, OUTPUT); - // PREFERENCES Serial.println("Setup::PREFERENCES"); preferences.begin(PREF_NAMESPACE, RW_MODE); - bool pref_init = preferences.isKey("init"); + preferences.clear(); + + bool pref_init = preferences.isKey("test"); if (pref_init == false) { - preferences.putBool ("init", true); + Serial.println("preferences not exist"); + preferences.putBool("test", true); preferences.putBytes(RELAY_1_SCHEDULE, scheduler_1_default, sizeof(scheduler_1_default)); preferences.putBytes(RELAY_2_SCHEDULE, scheduler_2_default, sizeof(scheduler_2_default)); /// ... more to come } - // huh this causes a crash + bool test = preferences.getBool("test"); preferences.getBytes(RELAY_1_SCHEDULE, scheduler_1, preferences.getBytesLength(RELAY_1_SCHEDULE)); preferences.getBytes(RELAY_2_SCHEDULE, scheduler_2, preferences.getBytesLength(RELAY_2_SCHEDULE)); preferences.end(); + Serial.println("Setup::PREFERENCES::end"); // WIFI Serial.println("Setup::WIFI"); Serial.printf("Connecting to %s ", ssid); WiFi.begin(ssid, password); uint8_t wifi_loop_count = 0; - while (WiFi.status() != WL_CONNECTED && wifi_loop_count < wifi_loop_max ) { - delay(500); + while (WiFi.status() != WL_CONNECTED or wifi_loop_count < wifi_loop_max ) { + delay(1000); wifi_loop_count++; Serial.print("."); } - Serial.print("Connect to IP Address: "); - Serial.print("http://"); - Serial.println(WiFi.localIP()); - + // TIMER Serial.println("Setup::Timer"); timer_main = timerBegin(0, 80, true); @@ -232,15 +237,63 @@ void setup(){ // HTTP Serial.println("Setup::HTTP"); + http_server.begin(); + Serial.print("Connect to IP Address: "); + Serial.print("http://"); + Serial.println(WiFi.localIP()); + // Todo } + + +void html() { + http_client.println("HTTP/1.1 200 OK"); + http_client.println("Content-Type: text/html"); + http_client.println("Connection: close"); + http_client.println(); + + http_client.println(""); + http_client.println(""); + http_client.println(""); + http_client.println(""); + +} + void loop(){ - if( scheduler_flag == true ){ - scheduler_flag = false; - scheduler_action(); + if( brun_scheduler == true ){ + brun_scheduler = false; + run_scheduler(); } - delay(1000); + + http_client = http_server.available(); + if (!http_client) { + return; + } + + while (http_client.connected()) { + if (http_client.available()) { + char c = http_client.read(); + + request += c; + + if (c == '\n') { + String postres = http_client.readString(); + int indp = postres.indexOf("progo=")+6; + Serial.println(postres); + Serial.println(request); + + + html(); + break; + } + } + } + + delay(1); + request = ""; + http_client.stop(); + }