diff --git a/src/main.cpp b/src/main.cpp index c6a0088..f942395 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -74,6 +74,7 @@ DHT dht(DHT22_PIN, DHTTYPE); SDS011 sds; volatile unsigned long geiger_counts = 0; unsigned long geiger_previousMillis; +unsigned long last_wifi_activity = 0; struct __attribute__((packed)) SENSOR_DATA { float temperature; @@ -88,6 +89,42 @@ struct __attribute__((packed)) SENSOR_DATA { float rssi; } sd; + +void sendESPNOW() { + unsigned long espnowmillis = millis(); + uint8_t remoteMac[] = {0x5C, 0xCF, 0x7F, 0x5, 0xFD, 0xF0}; + #define WIFI_CHANNEL 1 + + WiFi.forceSleepWake(); + delay(1); // yield(); + digitalWrite(LED_BUILTIN, LOW); + WiFi.persistent(false); // don't load and save credentials to flash + WiFi.mode(WIFI_STA); + if (esp_now_init()==0) { + if(esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER)==0){ + + esp_now_add_peer(remoteMac, ESP_NOW_ROLE_SLAVE, WIFI_CHANNEL, NULL, 0); + u8 bs[sizeof(sd)]; + memcpy(bs, &sd, sizeof(sd)); + for (int i=0; i<20; i++) + esp_now_send(NULL, bs, sizeof(sd)); // max ESP_NOW_MAX_DATA_LEN + + } else { + Serial.println("error configuring ESP NOW"); + } + } else { + Serial.println("error initializing ESP NOW"); + } + last_wifi_activity = millis(); + esp_now_deinit(); + WiFi.mode(WIFI_OFF); + WiFi.forceSleepBegin(); + delay(1); // yield(); + digitalWrite(LED_BUILTIN, HIGH); +// Serial.printf("sendESPNOW() took %d ms\n", millis()-espnowmillis); +} + + void ICACHE_FLASH_ATTR sendValues() { sd.temperature = dht.readTemperature(); sd.humidity = dht.readHumidity(); @@ -178,16 +215,18 @@ void ICACHE_FLASH_ATTR sendValues() { wifiMulti.addAP("LNet", "password2"); wifiMulti.addAP("Freifunk", ""); int tries = 0; + constexpr unsigned int retry_delay = 500; while (wifiMulti.run() != WL_CONNECTED) { tries++; Serial.print("."); - if (tries > 20) { + if (tries*retry_delay >= powerbankInterval) { Serial.println(" [ERROR]"); Serial.println("Retrying in 10 seconds.."); + sendESPNOW(); delay(powerbankInterval); ESP.restart(); } - delay(500); + delay(retry_delay); } Serial.println(" [CONNECTED]"); Serial.print("IP address: "); @@ -218,6 +257,7 @@ void ICACHE_FLASH_ATTR sendValues() { } + last_wifi_activity = millis(); WiFi.disconnect(); WiFi.mode(WIFI_OFF); WiFi.forceSleepBegin(); @@ -225,38 +265,6 @@ void ICACHE_FLASH_ATTR sendValues() { } -void sendESPNOW() { - unsigned long espnowmillis = millis(); - uint8_t remoteMac[] = {0x5C, 0xCF, 0x7F, 0x5, 0xFD, 0xF0}; - #define WIFI_CHANNEL 1 - - WiFi.forceSleepWake(); - delay(1); // yield(); - digitalWrite(LED_BUILTIN, LOW); - WiFi.persistent(false); // don't load and save credentials to flash - WiFi.mode(WIFI_STA); - if (esp_now_init()==0) { - if(esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER)==0){ - - esp_now_add_peer(remoteMac, ESP_NOW_ROLE_SLAVE, WIFI_CHANNEL, NULL, 0); - u8 bs[sizeof(sd)]; - memcpy(bs, &sd, sizeof(sd)); - for (int i=0; i<20; i++) - esp_now_send(NULL, bs, sizeof(sd)); // max ESP_NOW_MAX_DATA_LEN - - } else { - Serial.println("error configuring ESP NOW"); - } - } else { - Serial.println("error initializing ESP NOW"); - } - esp_now_deinit(); - WiFi.mode(WIFI_OFF); - WiFi.forceSleepBegin(); - delay(1); // yield(); - digitalWrite(LED_BUILTIN, HIGH); -// Serial.printf("sendESPNOW() took %d ms\n", millis()-espnowmillis); -} void ICACHE_RAM_ATTR ISR_geiger_impulse() { geiger_counts++; @@ -287,6 +295,7 @@ void setup() { void loop() { sendValues(); + /* keep powerbank happy */ for(int i=0; i<(postingInterval/powerbankInterval)-1; i++) { delay(powerbankInterval);