From 68953d73906767b200a07400f397d5c9694592b9 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Wed, 21 Feb 2024 21:16:01 +0700 Subject: [PATCH 1/6] Update LED for PM and CO2 --- examples/ONE_I-9PSL/ONE_I-9PSL.ino | 164 ++++++++++++++++++++++++++--- 1 file changed, 150 insertions(+), 14 deletions(-) diff --git a/examples/ONE_I-9PSL/ONE_I-9PSL.ino b/examples/ONE_I-9PSL/ONE_I-9PSL.ino index 10b10bd..2d48f0d 100644 --- a/examples/ONE_I-9PSL/ONE_I-9PSL.ino +++ b/examples/ONE_I-9PSL/ONE_I-9PSL.ino @@ -1287,20 +1287,80 @@ static String getNormalizedMac() { } static void setRGBledCO2color(int co2Value) { - if (co2Value >= 300 && co2Value < 800) { - setRGBledColor('g'); - } else if (co2Value >= 800 && co2Value < 1000) { - setRGBledColor('y'); - } else if (co2Value >= 1000 && co2Value < 1500) { - setRGBledColor('o'); - } else if (co2Value >= 1500 && co2Value < 2000) { - setRGBledColor('r'); - } else if (co2Value >= 2000 && co2Value < 3000) { - setRGBledColor('p'); - } else if (co2Value >= 3000 && co2Value < 10000) { - setRGBledColor('z'); - } else { - setRGBledColor('n'); + if (co2Value <= 400) { + /** G; 1 */ + ag.ledBar.setColor(0, 255, 0, ag.ledBar.getNumberOfLeds() - 1); + } else if (co2Value <= 700) { + /** GG; 2 */ + ag.ledBar.setColor(0, 255, 0, ag.ledBar.getNumberOfLeds() - 1); + ag.ledBar.setColor(0, 255, 0, ag.ledBar.getNumberOfLeds() - 2); + } else if (co2Value <= 1000) { + /** YYY; 3 */ + ag.ledBar.setColor(255, 255, 0, ag.ledBar.getNumberOfLeds() - 1); + ag.ledBar.setColor(255, 255, 0, ag.ledBar.getNumberOfLeds() - 2); + ag.ledBar.setColor(255, 255, 0, ag.ledBar.getNumberOfLeds() - 3); + } else if (co2Value <= 1333) { + /** YYYY; 4 */ + ag.ledBar.setColor(255, 255, 0, ag.ledBar.getNumberOfLeds() - 1); + ag.ledBar.setColor(255, 255, 0, ag.ledBar.getNumberOfLeds() - 2); + ag.ledBar.setColor(255, 255, 0, ag.ledBar.getNumberOfLeds() - 3); + ag.ledBar.setColor(255, 255, 0, ag.ledBar.getNumberOfLeds() - 4); + } else if (co2Value <= 1666) { + /** YYYYY; 5 */ + ag.ledBar.setColor(255, 255, 0, ag.ledBar.getNumberOfLeds() - 1); + ag.ledBar.setColor(255, 255, 0, ag.ledBar.getNumberOfLeds() - 2); + ag.ledBar.setColor(255, 255, 0, ag.ledBar.getNumberOfLeds() - 3); + ag.ledBar.setColor(255, 255, 0, ag.ledBar.getNumberOfLeds() - 4); + ag.ledBar.setColor(255, 255, 0, ag.ledBar.getNumberOfLeds() - 5); + } else if (co2Value <= 2000) { + /** RRRRRR; 6 */ + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 1); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 2); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 3); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 4); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 5); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 6); + } else if (co2Value <= 2666) { + /** RRRRRRR; 7 */ + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 1); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 2); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 3); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 4); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 5); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 6); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 7); + } else if (co2Value <= 3333) { + /** RRRRRRRR; 8 */ + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 1); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 2); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 3); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 4); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 5); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 6); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 7); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 8); + } else if (co2Value <= 4000) { + /** RRRRRRRRR; 9 */ + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 1); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 2); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 3); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 4); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 5); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 6); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 7); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 8); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 9); + } else { /** > 4000 */ + /* PRPRPRPRP; 9 */ + ag.ledBar.setColor(153, 153, 0, ag.ledBar.getNumberOfLeds() - 1); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 2); + ag.ledBar.setColor(153, 153, 0, ag.ledBar.getNumberOfLeds() - 3); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 4); + ag.ledBar.setColor(153, 153, 0, ag.ledBar.getNumberOfLeds() - 5); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 6); + ag.ledBar.setColor(153, 153, 0, ag.ledBar.getNumberOfLeds() - 7); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 8); + ag.ledBar.setColor(153, 153, 0, ag.ledBar.getNumberOfLeds() - 9); } } @@ -1518,6 +1578,82 @@ static void setRGBledPMcolor(int pm25Value) { setRGBledColor('p'); if (pm25Value >= 250 && pm25Value < 1000) setRGBledColor('p'); + + if (pm25Value <= 5) { + /** G; 1 */ + ag.ledBar.setColor(0, 255, 0, ag.ledBar.getNumberOfLeds() - 1); + } else if (pm25Value <= 10) { + /** GG; 2 */ + ag.ledBar.setColor(0, 255, 0, ag.ledBar.getNumberOfLeds() - 1); + ag.ledBar.setColor(0, 255, 0, ag.ledBar.getNumberOfLeds() - 2); + } else if (pm25Value <= 20) { + /** YYY; 3 */ + ag.ledBar.setColor(255, 255, 0, ag.ledBar.getNumberOfLeds() - 1); + ag.ledBar.setColor(255, 255, 0, ag.ledBar.getNumberOfLeds() - 2); + ag.ledBar.setColor(255, 255, 0, ag.ledBar.getNumberOfLeds() - 3); + } else if (pm25Value <= 35) { + /** YYYY; 4 */ + ag.ledBar.setColor(255, 255, 0, ag.ledBar.getNumberOfLeds() - 1); + ag.ledBar.setColor(255, 255, 0, ag.ledBar.getNumberOfLeds() - 2); + ag.ledBar.setColor(255, 255, 0, ag.ledBar.getNumberOfLeds() - 3); + ag.ledBar.setColor(255, 255, 0, ag.ledBar.getNumberOfLeds() - 4); + } else if (pm25Value <= 45) { + /** YYYYY; 5 */ + ag.ledBar.setColor(255, 255, 0, ag.ledBar.getNumberOfLeds() - 1); + ag.ledBar.setColor(255, 255, 0, ag.ledBar.getNumberOfLeds() - 2); + ag.ledBar.setColor(255, 255, 0, ag.ledBar.getNumberOfLeds() - 3); + ag.ledBar.setColor(255, 255, 0, ag.ledBar.getNumberOfLeds() - 4); + ag.ledBar.setColor(255, 255, 0, ag.ledBar.getNumberOfLeds() - 5); + } else if (pm25Value <= 55) { + /** RRRRRR; 6 */ + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 1); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 2); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 3); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 4); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 5); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 6); + } else if (pm25Value <= 65) { + /** RRRRRRR; 7 */ + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 1); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 2); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 3); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 4); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 5); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 6); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 7); + } else if (pm25Value <= 150) { + /** RRRRRRRR; 8 */ + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 1); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 2); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 3); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 4); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 5); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 6); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 7); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 8); + } else if (pm25Value <= 250) { + /** RRRRRRRRR; 9 */ + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 1); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 2); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 3); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 4); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 5); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 6); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 7); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 8); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 9); + } else { /** > 250 */ + /* PRPRPRPRP; 9 */ + ag.ledBar.setColor(153, 153, 0, ag.ledBar.getNumberOfLeds() - 1); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 2); + ag.ledBar.setColor(153, 153, 0, ag.ledBar.getNumberOfLeds() - 3); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 4); + ag.ledBar.setColor(153, 153, 0, ag.ledBar.getNumberOfLeds() - 5); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 6); + ag.ledBar.setColor(153, 153, 0, ag.ledBar.getNumberOfLeds() - 7); + ag.ledBar.setColor(255, 0, 0, ag.ledBar.getNumberOfLeds() - 8); + ag.ledBar.setColor(153, 153, 0, ag.ledBar.getNumberOfLeds() - 9); + } } static void singleLedAnimation(uint8_t r, uint8_t g, uint8_t b) { From e636876c9b9d08615afaf0bce7550898d21e4c20 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Wed, 21 Feb 2024 21:16:12 +0700 Subject: [PATCH 2/6] Update .gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 5b3e8cf..4909c8a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ -.vscode *.DS_Store +build +.vscode From 7e3eabf09f16903e97b7c9c5a4b24da7169e0b72 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Wed, 21 Feb 2024 21:18:44 +0700 Subject: [PATCH 3/6] Remove old color set process for PM --- examples/ONE_I-9PSL/ONE_I-9PSL.ino | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/examples/ONE_I-9PSL/ONE_I-9PSL.ino b/examples/ONE_I-9PSL/ONE_I-9PSL.ino index 2d48f0d..44e5c28 100644 --- a/examples/ONE_I-9PSL/ONE_I-9PSL.ino +++ b/examples/ONE_I-9PSL/ONE_I-9PSL.ino @@ -1566,19 +1566,6 @@ static void co2Calibration(void) { * @param pm25Value PMS2.5 value */ static void setRGBledPMcolor(int pm25Value) { - if (pm25Value >= 0 && pm25Value < 10) - setRGBledColor('g'); - if (pm25Value >= 10 && pm25Value < 35) - setRGBledColor('y'); - if (pm25Value >= 35 && pm25Value < 55) - setRGBledColor('o'); - if (pm25Value >= 55 && pm25Value < 150) - setRGBledColor('r'); - if (pm25Value >= 150 && pm25Value < 250) - setRGBledColor('p'); - if (pm25Value >= 250 && pm25Value < 1000) - setRGBledColor('p'); - if (pm25Value <= 5) { /** G; 1 */ ag.ledBar.setColor(0, 255, 0, ag.ledBar.getNumberOfLeds() - 1); From 13f6c2c7473f39f3979231417269efdc71141ee8 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Mon, 26 Feb 2024 15:55:33 +0700 Subject: [PATCH 4/6] fix: Mqtt sending interval --- examples/ONE_I-9PSL/ONE_I-9PSL.ino | 51 ++++++++++++++++++++++++------ examples/Open_Air/Open_Air.ino | 48 +++++++++++++++++++++++----- 2 files changed, 82 insertions(+), 17 deletions(-) diff --git a/examples/ONE_I-9PSL/ONE_I-9PSL.ino b/examples/ONE_I-9PSL/ONE_I-9PSL.ino index 44e5c28..5215177 100644 --- a/examples/ONE_I-9PSL/ONE_I-9PSL.ino +++ b/examples/ONE_I-9PSL/ONE_I-9PSL.ino @@ -93,6 +93,7 @@ enum { #define DISP_UPDATE_INTERVAL 5000 /** ms */ #define SERVER_CONFIG_UPDATE_INTERVAL 30000 /** ms */ #define SERVER_SYNC_INTERVAL 60000 /** ms */ +#define MQTT_SYNC_INTERVAL 60000 /** ms */ #define SENSOR_CO2_CALIB_COUNTDOWN_MAX 5 /** sec */ #define SENSOR_TVOC_UPDATE_INTERVAL 1000 /** ms */ #define SENSOR_CO2_UPDATE_INTERVAL 5000 /** ms */ @@ -631,6 +632,7 @@ public: int connectionFailedCount(void) { return connectFailedCount; } }; AgMqtt agMqtt; +static TaskHandle_t mqttTask = NULL; /** Create airgradient instance for 'ONE_INDOOR' board */ AirGradient ag(ONE_INDOOR); @@ -684,6 +686,7 @@ static void co2Poll(void); static void showNr(void); static void webServerInit(void); static String getServerSyncData(bool localServer); +static void createMqttTask(void); /** Init schedule */ bool hasSensorS8 = true; @@ -754,6 +757,7 @@ void setup() { /** MQTT init */ if (agServer.getMqttBroker().isEmpty() == false) { if (agMqtt.begin(agServer.getMqttBroker())) { + createMqttTask(); Serial.println("MQTT client init success"); } else { Serial.println("MQTT client init failure"); @@ -965,6 +969,37 @@ static String getServerSyncData(bool localServer) { return JSON.stringify(root); } +static void createMqttTask(void) { + if (mqttTask) { + vTaskDelete(mqttTask); + mqttTask = NULL; + } + + xTaskCreate( + [](void *param) { + for (;;) { + delay(MQTT_SYNC_INTERVAL); + + /** Send data */ + if (agMqtt.isConnected()) { + String syncData = getServerSyncData(false); + String topic = "airgradient/readings/" + getDevId(); + if (agMqtt.publish(topic.c_str(), syncData.c_str(), + syncData.length())) { + Serial.println("Mqtt sync success"); + } else { + Serial.println("Mqtt sync failure"); + } + } + } + }, + "mqtt-task", 1024 * 3, NULL, 6, &mqttTask); + + if (mqttTask == NULL) { + Serial.println("Creat mqttTask failed"); + } +} + static void sendPing() { JSONVar root; root["wifi"] = WiFi.RSSI(); @@ -1518,8 +1553,14 @@ static void serverConfigPoll(void) { String mqttUri = agServer.getMqttBroker(); if (mqttUri != agMqtt.getUri()) { agMqtt.end(); + + if (mqttTask != NULL) { + vTaskDelete(mqttTask); + mqttTask = NULL; + } if (agMqtt.begin(mqttUri)) { Serial.println("Connect to new mqtt broker success"); + createMqttTask(); } else { Serial.println("Connect to new mqtt broker failed"); } @@ -1966,15 +2007,7 @@ static void sendDataToServer(void) { if (agServer.postToServer(getDevId(), syncData)) { resetWatchdog(); } - - if (agMqtt.isConnected()) { - String topic = "airgradient/readings/" + getDevId(); - if (agMqtt.publish(topic.c_str(), syncData.c_str(), syncData.length())) { - Serial.println("Mqtt sync success"); - } else { - Serial.println("Mqtt sync failure"); - } - } + bootCount++; } diff --git a/examples/Open_Air/Open_Air.ino b/examples/Open_Air/Open_Air.ino index 6838aa7..1132333 100644 --- a/examples/Open_Air/Open_Air.ino +++ b/examples/Open_Air/Open_Air.ino @@ -92,6 +92,7 @@ enum { #define DISP_UPDATE_INTERVAL 5000 /** ms */ #define SERVER_CONFIG_UPDATE_INTERVAL 30000 /** ms */ #define SERVER_SYNC_INTERVAL 60000 /** ms */ +#define MQTT_SYNC_INTERVAL 60000 /** ms */ #define SENSOR_CO2_CALIB_COUNTDOWN_MAX 5 /** sec */ #define SENSOR_TVOC_UPDATE_INTERVAL 1000 /** ms */ #define SENSOR_CO2_UPDATE_INTERVAL 5000 /** ms */ @@ -631,6 +632,7 @@ public: int connectionFailedCount(void) { return connectFailedCount; } }; AgMqtt agMqtt; +static TaskHandle_t mqttTask = NULL; /** Create airgradient instance for 'OPEN_AIR_OUTDOOR' board */ AirGradient ag(OPEN_AIR_OUTDOOR); @@ -701,6 +703,7 @@ static const char *getFwMode(int mode); static void showNr(void); static void webServerInit(void); static String getServerSyncData(bool localServer); +static void createMqttTask(void); bool hasSensorS8 = true; bool hasSensorPMS1 = true; @@ -734,6 +737,7 @@ void setup() { /** MQTT init */ if (agServer.getMqttBroker().isEmpty() == false) { if (agMqtt.begin(agServer.getMqttBroker())) { + createMqttTask(); Serial.println("MQTT client init success"); } else { Serial.println("MQTT client init failure"); @@ -793,14 +797,6 @@ static void sendDataToServer(void) { resetWatchdog(); } - if (agMqtt.isConnected()) { - String topic = "airgradient/readings/" + getDevId(); - if (agMqtt.publish(topic.c_str(), syncData.c_str(), syncData.length())) { - Serial.println("Mqtt sync success"); - } else { - Serial.println("Mqtt sync failure"); - } - } loopCount++; } @@ -1162,8 +1158,13 @@ static void serverConfigPoll(void) { String mqttUri = agServer.getMqttBroker(); if (mqttUri != agMqtt.getUri()) { agMqtt.end(); + if (mqttTask != NULL) { + vTaskDelete(mqttTask); + mqttTask = NULL; + } if (agMqtt.begin(mqttUri)) { Serial.println("Connect to new mqtt broker success"); + createMqttTask(); } else { Serial.println("Connect to new mqtt broker failed"); } @@ -1418,6 +1419,37 @@ static String getServerSyncData(bool localServer) { return JSON.stringify(root); } +static void createMqttTask(void) { + if (mqttTask) { + vTaskDelete(mqttTask); + mqttTask = NULL; + } + + xTaskCreate( + [](void *param) { + for (;;) { + delay(MQTT_SYNC_INTERVAL); + + /** Send data */ + if (agMqtt.isConnected()) { + String syncData = getServerSyncData(false); + String topic = "airgradient/readings/" + getDevId(); + if (agMqtt.publish(topic.c_str(), syncData.c_str(), + syncData.length())) { + Serial.println("Mqtt sync success"); + } else { + Serial.println("Mqtt sync failure"); + } + } + } + }, + "mqtt-task", 1024 * 3, NULL, 6, &mqttTask); + + if (mqttTask == NULL) { + Serial.println("Creat mqttTask failed"); + } +} + static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) { From cf5ff99d8a7faea7ee2d0e64cbb69adcb1d2ac25 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Mon, 26 Feb 2024 17:48:22 +0700 Subject: [PATCH 5/6] add Factory RESET --- examples/ONE_I-9PSL/ONE_I-9PSL.ino | 76 +++++++++++++++++++++++++++++- examples/Open_Air/Open_Air.ino | 76 ++++++++++++++++++++++++++++++ 2 files changed, 150 insertions(+), 2 deletions(-) diff --git a/examples/ONE_I-9PSL/ONE_I-9PSL.ino b/examples/ONE_I-9PSL/ONE_I-9PSL.ino index 5215177..550d3fa 100644 --- a/examples/ONE_I-9PSL/ONE_I-9PSL.ino +++ b/examples/ONE_I-9PSL/ONE_I-9PSL.ino @@ -153,6 +153,19 @@ public: loadConfig(); } + /** + * @brief Reset local config into default value. + * + */ + void defaultReset(void) { + config.inF = false; + config.inUSAQI = false; + memset(config.models, 0, sizeof(config.models)); + memset(config.mqttBrokers, 0, sizeof(config.mqttBrokers)); + config.useRGBLedBar = UseLedBarOff; + saveConfig(); + } + /** * @brief Get server configuration * @@ -687,6 +700,7 @@ static void showNr(void); static void webServerInit(void); static String getServerSyncData(bool localServer); static void createMqttTask(void); +static void factoryConfigReset(void); /** Init schedule */ bool hasSensorS8 = true; @@ -694,6 +708,7 @@ bool hasSensorPMS = true; bool hasSensorSGP = true; bool hasSensorSHT = true; int pmFailCount = 0; +uint32_t factoryBtnPressTime = 0; AgSchedule dispLedSchedule(DISP_UPDATE_INTERVAL, updateDispLedBar); AgSchedule configSchedule(SERVER_CONFIG_UPDATE_INTERVAL, serverConfigPoll); AgSchedule serverSchedule(SERVER_SYNC_INTERVAL, sendDataToServer); @@ -810,6 +825,9 @@ void loop() { /** Check for handle WiFi reconnect */ updateWiFiConnect(); + + /** factory reset handle */ + factoryConfigReset(); } static void setTestColor(char color) { @@ -1000,6 +1018,58 @@ static void createMqttTask(void) { } } +static void factoryConfigReset(void) { + if (ag.button.getState() == ag.button.BUTTON_PRESSED) { + if (factoryBtnPressTime == 0) { + factoryBtnPressTime = millis(); + } else { + uint32_t ms = (uint32_t)(millis() - factoryBtnPressTime); + if (ms >= 2000) { + // Show display message: For factory keep for x seconds + // Count display. + displayShowText("For factory reset", "keep pressed", "for 8 sec"); + + int count = 7; + while (ag.button.getState() == ag.button.BUTTON_PRESSED) { + delay(1000); + displayShowText("For factory reset", "keep pressed", + "for " + String(count) + " sec"); + count--; + // ms = (uint32_t)(millis() - factoryBtnPressTime); + if (count == 0) { + /** Stop MQTT task first */ + if (mqttTask) { + vTaskDelete(mqttTask); + mqttTask = NULL; + } + + /** Disconnect WIFI */ + WiFi.disconnect(); + wifiManager.resetSettings(); + + /** Reset local config */ + agServer.defaultReset(); + + displayShowText("Factory reset", "successful", ""); + delay(3000); + ESP.restart(); + } + } + + /** Show current content cause reset ignore */ + factoryBtnPressTime = 0; + appDispHandler(); + } + } + } else { + if (factoryBtnPressTime != 0) { + /** Restore last display content */ + appDispHandler(); + } + factoryBtnPressTime = 0; + } +} + static void sendPing() { JSONVar root; root["wifi"] = WiFi.RSSI(); @@ -1950,7 +2020,9 @@ static void updateWiFiConnect(void) { * */ static void updateDispLedBar(void) { - appDispHandler(); + if (factoryBtnPressTime == 0) { + appDispHandler(); + } appLedHandler(); } @@ -2007,7 +2079,7 @@ static void sendDataToServer(void) { if (agServer.postToServer(getDevId(), syncData)) { resetWatchdog(); } - + bootCount++; } diff --git a/examples/Open_Air/Open_Air.ino b/examples/Open_Air/Open_Air.ino index 1132333..a39392e 100644 --- a/examples/Open_Air/Open_Air.ino +++ b/examples/Open_Air/Open_Air.ino @@ -85,6 +85,8 @@ enum { #define LED_FAST_BLINK_DELAY 250 /** ms */ #define LED_SLOW_BLINK_DELAY 1000 /** ms */ +#define LED_SHORT_BLINK_DELAY 500 /** ms */ +#define LED_LONG_BLINK_DELAY 2000 /** ms */ #define WIFI_CONNECT_COUNTDOWN_MAX 180 /** sec */ #define WIFI_CONNECT_RETRY_MS 10000 /** ms */ #define LED_BAR_COUNT_INIT_VALUE (-1) /** */ @@ -153,6 +155,19 @@ public: loadConfig(); } + /** + * @brief Reset local config into default value. + * + */ + void defaultReset(void) { + config.inF = false; + config.inUSAQI = false; + memset(config.models, 0, sizeof(config.models)); + memset(config.mqttBrokers, 0, sizeof(config.mqttBrokers)); + config.useRGBLedBar = UseLedBarOff; + saveConfig(); + } + /** * @brief Get server configuration * @@ -704,11 +719,13 @@ static void showNr(void); static void webServerInit(void); static String getServerSyncData(bool localServer); static void createMqttTask(void); +static void factoryConfigReset(void); bool hasSensorS8 = true; bool hasSensorPMS1 = true; bool hasSensorPMS2 = true; bool hasSensorSGP = true; +uint32_t factoryBtnPressTime = 0; AgSchedule configSchedule(SERVER_CONFIG_UPDATE_INTERVAL, serverConfigPoll); AgSchedule serverSchedule(SERVER_SYNC_INTERVAL, sendDataToServer); AgSchedule co2Schedule(SENSOR_CO2_UPDATE_INTERVAL, co2Poll); @@ -777,6 +794,8 @@ void loop() { } } updateWiFiConnect(); + + factoryConfigReset(); } void sendPing() { @@ -1450,6 +1469,63 @@ static void createMqttTask(void) { } } +static void factoryConfigReset(void) { + if (ag.button.getState() == ag.button.BUTTON_PRESSED) { + if (factoryBtnPressTime == 0) { + factoryBtnPressTime = millis(); + } else { + uint32_t ms = (uint32_t)(millis() - factoryBtnPressTime); + if (ms >= 2000) { + Serial.println("Factory reset keep presssed for 8 sec"); + + uint32_t ledTime = millis(); + bool ledOn = true; + ag.statusLed.setOn(); + while (ag.button.getState() == ag.button.BUTTON_PRESSED) { + ms = (uint32_t)(millis() - ledTime); + if (ms >= LED_SHORT_BLINK_DELAY) { + ledTime = millis(); + ag.statusLed.setToggle(); + } + + ms = (uint32_t)(millis() - factoryBtnPressTime); + if (ms > 10000) { + ag.statusLed.setOff(); + + /** Stop MQTT task first */ + if (mqttTask) { + vTaskDelete(mqttTask); + mqttTask = NULL; + } + + /** Disconnect WIFI */ + WiFi.disconnect(); + wifiManager.resetSettings(); + + /** Reset local config */ + agServer.defaultReset(); + + Serial.println("Factory successful"); + ledBlinkDelay(LED_LONG_BLINK_DELAY); + ledBlinkDelay(LED_LONG_BLINK_DELAY); + ledBlinkDelay(LED_LONG_BLINK_DELAY); + ESP.restart(); + } + } + + /** Show current content cause reset ignore */ + factoryBtnPressTime = 0; + ag.statusLed.setOff(); + } + } + } else { + if (factoryBtnPressTime != 0) { + ag.statusLed.setOff(); + } + factoryBtnPressTime = 0; + } +} + static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) { From 0084b6fb9148adb9ddec1affa7f981728ddf2b0e Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Thu, 29 Feb 2024 08:39:05 +0700 Subject: [PATCH 6/6] fix: update cloud sync json `noxIndex` by `nox_index` --- examples/ONE_I-9PSL/ONE_I-9PSL.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/ONE_I-9PSL/ONE_I-9PSL.ino b/examples/ONE_I-9PSL/ONE_I-9PSL.ino index 550d3fa..74dde97 100644 --- a/examples/ONE_I-9PSL/ONE_I-9PSL.ino +++ b/examples/ONE_I-9PSL/ONE_I-9PSL.ino @@ -971,7 +971,7 @@ static String getServerSyncData(bool localServer) { root["tvoc_raw"] = tvocRawIndex; } if (noxIndex >= 0) { - root["noxIndex"] = noxIndex; + root["nox_index"] = noxIndex; } } if (hasSensorSHT) {