Skip to content

Commit fecd940

Browse files
committed
WiFi response time
Improve Wi-Fi response time to 500ms by changing light sleep time and handling the response, before checking if a new CO2 measurement is available. Also added a new cleanup Menu function to refresh display on exit.
1 parent 9a5ff9a commit fecd940

File tree

2 files changed

+48
-56
lines changed

2 files changed

+48
-56
lines changed

OpenCO2_Sensor.ino

Lines changed: 28 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@
1414

1515
#define HEIGHT_ABOVE_SEA_LEVEL 50 // Berlin
1616
#define TZ_DATA "CET-1CEST,M3.5.0,M10.5.0/3" // Europe/Berlin time zone from https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv
17+
#define LIGHT_SLEEP_TIME 500
18+
#define DEEP_SLEEP_TIME 29500
1719

1820
/* Includes display */
1921
#include "DEV_Config.h"
2022
#include "epd_abstraction.h"
21-
#define DISPLAY_POWER 45
23+
#define DISPLAY_POWER GPIO_NUM_45
2224
#define LED_POWER GPIO_NUM_9
2325
#define USB_PRESENT GPIO_NUM_4
2426
#define BATTERY_VOLTAGE GPIO_NUM_5
@@ -324,7 +326,7 @@ void goto_deep_sleep(int ms) {
324326
/* Wakeup by IO0 button */
325327
rtc_gpio_pullup_en(BUTTON);
326328
rtc_gpio_pulldown_dis(BUTTON);
327-
esp_sleep_enable_ext1_wakeup(0x1,ESP_EXT1_WAKEUP_ANY_LOW); // 2^0 = GPIO_NUM_0 = BUTTON
329+
esp_sleep_enable_ext1_wakeup(0x1,ESP_EXT1_WAKEUP_ALL_LOW); // 2^0 = GPIO_NUM_0 = BUTTON
328330

329331
/* Keep LED enabled */
330332
if (LEDonBattery) gpio_hold_en(LED_POWER);
@@ -553,10 +555,11 @@ void toggleWiFi() {
553555
bool ip_shown = false;
554556
while (digitalRead(BUTTON) != 0) { // wait for button press
555557
delay(100);
558+
wifiManager.process();
556559
if (!ip_shown && WiFi.status() == WL_CONNECTED) {
560+
delay(100);
557561
ip_shown = true;
558562
displayWiFi(useWiFi); // to update displayed IP
559-
wifiManager.process();
560563
}
561564
if (BatteryMode && (digitalRead(USB_PRESENT) == HIGH)) { // power got connected
562565
BatteryMode = false;
@@ -667,19 +670,18 @@ void loop() {
667670
updateBatteryMode(); // check again in USB Power mode
668671
measureESP32temperature();
669672

670-
if (useWiFi && !BatteryMode) wifiManager.process();
673+
if (useWiFi && !BatteryMode) {
674+
if (WiFi.status() != WL_CONNECTED) wifiManager.process();
675+
#ifdef airgradient
676+
if (WiFi.status() == WL_CONNECTED) server.handleClient();
677+
#endif /* airgradient */
678+
}
671679

672680
bool isDataReady = false;
673681
uint16_t ready_error = scd4x.getDataReadyFlag(isDataReady);
674682
if (ready_error || !isDataReady) {
675-
// needed to overwrite displayed Menu
676-
displayWriteMeasuerments(co2, temperature, humidity);
677-
if (BatteryMode) displayBattery(calcBatteryPercentage(readBatteryVoltage()));
678-
else if (useWiFi) displayWiFiStrengh();
679-
updateDisplay();
680-
681-
if (BatteryMode) goto_deep_sleep(29000);
682-
else goto_light_sleep(4000);
683+
if (BatteryMode) goto_deep_sleep(DEEP_SLEEP_TIME);
684+
else goto_light_sleep(LIGHT_SLEEP_TIME);
683685
return; // otherwise continues running!
684686
}
685687

@@ -696,7 +698,7 @@ void loop() {
696698
/* don't update in Battery mode, unless CO2 has changed by 3% or temperature by 0.5°C */
697699
if (!TEST_MODE && BatteryMode && comingFromDeepSleep) {
698700
if ((abs(new_co2 - co2) < (0.03*co2)) && (fabs(new_temperature - temperature) < 0.5)) {
699-
goto_deep_sleep(30000);
701+
goto_deep_sleep(DEEP_SLEEP_TIME);
700702
}
701703
}
702704

@@ -706,31 +708,19 @@ void loop() {
706708
displayWriteMeasuerments(co2, temperature, humidity);
707709
}
708710

709-
if (useWiFi) {
710711
#ifdef MQTT
711-
if (!error && !BatteryMode) {
712-
if (WiFi.status() == WL_CONNECTED) {
713-
mqttClient.beginMessage("co2_ppm");
714-
mqttClient.print(co2);
715-
mqttClient.endMessage();
716-
mqttClient.beginMessage("temperature");
717-
mqttClient.print(temperature);
718-
mqttClient.endMessage();
719-
mqttClient.beginMessage("humidity");
720-
mqttClient.print(humidity);
721-
mqttClient.endMessage();
722-
}
723-
}
724-
#endif /* MQTT */
725-
726-
#ifdef airgradient
727-
if (!error && !BatteryMode) {
728-
if (WiFi.status() == WL_CONNECTED) {
729-
server.handleClient();
730-
}
731-
}
732-
#endif /* airgradient */
712+
if (!error && !BatteryMode && useWiFi && WiFi.status() == WL_CONNECTED) {
713+
mqttClient.beginMessage("co2_ppm");
714+
mqttClient.print(co2);
715+
mqttClient.endMessage();
716+
mqttClient.beginMessage("temperature");
717+
mqttClient.print(temperature);
718+
mqttClient.endMessage();
719+
mqttClient.beginMessage("humidity");
720+
mqttClient.print(humidity);
721+
mqttClient.endMessage();
733722
}
723+
#endif /* MQTT */
734724

735725
if (TEST_MODE) {
736726
#if ARDUINO_USB_CDC_ON_BOOT && !ARDUINO_USB_MODE
@@ -761,8 +751,8 @@ void loop() {
761751
scd4x.setTemperatureOffset(0.8);
762752
scd4x.startLowPowerPeriodicMeasurement();
763753
}
764-
goto_deep_sleep(29500);
754+
goto_deep_sleep(DEEP_SLEEP_TIME);
765755
}
766756

767-
goto_light_sleep(4000);
757+
goto_light_sleep(LIGHT_SLEEP_TIME);
768758
}

epd_abstraction.ino

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,14 @@ void changeFont(int font) {
3939
sml=fonts[font][2];
4040
}
4141

42+
void clearMenu() {
43+
refreshes = 1;
44+
displayWriteMeasuerments(co2, temperature, humidity);
45+
if (BatteryMode) displayBattery(calcBatteryPercentage(readBatteryVoltage()));
46+
else if (useWiFi) displayWiFiStrengh();
47+
updateDisplay();
48+
}
49+
4250
bool buttonPressedAgain = false;
4351
void handleButtonPress() {
4452
uint8_t selectedOption = 0;
@@ -52,7 +60,7 @@ void handleButtonPress() {
5260

5361
for (;;) {
5462
if ((millis() - menuStartTime) > 20000) { // display Menu up to 20 sec
55-
refreshes = 1;
63+
clearMenu();
5664
return;
5765
}
5866

@@ -67,35 +75,30 @@ void handleButtonPress() {
6775
switch (selectedOption) {
6876
case LED:
6977
LEDMenu();
70-
refreshes = 1;
71-
return;
78+
break;
7279
case DISPLAY_MENU:
7380
OptionsMenu();
74-
refreshes = 1;
75-
return;
81+
break;
7682
case CALIBRATE:
7783
calibrate();
78-
refreshes = 1;
79-
return;
84+
break;
8085
case HISTORY:
8186
history();
82-
refreshes = 1;
83-
return;
87+
break;
8488
case WLAN:
8589
toggleWiFi();
86-
refreshes = 1;
87-
return;
90+
break;
8891
case INFO:
8992
displayinfo();
9093
while (digitalRead(BUTTON) != 0) delay(100); // wait for button press
91-
refreshes = 1;
92-
return;
94+
break;
9395
case RAINBOW:
9496
rainbowMode();
9597
setLED(co2);
96-
refreshes = 1;
97-
return;
98+
break;
9899
}
100+
clearMenu();
101+
return;
99102
} else { // goto next Menu point
100103
buttonPressedAgain = true; // display at least once
101104
while (buttonPressedAgain) {
@@ -160,7 +163,6 @@ void LEDMenu() {
160163
preferences.end();
161164
break;
162165
case EXIT_LED:
163-
while(digitalRead(BUTTON) == 0) {} // wait until button is released
164166
return;
165167
}
166168
setLED(co2);
@@ -191,7 +193,7 @@ void OptionsMenu() {
191193
unsigned long menuStartTime = millis();
192194

193195
for (;;) {
194-
if ((millis() - menuStartTime) > 20000) return; // display up to 20 sec
196+
if ((millis() - menuStartTime) > 20000) return; // display up to 20 sec
195197
mspressed = 0;
196198
if (digitalRead(BUTTON) == 0) {
197199
while(digitalRead(BUTTON) == 0) { // calculate how long BUTTON is pressed
@@ -228,7 +230,6 @@ void OptionsMenu() {
228230
preferences.end();
229231
break;
230232
case EXIT_DISPLAY:
231-
while(digitalRead(BUTTON) == 0) {} // wait until button is released
232233
return;
233234
}
234235
displayOptionsMenu(selectedOption);
@@ -654,6 +655,7 @@ void displayWiFi(bool useWiFi) {
654655
Paint_Clear(BLACK);
655656

656657
if (useWiFi) {
658+
updateBatteryMode();
657659
if (BatteryMode) {
658660
if (english) {
659661
Paint_DrawString_EN(23, 52, "Wi-Fi: ON", &Font24, BLACK, WHITE);

0 commit comments

Comments
 (0)