From 812c2ab803556ea76f64bc034751b7a96dc8d4bb Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Sat, 20 Jul 2024 08:53:19 +0700 Subject: [PATCH 01/24] add PMS5003T get module firmware version code --- src/PMS/PMS.cpp | 7 +++++++ src/PMS/PMS.h | 1 + src/PMS/PMS5003T.cpp | 9 ++++++++- src/PMS/PMS5003T.h | 2 ++ 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/PMS/PMS.cpp b/src/PMS/PMS.cpp index e9a1527..8d7c957 100644 --- a/src/PMS/PMS.cpp +++ b/src/PMS/PMS.cpp @@ -245,6 +245,13 @@ uint16_t PMSBase::getTemp(void) { return toValue(&package[24]); } */ uint16_t PMSBase::getHum(void) { return toValue(&package[26]); } +/** + * @brief Get PMS500T firmware version code + * + * @return uint8_t + */ +uint8_t PMSBase::getFirmwareVersion(void) { return package[28]; } + /** * @brief Convert PMS2.5 to US AQI unit * diff --git a/src/PMS/PMS.h b/src/PMS/PMS.h index 4fa086a..6131390 100644 --- a/src/PMS/PMS.h +++ b/src/PMS/PMS.h @@ -26,6 +26,7 @@ public: /** For PMS5003T*/ uint16_t getTemp(void); uint16_t getHum(void); + uint8_t getFirmwareVersion(void); int pm25ToAQI(int pm02); diff --git a/src/PMS/PMS5003T.cpp b/src/PMS/PMS5003T.cpp index f0f9a1d..296023d 100644 --- a/src/PMS/PMS5003T.cpp +++ b/src/PMS/PMS5003T.cpp @@ -102,7 +102,7 @@ bool PMS5003T::begin(void) { return false; } #endif - + _ver = pms.getFirmwareVersion(); this->_isBegin = true; return true; } @@ -161,6 +161,13 @@ float PMS5003T::getRelativeHumidity(void) { return pms.getHum()/10.0f; } +/** + * @brief Get module(s) firmware version + * + * @return int Version code + */ +int PMS5003T::getFirmwareVersion(void) { return _ver; } + /** * @brief Check device initialized or not * diff --git a/src/PMS/PMS5003T.h b/src/PMS/PMS5003T.h index 2c99b7e..821d946 100644 --- a/src/PMS/PMS5003T.h +++ b/src/PMS/PMS5003T.h @@ -29,10 +29,12 @@ public: int convertPm25ToUsAqi(int pm25); float getTemperature(void); float getRelativeHumidity(void); + int getFirmwareVersion(void); private: bool _isBegin = false; bool _isSleep = false; + int _ver; /** Firmware version code */ BoardType _boardDef; const BoardDef *bsp; From 01943f594dbfe6db4de46323f7066574639595af Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Mon, 29 Jul 2024 13:20:07 +0700 Subject: [PATCH 02/24] Send PMS5003T firmware version to cloud --- src/AgValue.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/AgValue.cpp b/src/AgValue.cpp index b0cd3a0..02a1590 100644 --- a/src/AgValue.cpp +++ b/src/AgValue.cpp @@ -121,6 +121,9 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, } } } + if (!localServer) { + root["PMS5003T_FwVer"] = ag->pms5003t_1.getFirmwareVersion(); + } } if (config->hasSensorPMS2) { if(utils::isValidPMS(this->pm01_2)) { @@ -157,6 +160,9 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, } } } + if(!localServer) { + root["PMS5003T_FwVer"] = ag->pms5003t_1.getFirmwareVersion(); + } } } else { if (fwMode == FW_MODE_O_1P) { @@ -193,6 +199,9 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, } } } + if(!localServer) { + root["PMS5003T_FwVer"] = ag->pms5003t_1.getFirmwareVersion(); + } } else if (config->hasSensorPMS2) { if(utils::isValidPMS(this->pm01_2)) { root["pm01"] = this->pm01_2; @@ -226,6 +235,9 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, } } } + if(!localServer) { + root["PMS5003T_FwVer"] = ag->pms5003t_2.getFirmwareVersion(); + } } } else { float val; @@ -262,6 +274,11 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, } } } + + // PMS5003T version + if(!localServer) { + root["channels"]["1"]["PMS5003T_FwVer"] = ag->pms5003t_1.getFirmwareVersion(); + } } if (config->hasSensorPMS2) { float val; @@ -297,6 +314,10 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, } } } + // PMS5003T version + if(!localServer) { + root["channels"]["2"]["PMS5003T_FwVer"] = ag->pms5003t_2.getFirmwareVersion(); + } } } } From 040bd28038328cf3925b9fd7f549bb528b2141a6 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Wed, 7 Aug 2024 08:50:43 +0700 Subject: [PATCH 03/24] Add report PMS5003 and PMS5003T firmware version --- src/AgValue.cpp | 56 +++++++++++++++++++++++++++++++++++++++----- src/AgValue.h | 3 +++ src/PMS/PMS.cpp | 9 ++++++- src/PMS/PMS.h | 1 + src/PMS/PMS5003.cpp | 16 ++++++++++++- src/PMS/PMS5003.h | 3 +++ src/PMS/PMS5003T.cpp | 7 ++++++ src/PMS/PMS5003T.h | 1 + 8 files changed, 88 insertions(+), 8 deletions(-) diff --git a/src/AgValue.cpp b/src/AgValue.cpp index 02a1590..e66c8b4 100644 --- a/src/AgValue.cpp +++ b/src/AgValue.cpp @@ -4,6 +4,39 @@ #include "Main/utils.h" #include "Libraries/Arduino_JSON/src/Arduino_JSON.h" +#define json_prop_pmsFirmware "pmsFirmware" + +/** + * @brief Get PMS5003 firmware version string + * + * @param fwCode + * @return String + */ +String Measurements::pms5003FirmwareVersion(int fwCode) { + return pms5003FirmwareVersionBase("PMS5003", fwCode); +} + +/** + * @brief Get PMS5003T firmware version string + * + * @param fwCode + * @return String + */ +String Measurements::pms5003TFirmwareVersion(int fwCode) { + return pms5003FirmwareVersionBase("PMS5003T", fwCode); +} + +/** + * @brief Get firmware version string + * + * @param prefix Prefix firmware string + * @param fwCode Version code + * @return string + */ +String Measurements::pms5003FirmwareVersionBase(String prefix, int fwCode) { + return prefix + String("-") + String(fwCode); +} + String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, void *_ag, void *_config) { AirGradient *ag = (AirGradient *)_ag; @@ -33,6 +66,11 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, if (utils::isValidPMS03Count(this->pm03PCount_1)) { root["pm003Count"] = this->pm03PCount_1; } + if (!localServer) { + + root[json_prop_pmsFirmware] = + this->pms5003FirmwareVersion(ag->pms5003.getFirmwareVersion()); + } } if (config->hasSensorSHT) { @@ -122,7 +160,8 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, } } if (!localServer) { - root["PMS5003T_FwVer"] = ag->pms5003t_1.getFirmwareVersion(); + root[json_prop_pmsFirmware] = + pms5003TFirmwareVersion(ag->pms5003t_1.getFirmwareVersion()); } } if (config->hasSensorPMS2) { @@ -161,7 +200,8 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, } } if(!localServer) { - root["PMS5003T_FwVer"] = ag->pms5003t_1.getFirmwareVersion(); + root[json_prop_pmsFirmware] = + pms5003TFirmwareVersion(ag->pms5003t_1.getFirmwareVersion()); } } } else { @@ -200,7 +240,8 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, } } if(!localServer) { - root["PMS5003T_FwVer"] = ag->pms5003t_1.getFirmwareVersion(); + root[json_prop_pmsFirmware] = + pms5003TFirmwareVersion(ag->pms5003t_1.getFirmwareVersion()); } } else if (config->hasSensorPMS2) { if(utils::isValidPMS(this->pm01_2)) { @@ -236,7 +277,8 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, } } if(!localServer) { - root["PMS5003T_FwVer"] = ag->pms5003t_2.getFirmwareVersion(); + root[json_prop_pmsFirmware] = + pms5003TFirmwareVersion(ag->pms5003t_2.getFirmwareVersion()); } } } else { @@ -277,7 +319,8 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, // PMS5003T version if(!localServer) { - root["channels"]["1"]["PMS5003T_FwVer"] = ag->pms5003t_1.getFirmwareVersion(); + root["channels"]["1"][json_prop_pmsFirmware] = + pms5003TFirmwareVersion(ag->pms5003t_1.getFirmwareVersion()); } } if (config->hasSensorPMS2) { @@ -316,7 +359,8 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, } // PMS5003T version if(!localServer) { - root["channels"]["2"]["PMS5003T_FwVer"] = ag->pms5003t_2.getFirmwareVersion(); + root["channels"]["2"][json_prop_pmsFirmware] = + pms5003TFirmwareVersion(ag->pms5003t_2.getFirmwareVersion()); } } } diff --git a/src/AgValue.h b/src/AgValue.h index 3176482..1957828 100644 --- a/src/AgValue.h +++ b/src/AgValue.h @@ -6,6 +6,9 @@ class Measurements { private: + String pms5003FirmwareVersion(int fwCode); + String pms5003TFirmwareVersion(int fwCode); + String pms5003FirmwareVersionBase(String prefix, int fwCode); public: Measurements() { pm25_1 = -1; diff --git a/src/PMS/PMS.cpp b/src/PMS/PMS.cpp index 8d7c957..dcb516a 100644 --- a/src/PMS/PMS.cpp +++ b/src/PMS/PMS.cpp @@ -246,12 +246,19 @@ uint16_t PMSBase::getTemp(void) { return toValue(&package[24]); } uint16_t PMSBase::getHum(void) { return toValue(&package[26]); } /** - * @brief Get PMS500T firmware version code + * @brief Get firmware version code * * @return uint8_t */ uint8_t PMSBase::getFirmwareVersion(void) { return package[28]; } +/** + * @brief Ge PMS5003 error code + * + * @return uint8_t + */ +uint8_t PMSBase::getErrorCode(void) { return package[29]; } + /** * @brief Convert PMS2.5 to US AQI unit * diff --git a/src/PMS/PMS.h b/src/PMS/PMS.h index 6131390..38bdb45 100644 --- a/src/PMS/PMS.h +++ b/src/PMS/PMS.h @@ -27,6 +27,7 @@ public: uint16_t getTemp(void); uint16_t getHum(void); uint8_t getFirmwareVersion(void); + uint8_t getErrorCode(void); int pm25ToAQI(int pm02); diff --git a/src/PMS/PMS5003.cpp b/src/PMS/PMS5003.cpp index 0c1ea83..7325240 100644 --- a/src/PMS/PMS5003.cpp +++ b/src/PMS/PMS5003.cpp @@ -78,7 +78,7 @@ bool PMS5003::begin(void) { return false; } #endif - + _ver = pms.getFirmwareVersion(); this->_isBegin = true; return true; } @@ -121,6 +121,20 @@ int PMS5003::getPm03ParticleCount(void) { */ int PMS5003::convertPm25ToUsAqi(int pm25) { return pms.pm25ToAQI(pm25); } +/** + * @brief Get sensor firmware version + * + * @return int + */ +int PMS5003::getFirmwareVersion(void) { return _ver; } + +/** + * @brief Get sensor error code + * + * @return uint8_t + */ +uint8_t PMS5003::getErrorCode(void) { return pms.getErrorCode(); } + /** * @brief Check device initialized or not * diff --git a/src/PMS/PMS5003.h b/src/PMS/PMS5003.h index cd66b07..3ed63aa 100644 --- a/src/PMS/PMS5003.h +++ b/src/PMS/PMS5003.h @@ -24,9 +24,12 @@ public: int getPm10Ae(void); int getPm03ParticleCount(void); int convertPm25ToUsAqi(int pm25); + int getFirmwareVersion(void); + uint8_t getErrorCode(void); private: bool _isBegin = false; + int _ver; BoardType _boardDef; PMSBase pms; const BoardDef *bsp; diff --git a/src/PMS/PMS5003T.cpp b/src/PMS/PMS5003T.cpp index 7ea6d74..1f48ebd 100644 --- a/src/PMS/PMS5003T.cpp +++ b/src/PMS/PMS5003T.cpp @@ -171,6 +171,13 @@ float PMS5003T::getRelativeHumidity(void) { */ int PMS5003T::getFirmwareVersion(void) { return _ver; } +/** + * @brief Get sensor error code + * + * @return uint8_t + */ +uint8_t PMS5003T::getErrorCode(void) { return pms.getErrorCode(); } + /** * @brief Check device initialized or not * diff --git a/src/PMS/PMS5003T.h b/src/PMS/PMS5003T.h index 821d946..0a0b1dc 100644 --- a/src/PMS/PMS5003T.h +++ b/src/PMS/PMS5003T.h @@ -30,6 +30,7 @@ public: float getTemperature(void); float getRelativeHumidity(void); int getFirmwareVersion(void); + uint8_t getErrorCode(void); private: bool _isBegin = false; From 6d0136688731d0cb18f07e2e4b64ae2e7f0b9c76 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Thu, 15 Aug 2024 08:04:30 +0700 Subject: [PATCH 04/24] change `pmsFirmare` to `firmware` --- src/AgValue.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/AgValue.cpp b/src/AgValue.cpp index e66c8b4..090e3b7 100644 --- a/src/AgValue.cpp +++ b/src/AgValue.cpp @@ -4,7 +4,7 @@ #include "Main/utils.h" #include "Libraries/Arduino_JSON/src/Arduino_JSON.h" -#define json_prop_pmsFirmware "pmsFirmware" +#define json_prop_pmFirmware "firmware" /** * @brief Get PMS5003 firmware version string @@ -68,7 +68,7 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, } if (!localServer) { - root[json_prop_pmsFirmware] = + root[json_prop_pmFirmware] = this->pms5003FirmwareVersion(ag->pms5003.getFirmwareVersion()); } } @@ -160,7 +160,7 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, } } if (!localServer) { - root[json_prop_pmsFirmware] = + root[json_prop_pmFirmware] = pms5003TFirmwareVersion(ag->pms5003t_1.getFirmwareVersion()); } } @@ -200,7 +200,7 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, } } if(!localServer) { - root[json_prop_pmsFirmware] = + root[json_prop_pmFirmware] = pms5003TFirmwareVersion(ag->pms5003t_1.getFirmwareVersion()); } } @@ -240,7 +240,7 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, } } if(!localServer) { - root[json_prop_pmsFirmware] = + root[json_prop_pmFirmware] = pms5003TFirmwareVersion(ag->pms5003t_1.getFirmwareVersion()); } } else if (config->hasSensorPMS2) { @@ -277,7 +277,7 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, } } if(!localServer) { - root[json_prop_pmsFirmware] = + root[json_prop_pmFirmware] = pms5003TFirmwareVersion(ag->pms5003t_2.getFirmwareVersion()); } } @@ -319,7 +319,7 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, // PMS5003T version if(!localServer) { - root["channels"]["1"][json_prop_pmsFirmware] = + root["channels"]["1"][json_prop_pmFirmware] = pms5003TFirmwareVersion(ag->pms5003t_1.getFirmwareVersion()); } } @@ -359,7 +359,7 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, } // PMS5003T version if(!localServer) { - root["channels"]["2"][json_prop_pmsFirmware] = + root["channels"]["2"][json_prop_pmFirmware] = pms5003TFirmwareVersion(ag->pms5003t_2.getFirmwareVersion()); } } From 81b13134d2a79dc4ff9c99a0bc3632042479f2ef Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Fri, 16 Aug 2024 06:42:43 +0700 Subject: [PATCH 05/24] update PM2.5 firmware prefix to `PMS5003x` --- src/AgValue.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/AgValue.cpp b/src/AgValue.cpp index 090e3b7..fc13dcb 100644 --- a/src/AgValue.cpp +++ b/src/AgValue.cpp @@ -13,7 +13,7 @@ * @return String */ String Measurements::pms5003FirmwareVersion(int fwCode) { - return pms5003FirmwareVersionBase("PMS5003", fwCode); + return pms5003FirmwareVersionBase("PMS5003x", fwCode); } /** @@ -23,7 +23,7 @@ String Measurements::pms5003FirmwareVersion(int fwCode) { * @return String */ String Measurements::pms5003TFirmwareVersion(int fwCode) { - return pms5003FirmwareVersionBase("PMS5003T", fwCode); + return pms5003FirmwareVersionBase("PMS5003x", fwCode); } /** From d6766ef68bd460b605c7105966178c0af5916672 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Sun, 25 Aug 2024 08:37:25 +0700 Subject: [PATCH 06/24] Correct print log number format, fix #218 --- examples/OneOpenAir/OneOpenAir.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/OneOpenAir/OneOpenAir.ino b/examples/OneOpenAir/OneOpenAir.ino index 978c345..ff931ee 100644 --- a/examples/OneOpenAir/OneOpenAir.ino +++ b/examples/OneOpenAir/OneOpenAir.ino @@ -1081,7 +1081,7 @@ static void updatePm(void) { Serial.printf("[2] Relative Humidity: %d\r\n", measurements.hum_2); Serial.printf("[2] Temperature compensated in C: %0.2f\r\n", ag->pms5003t_1.temperatureCompensated(measurements.temp_2)); - Serial.printf("[2] Relative Humidity compensated: %d\r\n", + Serial.printf("[2] Relative Humidity compensated: %0.2f\r\n", ag->pms5003t_1.humidityCompensated(measurements.hum_2)); } else { measurements.pm01_2 = utils::getInvalidPMS(); From b049a23657cd12dbada9a2c6862a2e0e29cfeac5 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Sun, 25 Aug 2024 20:21:26 +0700 Subject: [PATCH 07/24] Restart device after PMS sensor read failed 10 times --- examples/BASIC/BASIC.ino | 14 ++-- .../DiyProIndoorV3_3/DiyProIndoorV3_3.ino | 14 ++-- .../DiyProIndoorV4_2/DiyProIndoorV4_2.ino | 12 ++- examples/OneOpenAir/OneOpenAir.ino | 73 ++++++++++++++----- src/PMS/PMS.cpp | 31 ++++++++ src/PMS/PMS.h | 8 ++ src/PMS/PMS5003.cpp | 30 ++++++++ src/PMS/PMS5003.h | 4 + src/PMS/PMS5003T.cpp | 29 ++++++++ src/PMS/PMS5003T.h | 4 + 10 files changed, 186 insertions(+), 33 deletions(-) diff --git a/examples/BASIC/BASIC.ino b/examples/BASIC/BASIC.ino index 4099b71..4323b13 100644 --- a/examples/BASIC/BASIC.ino +++ b/examples/BASIC/BASIC.ino @@ -68,7 +68,6 @@ static LocalServer localServer(Serial, openMetrics, measurements, configuration, wifiConnector); static MqttClient mqttClient(Serial); -static int pmFailCount = 0; static int getCO2FailCount = 0; static AgFirmwareMode fwMode = FW_MODE_I_BASIC_40PS; @@ -514,16 +513,21 @@ static void updatePm(void) { Serial.printf("PM2.5 ug/m3: %d\r\n", measurements.pm25_1); Serial.printf("PM10 ug/m3: %d\r\n", measurements.pm10_1); Serial.printf("PM0.3 Count: %d\r\n", measurements.pm03PCount_1); - pmFailCount = 0; + ag.pms5003.resetFailCount(); } else { - pmFailCount++; - Serial.printf("PMS read failed: %d\r\n", pmFailCount); - if (pmFailCount >= 3) { + ag.pms5003.updateFailCount(); + Serial.printf("PMS read failed: %d\r\n", ag.pms5003.getFailCount()); + if (ag.pms5003.getFailCount() >= PMS_FAIL_COUNT_SET_INVALID) { measurements.pm01_1 = utils::getInvalidPMS(); measurements.pm25_1 = utils::getInvalidPMS(); measurements.pm10_1 = utils::getInvalidPMS(); measurements.pm03PCount_1 = utils::getInvalidPMS(); } + + if(ag.pms5003.getFailCount() >= ag.pms5003.getFailCountMax()) { + Serial.printf("Restarting..."); + ESP.restart(); + } } } diff --git a/examples/DiyProIndoorV3_3/DiyProIndoorV3_3.ino b/examples/DiyProIndoorV3_3/DiyProIndoorV3_3.ino index df059b7..2f4d663 100644 --- a/examples/DiyProIndoorV3_3/DiyProIndoorV3_3.ino +++ b/examples/DiyProIndoorV3_3/DiyProIndoorV3_3.ino @@ -68,7 +68,6 @@ static LocalServer localServer(Serial, openMetrics, measurements, configuration, wifiConnector); static MqttClient mqttClient(Serial); -static int pmFailCount = 0; static int getCO2FailCount = 0; static AgFirmwareMode fwMode = FW_MODE_I_33PS; @@ -566,16 +565,21 @@ static void updatePm(void) { Serial.printf("PM2.5 ug/m3: %d\r\n", measurements.pm25_1); Serial.printf("PM10 ug/m3: %d\r\n", measurements.pm10_1); Serial.printf("PM0.3 Count: %d\r\n", measurements.pm03PCount_1); - pmFailCount = 0; + ag.pms5003.resetFailCount(); } else { - pmFailCount++; - Serial.printf("PMS read failed: %d\r\n", pmFailCount); - if (pmFailCount >= 3) { + ag.pms5003.updateFailCount(); + Serial.printf("PMS read failed: %d\r\n", ag.pms5003.getFailCount()); + if (ag.pms5003.getFailCount() >= PMS_FAIL_COUNT_SET_INVALID) { measurements.pm01_1 = utils::getInvalidPMS(); measurements.pm25_1 = utils::getInvalidPMS(); measurements.pm10_1 = utils::getInvalidPMS(); measurements.pm03PCount_1 = utils::getInvalidPMS(); } + + if(ag.pms5003.getFailCount() >= ag.pms5003.getFailCountMax()) { + Serial.printf("Restarting..."); + ESP.restart(); + } } } diff --git a/examples/DiyProIndoorV4_2/DiyProIndoorV4_2.ino b/examples/DiyProIndoorV4_2/DiyProIndoorV4_2.ino index 20be418..b29f621 100644 --- a/examples/DiyProIndoorV4_2/DiyProIndoorV4_2.ino +++ b/examples/DiyProIndoorV4_2/DiyProIndoorV4_2.ino @@ -68,7 +68,6 @@ static LocalServer localServer(Serial, openMetrics, measurements, configuration, wifiConnector); static MqttClient mqttClient(Serial); -static int pmFailCount = 0; static uint32_t factoryBtnPressTime = 0; static int getCO2FailCount = 0; static AgFirmwareMode fwMode = FW_MODE_I_42PS; @@ -609,16 +608,21 @@ static void updatePm(void) { Serial.printf("PM2.5 ug/m3: %d\r\n", measurements.pm25_1); Serial.printf("PM10 ug/m3: %d\r\n", measurements.pm10_1); Serial.printf("PM0.3 Count: %d\r\n", measurements.pm03PCount_1); - pmFailCount = 0; + ag.pms5003.resetFailCount(); } else { - pmFailCount++; + ag.pms5003.updateFailCount(); Serial.printf("PMS read failed: %d\r\n", pmFailCount); - if (pmFailCount >= 3) { + if (ag.pms5003.getFailCount() >= PMS_FAIL_COUNT_SET_INVALID) { measurements.pm01_1 = utils::getInvalidPMS(); measurements.pm25_1 = utils::getInvalidPMS(); measurements.pm10_1 = utils::getInvalidPMS(); measurements.pm03PCount_1 = utils::getInvalidPMS(); } + + if(ag.pms5003.getFailCount() >= ag.pms5003.getFailCountMax()) { + Serial.printf("Restarting..."); + ESP.restart(); + } } } diff --git a/examples/OneOpenAir/OneOpenAir.ino b/examples/OneOpenAir/OneOpenAir.ino index 978c345..a6bf7c3 100644 --- a/examples/OneOpenAir/OneOpenAir.ino +++ b/examples/OneOpenAir/OneOpenAir.ino @@ -88,7 +88,6 @@ static OtaHandler otaHandler; static LocalServer localServer(Serial, openMetrics, measurements, configuration, wifiConnector); -static int pmFailCount = 0; static uint32_t factoryBtnPressTime = 0; static int getCO2FailCount = 0; static AgFirmwareMode fwMode = FW_MODE_I_9PSL; @@ -1006,6 +1005,7 @@ static void updateTvoc(void) { } static void updatePm(void) { + bool failToRestart = false; if (ag->isOne()) { if (ag->pms5003.isFailed() == false) { measurements.pm01_1 = ag->pms5003.getPm01Ae(); @@ -1018,16 +1018,20 @@ static void updatePm(void) { Serial.printf("PM2.5 ug/m3: %d\r\n", measurements.pm25_1); Serial.printf("PM10 ug/m3: %d\r\n", measurements.pm10_1); Serial.printf("PM0.3 Count: %d\r\n", measurements.pm03PCount_1); - pmFailCount = 0; + ag->pms5003.resetFailCount(); } else { - pmFailCount++; - Serial.printf("PMS read failed: %d\r\n", pmFailCount); - if (pmFailCount >= 3) { + ag->pms5003.updateFailCount(); + Serial.printf("PMS read failed: %d\r\n", ag->pms5003.getFailCount()); + if (ag->pms5003.getFailCount() >= PMS_FAIL_COUNT_SET_INVALID) { measurements.pm01_1 = utils::getInvalidPMS(); measurements.pm25_1 = utils::getInvalidPMS(); measurements.pm10_1 = utils::getInvalidPMS(); measurements.pm03PCount_1 = utils::getInvalidPMS(); } + + if (ag->pms5003.getFailCount() >= ag->pms5003.getFailCountMax()) { + failToRestart = true; + } } } else { bool pmsResult_1 = false; @@ -1053,13 +1057,26 @@ static void updatePm(void) { ag->pms5003t_1.temperatureCompensated(measurements.temp_1)); Serial.printf("[1] Relative Humidity compensated: %f\r\n", ag->pms5003t_1.humidityCompensated(measurements.hum_1)); + + ag->pms5003t_1.resetFailCount(); } else { - measurements.pm01_1 = utils::getInvalidPMS(); - measurements.pm25_1 = utils::getInvalidPMS(); - measurements.pm10_1 = utils::getInvalidPMS(); - measurements.pm03PCount_1 = utils::getInvalidPMS(); - measurements.temp_1 = utils::getInvalidTemperature(); - measurements.hum_1 = utils::getInvalidHumidity(); + if (configuration.hasSensorPMS1) { + ag->pms5003t_1.updateFailCount(); + Serial.printf("[1] PMS read failed: %d\r\n", ag->pms5003t_1.getFailCount()); + + if (ag->pms5003t_1.getFailCount() >= PMS_FAIL_COUNT_SET_INVALID) { + measurements.pm01_1 = utils::getInvalidPMS(); + measurements.pm25_1 = utils::getInvalidPMS(); + measurements.pm10_1 = utils::getInvalidPMS(); + measurements.pm03PCount_1 = utils::getInvalidPMS(); + measurements.temp_1 = utils::getInvalidTemperature(); + measurements.hum_1 = utils::getInvalidHumidity(); + } + + if (ag->pms5003t_1.getFailCount() >= ag->pms5003t_1.getFailCountMax()) { + failToRestart = true; + } + } } if (configuration.hasSensorPMS2 && (ag->pms5003t_2.isFailed() == false)) { @@ -1080,16 +1097,29 @@ static void updatePm(void) { Serial.printf("[2] Temperature in C: %0.2f\r\n", measurements.temp_2); Serial.printf("[2] Relative Humidity: %d\r\n", measurements.hum_2); Serial.printf("[2] Temperature compensated in C: %0.2f\r\n", - ag->pms5003t_1.temperatureCompensated(measurements.temp_2)); + ag->pms5003t_2.temperatureCompensated(measurements.temp_2)); Serial.printf("[2] Relative Humidity compensated: %d\r\n", - ag->pms5003t_1.humidityCompensated(measurements.hum_2)); + ag->pms5003t_2.humidityCompensated(measurements.hum_2)); + + ag->pms5003t_2.resetFailCount(); } else { - measurements.pm01_2 = utils::getInvalidPMS(); - measurements.pm25_2 = utils::getInvalidPMS(); - measurements.pm10_2 = utils::getInvalidPMS(); - measurements.pm03PCount_2 = utils::getInvalidPMS(); - measurements.temp_2 = utils::getInvalidTemperature(); - measurements.hum_2 = utils::getInvalidHumidity(); + if (configuration.hasSensorPMS2) { + ag->pms5003t_2.updateFailCount(); + Serial.printf("[2] PMS read failed: %d\r\n", ag->pms5003t_2.getFailCount()); + + if (ag->pms5003t_2.getFailCount() >= PMS_FAIL_COUNT_SET_INVALID) { + measurements.pm01_2 = utils::getInvalidPMS(); + measurements.pm25_2 = utils::getInvalidPMS(); + measurements.pm10_2 = utils::getInvalidPMS(); + measurements.pm03PCount_2 = utils::getInvalidPMS(); + measurements.temp_2 = utils::getInvalidTemperature(); + measurements.hum_2 = utils::getInvalidHumidity(); + } + + if (ag->pms5003t_2.getFailCount() >= ag->pms5003t_2.getFailCountMax()) { + failToRestart = true; + } + } } if (configuration.hasSensorPMS1 && configuration.hasSensorPMS2 && @@ -1189,6 +1219,11 @@ static void updatePm(void) { ag->sgp41.setCompensationTemperatureHumidity(temp, hum); } } + + if (failToRestart) { + Serial.printf("Restarting..."); + ESP.restart(); + } } static void sendDataToServer(void) { diff --git a/src/PMS/PMS.cpp b/src/PMS/PMS.cpp index 50b3dac..0629d05 100644 --- a/src/PMS/PMS.cpp +++ b/src/PMS/PMS.cpp @@ -12,6 +12,7 @@ bool PMSBase::begin(Stream *stream) { this->stream = stream; failed = true; + failCount = 0; lastRead = 0; // To read buffer on handle without wait after 1.5sec this->stream->flush(); @@ -147,6 +148,36 @@ void PMSBase::handle() { */ bool PMSBase::isFailed(void) { return failed; } +/** + * @brief Increate number of fail + * + */ +void PMSBase::updateFailCount(void) { + if (failCount < failCountMax) { + failCount++; + } +} + +/** + * @brief Reset number of fail + * + */ +void PMSBase::resetFailCount(void) {failCount = 0;} + +/** + * @brief Get number of fail + * + * @return int + */ +int PMSBase::getFailCount(void) { return failCount; } + +/** + * @brief Get maximum of fail count max + * + * @return int + */ +int PMSBase::getFailCountMax(void) { return failCountMax; } + /** * @brief Read PMS 0.1 ug/m3 with CF = 1 PM estimates * diff --git a/src/PMS/PMS.h b/src/PMS/PMS.h index e89693f..96057d5 100644 --- a/src/PMS/PMS.h +++ b/src/PMS/PMS.h @@ -3,11 +3,17 @@ #include +#define PMS_FAIL_COUNT_SET_INVALID 3 + class PMSBase { public: bool begin(Stream *stream); void handle(); bool isFailed(void); + void updateFailCount(void); + void resetFailCount(void); + int getFailCount(void); + int getFailCountMax(void); uint16_t getRaw0_1(void); uint16_t getRaw2_5(void); uint16_t getRaw10(void); @@ -36,6 +42,8 @@ private: int packageIndex; bool failed = false; uint32_t lastRead; + const int failCountMax = 10; + int failCount = 0; int16_t toI16(char *buf); uint16_t toU16(char* buf); diff --git a/src/PMS/PMS5003.cpp b/src/PMS/PMS5003.cpp index 8a49550..8bed516 100644 --- a/src/PMS/PMS5003.cpp +++ b/src/PMS/PMS5003.cpp @@ -175,3 +175,33 @@ void PMS5003::handle(void) { pms.handle(); } * @return false Communication timeout or sensor has removed */ bool PMS5003::isFailed(void) { return pms.isFailed(); } + +/** + * @brief Increate number of fail + * + */ +void PMS5003::updateFailCount(void) { + pms.updateFailCount(); +} + +/** + * @brief Reset fail count + * + */ +void PMS5003::resetFailCount(void) { + pms.resetFailCount(); +} + +/** + * @brief Get number of fail count + * + * @return int + */ +int PMS5003::getFailCount(void) { return pms.getFailCount(); } + +/** + * @brief Get number of fail count max + * + * @return int + */ +int PMS5003::getFailCountMax(void) { return pms.getFailCountMax(); } diff --git a/src/PMS/PMS5003.h b/src/PMS/PMS5003.h index aa6fcd9..8be8e8f 100644 --- a/src/PMS/PMS5003.h +++ b/src/PMS/PMS5003.h @@ -19,6 +19,10 @@ public: void end(void); void handle(void); bool isFailed(void); + void updateFailCount(void); + void resetFailCount(void); + int getFailCount(void); + int getFailCountMax(void); int getPm01Ae(void); int getPm25Ae(void); int getPm10Ae(void); diff --git a/src/PMS/PMS5003T.cpp b/src/PMS/PMS5003T.cpp index 97cc9c7..b3ad9fc 100644 --- a/src/PMS/PMS5003T.cpp +++ b/src/PMS/PMS5003T.cpp @@ -216,3 +216,32 @@ void PMS5003T::handle(void) { pms.handle(); } */ bool PMS5003T::isFailed(void) { return pms.isFailed(); } +/** + * @brief Increate number of fail + * + */ +void PMS5003T::updateFailCount(void) { + pms.updateFailCount(); +} + +/** + * @brief Reset fail count + * + */ +void PMS5003T::resetFailCount(void) { + pms.resetFailCount(); +} + +/** + * @brief Get fail count + * + * @return int + */ +int PMS5003T::getFailCount(void) { return pms.getFailCount(); } + +/** + * @brief Get fail count max + * + * @return int + */ +int PMS5003T::getFailCountMax(void) { return pms.getFailCountMax(); } diff --git a/src/PMS/PMS5003T.h b/src/PMS/PMS5003T.h index 3d2d567..f3d58e7 100644 --- a/src/PMS/PMS5003T.h +++ b/src/PMS/PMS5003T.h @@ -22,6 +22,10 @@ public: void handle(void); bool isFailed(void); + void updateFailCount(void); + void resetFailCount(void); + int getFailCount(void); + int getFailCountMax(void); int getPm01Ae(void); int getPm25Ae(void); int getPm10Ae(void); From 63f653d5cddb4fdf649d2aa824b47a6f6fafeb17 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Sun, 25 Aug 2024 20:37:38 +0700 Subject: [PATCH 08/24] fix PM2.5 compensated on display, #221 --- src/AgOledDisplay.cpp | 13 +++++++------ src/PMS/PMS5003.cpp | 2 +- src/PMS/PMS5003T.cpp | 4 ++-- src/PMS/PMS5003T.h | 2 +- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/AgOledDisplay.cpp b/src/AgOledDisplay.cpp index 8b07ada..d3393ec 100644 --- a/src/AgOledDisplay.cpp +++ b/src/AgOledDisplay.cpp @@ -307,11 +307,12 @@ void OledDisplay::showDashboard(const char *status) { int pm25 = value.pm25_1; if (config.hasSensorSHT) { pm25 = ag->pms5003.compensated(pm25, value.Humidity); + logInfo("PM2.5:" + String(value.pm25_1) + String("Compensated:") + String(pm25)); } DISP()->setFont(u8g2_font_t0_22b_tf); if (config.isPmStandardInUSAQI()) { - if (utils::isValidPMS(value.pm25_1)) { - sprintf(strBuf, "%d", ag->pms5003.convertPm25ToUsAqi(value.pm25_1)); + if (utils::isValidPMS(pm25)) { + sprintf(strBuf, "%d", ag->pms5003.convertPm25ToUsAqi(pm25)); } else { sprintf(strBuf, "%s", "-"); } @@ -319,8 +320,8 @@ void OledDisplay::showDashboard(const char *status) { DISP()->setFont(u8g2_font_t0_12_tf); DISP()->drawUTF8(55, 61, "AQI"); } else { - if (utils::isValidPMS(value.pm25_1)) { - sprintf(strBuf, "%d", value.pm25_1); + if (utils::isValidPMS(pm25)) { + sprintf(strBuf, "%d", pm25); } else { sprintf(strBuf, "%s", "-"); } @@ -369,8 +370,8 @@ void OledDisplay::showDashboard(const char *status) { pm25 = (int)ag->pms5003.compensated(pm25, value.Humidity); } ag->display.setCursor(0, 12); - if (utils::isValidPMS(value.pm25_1)) { - snprintf(strBuf, sizeof(strBuf), "PM2.5:%d", value.pm25_1); + if (utils::isValidPMS(pm25)) { + snprintf(strBuf, sizeof(strBuf), "PM2.5:%d", pm25); } else { snprintf(strBuf, sizeof(strBuf), "PM2.5:-"); } diff --git a/src/PMS/PMS5003.cpp b/src/PMS/PMS5003.cpp index 8a49550..48c6b07 100644 --- a/src/PMS/PMS5003.cpp +++ b/src/PMS/PMS5003.cpp @@ -126,7 +126,7 @@ int PMS5003::convertPm25ToUsAqi(int pm25) { return pms.pm25ToAQI(pm25); } * * @param pm25 PM2.5 raw value * @param humidity Humidity value - * @return float + * @return int */ int PMS5003::compensated(int pm25, float humidity) { return pms.compensated(pm25, humidity); diff --git a/src/PMS/PMS5003T.cpp b/src/PMS/PMS5003T.cpp index 97cc9c7..b75f454 100644 --- a/src/PMS/PMS5003T.cpp +++ b/src/PMS/PMS5003T.cpp @@ -169,9 +169,9 @@ float PMS5003T::getRelativeHumidity(void) { * * @param pm25 PM2.5 raw value * @param humidity Humidity value - * @return float + * @return int */ -float PMS5003T::compensated(int pm25, float humidity) { +int PMS5003T::compensated(int pm25, float humidity) { return pms.compensated(pm25, humidity); } diff --git a/src/PMS/PMS5003T.h b/src/PMS/PMS5003T.h index 3d2d567..f5010fa 100644 --- a/src/PMS/PMS5003T.h +++ b/src/PMS/PMS5003T.h @@ -29,7 +29,7 @@ public: int convertPm25ToUsAqi(int pm25); float getTemperature(void); float getRelativeHumidity(void); - float compensated(int pm25, float humidity); + int compensated(int pm25, float humidity); private: bool _isBegin = false; From a9654506f58a485ca1c3b425db402a35f01192fe Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Sun, 25 Aug 2024 20:40:45 +0700 Subject: [PATCH 09/24] Update log format, #218 --- examples/OneOpenAir/OneOpenAir.ino | 2 +- platformio.ini | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/examples/OneOpenAir/OneOpenAir.ino b/examples/OneOpenAir/OneOpenAir.ino index ff931ee..6a2d3fa 100644 --- a/examples/OneOpenAir/OneOpenAir.ino +++ b/examples/OneOpenAir/OneOpenAir.ino @@ -1051,7 +1051,7 @@ static void updatePm(void) { Serial.printf("[1] Relative Humidity: %d\r\n", measurements.hum_1); Serial.printf("[1] Temperature compensated in C: %0.2f\r\n", ag->pms5003t_1.temperatureCompensated(measurements.temp_1)); - Serial.printf("[1] Relative Humidity compensated: %f\r\n", + Serial.printf("[1] Relative Humidity compensated: %0.2f\r\n", ag->pms5003t_1.humidityCompensated(measurements.hum_1)); } else { measurements.pm01_1 = utils::getInvalidPMS(); diff --git a/platformio.ini b/platformio.ini index 09e2b02..675814b 100644 --- a/platformio.ini +++ b/platformio.ini @@ -12,7 +12,10 @@ platform = espressif32 board = esp32-c3-devkitm-1 framework = arduino -build_flags = !echo '-D ARDUINO_USB_CDC_ON_BOOT=1 -D ARDUINO_USB_MODE=1 -D GIT_VERSION=\\"'$(git describe --tags --always --dirty)'\\"' +build_flags = + -DARDUINO_USB_CDC_ON_BOOT=1 + -DARDUINO_USB_MODE=1 + -DGIT_VERSION=\"3.1.4\" board_build.partitions = partitions.csv monitor_speed = 115200 lib_deps = From e461b92c9fe6457e07bbb1bff83048eab74c5bd8 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Sun, 25 Aug 2024 20:51:07 +0700 Subject: [PATCH 10/24] Fix build failed --- examples/DiyProIndoorV4_2/DiyProIndoorV4_2.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/DiyProIndoorV4_2/DiyProIndoorV4_2.ino b/examples/DiyProIndoorV4_2/DiyProIndoorV4_2.ino index b29f621..a0a42df 100644 --- a/examples/DiyProIndoorV4_2/DiyProIndoorV4_2.ino +++ b/examples/DiyProIndoorV4_2/DiyProIndoorV4_2.ino @@ -611,7 +611,7 @@ static void updatePm(void) { ag.pms5003.resetFailCount(); } else { ag.pms5003.updateFailCount(); - Serial.printf("PMS read failed: %d\r\n", pmFailCount); + Serial.printf("PMS read failed: %d\r\n", ag.pms5003.getFailCount()); if (ag.pms5003.getFailCount() >= PMS_FAIL_COUNT_SET_INVALID) { measurements.pm01_1 = utils::getInvalidPMS(); measurements.pm25_1 = utils::getInvalidPMS(); From 54ed83cb89e9184f4ea36be51e89537f8d62503e Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Sun, 25 Aug 2024 20:56:30 +0700 Subject: [PATCH 11/24] Revert las misstake commit changed. --- platformio.ini | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/platformio.ini b/platformio.ini index 675814b..09e2b02 100644 --- a/platformio.ini +++ b/platformio.ini @@ -12,10 +12,7 @@ platform = espressif32 board = esp32-c3-devkitm-1 framework = arduino -build_flags = - -DARDUINO_USB_CDC_ON_BOOT=1 - -DARDUINO_USB_MODE=1 - -DGIT_VERSION=\"3.1.4\" +build_flags = !echo '-D ARDUINO_USB_CDC_ON_BOOT=1 -D ARDUINO_USB_MODE=1 -D GIT_VERSION=\\"'$(git describe --tags --always --dirty)'\\"' board_build.partitions = partitions.csv monitor_speed = 115200 lib_deps = From 7a988ea6c17936dc8a8295ae33ecd8d4682a9f68 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Mon, 26 Aug 2024 11:56:01 +0700 Subject: [PATCH 12/24] rename `compensated` to `compensate` --- src/AgOledDisplay.cpp | 4 ++-- src/AgValue.cpp | 18 +++++++++--------- src/PMS/PMS.cpp | 2 +- src/PMS/PMS.h | 2 +- src/PMS/PMS5003.cpp | 4 ++-- src/PMS/PMS5003.h | 2 +- src/PMS/PMS5003T.cpp | 4 ++-- src/PMS/PMS5003T.h | 2 +- 8 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/AgOledDisplay.cpp b/src/AgOledDisplay.cpp index d3393ec..f717628 100644 --- a/src/AgOledDisplay.cpp +++ b/src/AgOledDisplay.cpp @@ -306,7 +306,7 @@ void OledDisplay::showDashboard(const char *status) { /** Draw PM2.5 value */ int pm25 = value.pm25_1; if (config.hasSensorSHT) { - pm25 = ag->pms5003.compensated(pm25, value.Humidity); + pm25 = ag->pms5003.compensate(pm25, value.Humidity); logInfo("PM2.5:" + String(value.pm25_1) + String("Compensated:") + String(pm25)); } DISP()->setFont(u8g2_font_t0_22b_tf); @@ -367,7 +367,7 @@ void OledDisplay::showDashboard(const char *status) { /** Set PM */ int pm25 = value.pm25_1; if(config.hasSensorSHT) { - pm25 = (int)ag->pms5003.compensated(pm25, value.Humidity); + pm25 = (int)ag->pms5003.compensate(pm25, value.Humidity); } ag->display.setCursor(0, 12); if (utils::isValidPMS(pm25)) { diff --git a/src/AgValue.cpp b/src/AgValue.cpp index 015a788..05615bd 100644 --- a/src/AgValue.cpp +++ b/src/AgValue.cpp @@ -51,7 +51,7 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, } if (config->hasSensorSHT && config->hasSensorPMS1) { - int pm25 = ag->pms5003.compensated(this->pm25_1, this->Humidity); + int pm25 = ag->pms5003.compensate(this->pm25_1, this->Humidity); if (pm25 >= 0) { root["pm02Compensated"] = pm25; } @@ -92,8 +92,8 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, } } - int pm25 = (ag->pms5003t_1.compensated(this->pm25_1, this->temp_1) + - ag->pms5003t_2.compensated(this->pm25_2, this->temp_2)) / + int pm25 = (ag->pms5003t_1.compensate(this->pm25_1, this->temp_1) + + ag->pms5003t_2.compensate(this->pm25_2, this->temp_2)) / 2; root["pm02Compensated"] = pm25; } @@ -133,7 +133,7 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, } } } - root["pm02Compensated"] = ag->pms5003t_1.compensated(this->pm25_1, this->temp_1); + root["pm02Compensated"] = ag->pms5003t_1.compensate(this->pm25_1, this->temp_1); } if (config->hasSensorPMS2) { if(utils::isValidPMS(this->pm01_2)) { @@ -170,7 +170,7 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, } } } - root["pm02Compensated"] = ag->pms5003t_2.compensated(this->pm25_2, this->temp_2); + root["pm02Compensated"] = ag->pms5003t_2.compensate(this->pm25_2, this->temp_2); } } else { if (fwMode == FW_MODE_O_1P) { @@ -207,7 +207,7 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, } } } - root["pm02Compensated"] = ag->pms5003t_1.compensated(this->pm25_1, this->temp_1); + root["pm02Compensated"] = ag->pms5003t_1.compensate(this->pm25_1, this->temp_1); } else if (config->hasSensorPMS2) { if(utils::isValidPMS(this->pm01_2)) { root["pm01"] = this->pm01_2; @@ -241,7 +241,7 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, } } } - root["pm02Compensated"] = ag->pms5003t_1.compensated(this->pm25_1, this->temp_1); + root["pm02Compensated"] = ag->pms5003t_1.compensate(this->pm25_1, this->temp_1); } } else { float val; @@ -278,7 +278,7 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, } } } - root["channels"]["1"]["pm02Compensated"] = ag->pms5003t_1.compensated(this->pm25_1, this->temp_1); + root["channels"]["1"]["pm02Compensated"] = ag->pms5003t_1.compensate(this->pm25_1, this->temp_1); } if (config->hasSensorPMS2) { float val; @@ -314,7 +314,7 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, } } } - root["channels"]["2"]["pm02Compensated"] = ag->pms5003t_2.compensated(this->pm25_2, this->temp_2); + root["channels"]["2"]["pm02Compensated"] = ag->pms5003t_2.compensate(this->pm25_2, this->temp_2); } } } diff --git a/src/PMS/PMS.cpp b/src/PMS/PMS.cpp index 50b3dac..0fb7551 100644 --- a/src/PMS/PMS.cpp +++ b/src/PMS/PMS.cpp @@ -277,7 +277,7 @@ int PMSBase::pm25ToAQI(int pm02) { * @param humidity Humidity value (%) * @return int */ -int PMSBase::compensated(int pm25, float humidity) { +int PMSBase::compensate(int pm25, float humidity) { float value; if (humidity < 0) { humidity = 0; diff --git a/src/PMS/PMS.h b/src/PMS/PMS.h index e89693f..1d6c9a2 100644 --- a/src/PMS/PMS.h +++ b/src/PMS/PMS.h @@ -28,7 +28,7 @@ public: uint16_t getHum(void); int pm25ToAQI(int pm02); - int compensated(int pm25, float humidity); + int compensate(int pm25, float humidity); private: Stream *stream; diff --git a/src/PMS/PMS5003.cpp b/src/PMS/PMS5003.cpp index 48c6b07..46a6b8b 100644 --- a/src/PMS/PMS5003.cpp +++ b/src/PMS/PMS5003.cpp @@ -128,8 +128,8 @@ int PMS5003::convertPm25ToUsAqi(int pm25) { return pms.pm25ToAQI(pm25); } * @param humidity Humidity value * @return int */ -int PMS5003::compensated(int pm25, float humidity) { - return pms.compensated(pm25, humidity); +int PMS5003::compensate(int pm25, float humidity) { + return pms.compensate(pm25, humidity); } /** diff --git a/src/PMS/PMS5003.h b/src/PMS/PMS5003.h index aa6fcd9..c99f4d8 100644 --- a/src/PMS/PMS5003.h +++ b/src/PMS/PMS5003.h @@ -24,7 +24,7 @@ public: int getPm10Ae(void); int getPm03ParticleCount(void); int convertPm25ToUsAqi(int pm25); - int compensated(int pm25, float humidity); + int compensate(int pm25, float humidity); private: bool _isBegin = false; diff --git a/src/PMS/PMS5003T.cpp b/src/PMS/PMS5003T.cpp index b75f454..12b3c29 100644 --- a/src/PMS/PMS5003T.cpp +++ b/src/PMS/PMS5003T.cpp @@ -171,8 +171,8 @@ float PMS5003T::getRelativeHumidity(void) { * @param humidity Humidity value * @return int */ -int PMS5003T::compensated(int pm25, float humidity) { - return pms.compensated(pm25, humidity); +int PMS5003T::compensate(int pm25, float humidity) { + return pms.compensate(pm25, humidity); } /** diff --git a/src/PMS/PMS5003T.h b/src/PMS/PMS5003T.h index f5010fa..057144a 100644 --- a/src/PMS/PMS5003T.h +++ b/src/PMS/PMS5003T.h @@ -29,7 +29,7 @@ public: int convertPm25ToUsAqi(int pm25); float getTemperature(void); float getRelativeHumidity(void); - int compensated(int pm25, float humidity); + int compensate(int pm25, float humidity); private: bool _isBegin = false; From 104d58a8c0b4e0fdf6de5a4ed1e2b6e39a24e55a Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Mon, 26 Aug 2024 14:14:42 +0700 Subject: [PATCH 13/24] resolve review #222 --- examples/BASIC/BASIC.ino | 12 +++--- examples/BASIC/OpenMetrics.cpp | 8 ++-- .../DiyProIndoorV3_3/DiyProIndoorV3_3.ino | 12 +++--- examples/DiyProIndoorV3_3/OpenMetrics.cpp | 8 ++-- .../DiyProIndoorV4_2/DiyProIndoorV4_2.ino | 12 +++--- examples/DiyProIndoorV4_2/OpenMetrics.cpp | 8 ++-- examples/OneOpenAir/OneOpenAir.ino | 42 +++++++++---------- examples/OneOpenAir/OpenMetrics.cpp | 8 ++-- src/Main/utils.cpp | 2 +- src/Main/utils.h | 2 +- src/PMS/PMS.cpp | 11 +---- src/PMS/PMS5003.cpp | 8 ---- src/PMS/PMS5003T.cpp | 8 ---- 13 files changed, 58 insertions(+), 83 deletions(-) diff --git a/examples/BASIC/BASIC.ino b/examples/BASIC/BASIC.ino index 4323b13..85ffd45 100644 --- a/examples/BASIC/BASIC.ino +++ b/examples/BASIC/BASIC.ino @@ -516,16 +516,16 @@ static void updatePm(void) { ag.pms5003.resetFailCount(); } else { ag.pms5003.updateFailCount(); - Serial.printf("PMS read failed: %d\r\n", ag.pms5003.getFailCount()); + Serial.printf("PMS read failed %d times\r\n", ag.pms5003.getFailCount()); if (ag.pms5003.getFailCount() >= PMS_FAIL_COUNT_SET_INVALID) { - measurements.pm01_1 = utils::getInvalidPMS(); - measurements.pm25_1 = utils::getInvalidPMS(); - measurements.pm10_1 = utils::getInvalidPMS(); - measurements.pm03PCount_1 = utils::getInvalidPMS(); + measurements.pm01_1 = utils::getInvalidPmValue(); + measurements.pm25_1 = utils::getInvalidPmValue(); + measurements.pm10_1 = utils::getInvalidPmValue(); + measurements.pm03PCount_1 = utils::getInvalidPmValue(); } if(ag.pms5003.getFailCount() >= ag.pms5003.getFailCountMax()) { - Serial.printf("Restarting..."); + Serial.printf("PMS failure count reach to max set %d, restarting...", ag->pms5003.getFailCountMax()); ESP.restart(); } } diff --git a/examples/BASIC/OpenMetrics.cpp b/examples/BASIC/OpenMetrics.cpp index 3392d97..5737a10 100644 --- a/examples/BASIC/OpenMetrics.cpp +++ b/examples/BASIC/OpenMetrics.cpp @@ -67,10 +67,10 @@ String OpenMetrics::getPayload(void) { float _temp = utils::getInvalidTemperature(); float _hum = utils::getInvalidHumidity(); - int pm01 = utils::getInvalidPMS(); - int pm25 = utils::getInvalidPMS(); - int pm10 = utils::getInvalidPMS(); - int pm03PCount = utils::getInvalidPMS(); + int pm01 = utils::getInvalidPmValue(); + int pm25 = utils::getInvalidPmValue(); + int pm10 = utils::getInvalidPmValue(); + int pm03PCount = utils::getInvalidPmValue(); int atmpCompensated = utils::getInvalidTemperature(); int ahumCompensated = utils::getInvalidHumidity(); diff --git a/examples/DiyProIndoorV3_3/DiyProIndoorV3_3.ino b/examples/DiyProIndoorV3_3/DiyProIndoorV3_3.ino index 2f4d663..7ecc082 100644 --- a/examples/DiyProIndoorV3_3/DiyProIndoorV3_3.ino +++ b/examples/DiyProIndoorV3_3/DiyProIndoorV3_3.ino @@ -568,16 +568,16 @@ static void updatePm(void) { ag.pms5003.resetFailCount(); } else { ag.pms5003.updateFailCount(); - Serial.printf("PMS read failed: %d\r\n", ag.pms5003.getFailCount()); + Serial.printf("PMS read failed %d times\r\n", ag.pms5003.getFailCount()); if (ag.pms5003.getFailCount() >= PMS_FAIL_COUNT_SET_INVALID) { - measurements.pm01_1 = utils::getInvalidPMS(); - measurements.pm25_1 = utils::getInvalidPMS(); - measurements.pm10_1 = utils::getInvalidPMS(); - measurements.pm03PCount_1 = utils::getInvalidPMS(); + measurements.pm01_1 = utils::getInvalidPmValue(); + measurements.pm25_1 = utils::getInvalidPmValue(); + measurements.pm10_1 = utils::getInvalidPmValue(); + measurements.pm03PCount_1 = utils::getInvalidPmValue(); } if(ag.pms5003.getFailCount() >= ag.pms5003.getFailCountMax()) { - Serial.printf("Restarting..."); + Serial.printf("PMS failure count reach to max set %d, restarting...", ag->pms5003.getFailCountMax()); ESP.restart(); } } diff --git a/examples/DiyProIndoorV3_3/OpenMetrics.cpp b/examples/DiyProIndoorV3_3/OpenMetrics.cpp index 3392d97..5737a10 100644 --- a/examples/DiyProIndoorV3_3/OpenMetrics.cpp +++ b/examples/DiyProIndoorV3_3/OpenMetrics.cpp @@ -67,10 +67,10 @@ String OpenMetrics::getPayload(void) { float _temp = utils::getInvalidTemperature(); float _hum = utils::getInvalidHumidity(); - int pm01 = utils::getInvalidPMS(); - int pm25 = utils::getInvalidPMS(); - int pm10 = utils::getInvalidPMS(); - int pm03PCount = utils::getInvalidPMS(); + int pm01 = utils::getInvalidPmValue(); + int pm25 = utils::getInvalidPmValue(); + int pm10 = utils::getInvalidPmValue(); + int pm03PCount = utils::getInvalidPmValue(); int atmpCompensated = utils::getInvalidTemperature(); int ahumCompensated = utils::getInvalidHumidity(); diff --git a/examples/DiyProIndoorV4_2/DiyProIndoorV4_2.ino b/examples/DiyProIndoorV4_2/DiyProIndoorV4_2.ino index a0a42df..ac78467 100644 --- a/examples/DiyProIndoorV4_2/DiyProIndoorV4_2.ino +++ b/examples/DiyProIndoorV4_2/DiyProIndoorV4_2.ino @@ -611,16 +611,16 @@ static void updatePm(void) { ag.pms5003.resetFailCount(); } else { ag.pms5003.updateFailCount(); - Serial.printf("PMS read failed: %d\r\n", ag.pms5003.getFailCount()); + Serial.printf("PMS read failed %d times\r\n", ag.pms5003.getFailCount()); if (ag.pms5003.getFailCount() >= PMS_FAIL_COUNT_SET_INVALID) { - measurements.pm01_1 = utils::getInvalidPMS(); - measurements.pm25_1 = utils::getInvalidPMS(); - measurements.pm10_1 = utils::getInvalidPMS(); - measurements.pm03PCount_1 = utils::getInvalidPMS(); + measurements.pm01_1 = utils::getInvalidPmValue(); + measurements.pm25_1 = utils::getInvalidPmValue(); + measurements.pm10_1 = utils::getInvalidPmValue(); + measurements.pm03PCount_1 = utils::getInvalidPmValue(); } if(ag.pms5003.getFailCount() >= ag.pms5003.getFailCountMax()) { - Serial.printf("Restarting..."); + Serial.printf("PMS failure count reach to max set %d, restarting...", ag->pms5003.getFailCountMax()); ESP.restart(); } } diff --git a/examples/DiyProIndoorV4_2/OpenMetrics.cpp b/examples/DiyProIndoorV4_2/OpenMetrics.cpp index 3392d97..5737a10 100644 --- a/examples/DiyProIndoorV4_2/OpenMetrics.cpp +++ b/examples/DiyProIndoorV4_2/OpenMetrics.cpp @@ -67,10 +67,10 @@ String OpenMetrics::getPayload(void) { float _temp = utils::getInvalidTemperature(); float _hum = utils::getInvalidHumidity(); - int pm01 = utils::getInvalidPMS(); - int pm25 = utils::getInvalidPMS(); - int pm10 = utils::getInvalidPMS(); - int pm03PCount = utils::getInvalidPMS(); + int pm01 = utils::getInvalidPmValue(); + int pm25 = utils::getInvalidPmValue(); + int pm10 = utils::getInvalidPmValue(); + int pm03PCount = utils::getInvalidPmValue(); int atmpCompensated = utils::getInvalidTemperature(); int ahumCompensated = utils::getInvalidHumidity(); diff --git a/examples/OneOpenAir/OneOpenAir.ino b/examples/OneOpenAir/OneOpenAir.ino index a6bf7c3..5f9e0fe 100644 --- a/examples/OneOpenAir/OneOpenAir.ino +++ b/examples/OneOpenAir/OneOpenAir.ino @@ -1005,7 +1005,7 @@ static void updateTvoc(void) { } static void updatePm(void) { - bool failToRestart = false; + bool restart = false; if (ag->isOne()) { if (ag->pms5003.isFailed() == false) { measurements.pm01_1 = ag->pms5003.getPm01Ae(); @@ -1021,16 +1021,16 @@ static void updatePm(void) { ag->pms5003.resetFailCount(); } else { ag->pms5003.updateFailCount(); - Serial.printf("PMS read failed: %d\r\n", ag->pms5003.getFailCount()); + Serial.printf("PMS read faile %d times\r\n", ag->pms5003.getFailCount()); if (ag->pms5003.getFailCount() >= PMS_FAIL_COUNT_SET_INVALID) { - measurements.pm01_1 = utils::getInvalidPMS(); - measurements.pm25_1 = utils::getInvalidPMS(); - measurements.pm10_1 = utils::getInvalidPMS(); - measurements.pm03PCount_1 = utils::getInvalidPMS(); + measurements.pm01_1 = utils::getInvalidPmValue(); + measurements.pm25_1 = utils::getInvalidPmValue(); + measurements.pm10_1 = utils::getInvalidPmValue(); + measurements.pm03PCount_1 = utils::getInvalidPmValue(); } if (ag->pms5003.getFailCount() >= ag->pms5003.getFailCountMax()) { - failToRestart = true; + restart = true; } } } else { @@ -1062,19 +1062,19 @@ static void updatePm(void) { } else { if (configuration.hasSensorPMS1) { ag->pms5003t_1.updateFailCount(); - Serial.printf("[1] PMS read failed: %d\r\n", ag->pms5003t_1.getFailCount()); + Serial.printf("[1] PMS read failed %d times\r\n", ag->pms5003t_1.getFailCount()); if (ag->pms5003t_1.getFailCount() >= PMS_FAIL_COUNT_SET_INVALID) { - measurements.pm01_1 = utils::getInvalidPMS(); - measurements.pm25_1 = utils::getInvalidPMS(); - measurements.pm10_1 = utils::getInvalidPMS(); - measurements.pm03PCount_1 = utils::getInvalidPMS(); + measurements.pm01_1 = utils::getInvalidPmValue(); + measurements.pm25_1 = utils::getInvalidPmValue(); + measurements.pm10_1 = utils::getInvalidPmValue(); + measurements.pm03PCount_1 = utils::getInvalidPmValue(); measurements.temp_1 = utils::getInvalidTemperature(); measurements.hum_1 = utils::getInvalidHumidity(); } if (ag->pms5003t_1.getFailCount() >= ag->pms5003t_1.getFailCountMax()) { - failToRestart = true; + restart = true; } } } @@ -1105,19 +1105,19 @@ static void updatePm(void) { } else { if (configuration.hasSensorPMS2) { ag->pms5003t_2.updateFailCount(); - Serial.printf("[2] PMS read failed: %d\r\n", ag->pms5003t_2.getFailCount()); + Serial.printf("[2] PMS read failed %d times\r\n", ag->pms5003t_2.getFailCount()); if (ag->pms5003t_2.getFailCount() >= PMS_FAIL_COUNT_SET_INVALID) { - measurements.pm01_2 = utils::getInvalidPMS(); - measurements.pm25_2 = utils::getInvalidPMS(); - measurements.pm10_2 = utils::getInvalidPMS(); - measurements.pm03PCount_2 = utils::getInvalidPMS(); + measurements.pm01_2 = utils::getInvalidPmValue(); + measurements.pm25_2 = utils::getInvalidPmValue(); + measurements.pm10_2 = utils::getInvalidPmValue(); + measurements.pm03PCount_2 = utils::getInvalidPmValue(); measurements.temp_2 = utils::getInvalidTemperature(); measurements.hum_2 = utils::getInvalidHumidity(); } if (ag->pms5003t_2.getFailCount() >= ag->pms5003t_2.getFailCountMax()) { - failToRestart = true; + restart = true; } } } @@ -1220,8 +1220,8 @@ static void updatePm(void) { } } - if (failToRestart) { - Serial.printf("Restarting..."); + if (restart) { + Serial.printf("PMS failure count reach to max set %d, restarting...", ag->pms5003.getFailCountMax()); ESP.restart(); } } diff --git a/examples/OneOpenAir/OpenMetrics.cpp b/examples/OneOpenAir/OpenMetrics.cpp index c458a8c..ada9871 100644 --- a/examples/OneOpenAir/OpenMetrics.cpp +++ b/examples/OneOpenAir/OpenMetrics.cpp @@ -67,10 +67,10 @@ String OpenMetrics::getPayload(void) { float _temp = utils::getInvalidTemperature(); float _hum = utils::getInvalidHumidity(); - int pm01 = utils::getInvalidPMS(); - int pm25 = utils::getInvalidPMS(); - int pm10 = utils::getInvalidPMS(); - int pm03PCount = utils::getInvalidPMS(); + int pm01 = utils::getInvalidPmValue(); + int pm25 = utils::getInvalidPmValue(); + int pm10 = utils::getInvalidPmValue(); + int pm03PCount = utils::getInvalidPmValue(); int atmpCompensated = utils::getInvalidTemperature(); int ahumCompensated = utils::getInvalidHumidity(); if (config.hasSensorPMS1 && config.hasSensorPMS2) { diff --git a/src/Main/utils.cpp b/src/Main/utils.cpp index 1c8175d..6a4d0e1 100644 --- a/src/Main/utils.cpp +++ b/src/Main/utils.cpp @@ -82,7 +82,7 @@ float utils::getInvalidHumidity(void) { return INVALID_HUMIDITY; } int utils::getInvalidCO2(void) { return INVALID_CO2; } -int utils::getInvalidPMS(void) { return INVALID_PMS; } +int utils::getInvalidPmValue(void) { return INVALID_PMS; } int utils::getInvalidNOx(void) { return INVALID_NOX; } diff --git a/src/Main/utils.h b/src/Main/utils.h index 841d5ec..a1efa93 100644 --- a/src/Main/utils.h +++ b/src/Main/utils.h @@ -21,7 +21,7 @@ public: static float getInvalidTemperature(void); static float getInvalidHumidity(void); static int getInvalidCO2(void); - static int getInvalidPMS(void); + static int getInvalidPmValue(void); static int getInvalidNOx(void); static int getInvalidVOC(void); }; diff --git a/src/PMS/PMS.cpp b/src/PMS/PMS.cpp index 0629d05..1d1ad1c 100644 --- a/src/PMS/PMS.cpp +++ b/src/PMS/PMS.cpp @@ -158,11 +158,7 @@ void PMSBase::updateFailCount(void) { } } -/** - * @brief Reset number of fail - * - */ -void PMSBase::resetFailCount(void) {failCount = 0;} +void PMSBase::resetFailCount(void) { failCount = 0; } /** * @brief Get number of fail @@ -171,11 +167,6 @@ void PMSBase::resetFailCount(void) {failCount = 0;} */ int PMSBase::getFailCount(void) { return failCount; } -/** - * @brief Get maximum of fail count max - * - * @return int - */ int PMSBase::getFailCountMax(void) { return failCountMax; } /** diff --git a/src/PMS/PMS5003.cpp b/src/PMS/PMS5003.cpp index 8bed516..73dd569 100644 --- a/src/PMS/PMS5003.cpp +++ b/src/PMS/PMS5003.cpp @@ -176,18 +176,10 @@ void PMS5003::handle(void) { pms.handle(); } */ bool PMS5003::isFailed(void) { return pms.isFailed(); } -/** - * @brief Increate number of fail - * - */ void PMS5003::updateFailCount(void) { pms.updateFailCount(); } -/** - * @brief Reset fail count - * - */ void PMS5003::resetFailCount(void) { pms.resetFailCount(); } diff --git a/src/PMS/PMS5003T.cpp b/src/PMS/PMS5003T.cpp index b3ad9fc..8493504 100644 --- a/src/PMS/PMS5003T.cpp +++ b/src/PMS/PMS5003T.cpp @@ -216,18 +216,10 @@ void PMS5003T::handle(void) { pms.handle(); } */ bool PMS5003T::isFailed(void) { return pms.isFailed(); } -/** - * @brief Increate number of fail - * - */ void PMS5003T::updateFailCount(void) { pms.updateFailCount(); } -/** - * @brief Reset fail count - * - */ void PMS5003T::resetFailCount(void) { pms.resetFailCount(); } From 17238cff86bba28017bcaa73f671326721df0af6 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Mon, 26 Aug 2024 15:52:31 +0700 Subject: [PATCH 14/24] fix compile failed. --- examples/DiyProIndoorV3_3/DiyProIndoorV3_3.ino | 2 +- examples/DiyProIndoorV4_2/DiyProIndoorV4_2.ino | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/DiyProIndoorV3_3/DiyProIndoorV3_3.ino b/examples/DiyProIndoorV3_3/DiyProIndoorV3_3.ino index 7ecc082..d842fff 100644 --- a/examples/DiyProIndoorV3_3/DiyProIndoorV3_3.ino +++ b/examples/DiyProIndoorV3_3/DiyProIndoorV3_3.ino @@ -577,7 +577,7 @@ static void updatePm(void) { } if(ag.pms5003.getFailCount() >= ag.pms5003.getFailCountMax()) { - Serial.printf("PMS failure count reach to max set %d, restarting...", ag->pms5003.getFailCountMax()); + Serial.printf("PMS failure count reach to max set %d, restarting...", ag.pms5003.getFailCountMax()); ESP.restart(); } } diff --git a/examples/DiyProIndoorV4_2/DiyProIndoorV4_2.ino b/examples/DiyProIndoorV4_2/DiyProIndoorV4_2.ino index ac78467..eec919e 100644 --- a/examples/DiyProIndoorV4_2/DiyProIndoorV4_2.ino +++ b/examples/DiyProIndoorV4_2/DiyProIndoorV4_2.ino @@ -620,7 +620,7 @@ static void updatePm(void) { } if(ag.pms5003.getFailCount() >= ag.pms5003.getFailCountMax()) { - Serial.printf("PMS failure count reach to max set %d, restarting...", ag->pms5003.getFailCountMax()); + Serial.printf("PMS failure count reach to max set %d, restarting...", ag.pms5003.getFailCountMax()); ESP.restart(); } } From 1afcca25a1280b55028579bebd04749d84c7b635 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Mon, 26 Aug 2024 15:54:41 +0700 Subject: [PATCH 15/24] Fix compile failed. --- examples/BASIC/BASIC.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/BASIC/BASIC.ino b/examples/BASIC/BASIC.ino index 85ffd45..7419f13 100644 --- a/examples/BASIC/BASIC.ino +++ b/examples/BASIC/BASIC.ino @@ -525,7 +525,7 @@ static void updatePm(void) { } if(ag.pms5003.getFailCount() >= ag.pms5003.getFailCountMax()) { - Serial.printf("PMS failure count reach to max set %d, restarting...", ag->pms5003.getFailCountMax()); + Serial.printf("PMS failure count reach to max set %d, restarting...", ag.pms5003.getFailCountMax()); ESP.restart(); } } From 6b65efd3d60bbfbac3adb0bcb73d826877f4437d Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Mon, 26 Aug 2024 20:43:48 +0700 Subject: [PATCH 16/24] fix pm2.5 compensated formula, #225 --- src/PMS/PMS.cpp | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/PMS/PMS.cpp b/src/PMS/PMS.cpp index 1d1ad1c..6bcd8ad 100644 --- a/src/PMS/PMS.cpp +++ b/src/PMS/PMS.cpp @@ -295,29 +295,32 @@ int PMSBase::pm25ToAQI(int pm02) { /** * @brief Correction PM2.5 * + * Formula: https://github.com/airgradienthq/arduino/issues/182 + * * @param pm25 Raw PM2.5 value * @param humidity Humidity value (%) * @return int */ int PMSBase::compensated(int pm25, float humidity) { float value; + float fpm25 = pm25; if (humidity < 0) { humidity = 0; } if (humidity > 100) { - humidity = 100; + humidity = 100.0f; } - if(pm25 < 30) { - value = (pm25 * 0.524f) - (humidity * 0.0862f) + 5.75f; - } else if(pm25 < 50) { - value = (0.786f * (pm25 / 20 - 3 / 2) + 0.524f * (1 - (pm25 / 20 - 3 / 2))) * pm25 - (0.0862f * humidity) + 5.75f; - } else if(pm25 < 210) { - value = (0.786f * pm25) - (0.0862f * humidity) + 5.75f; - } else if(pm25 < 260) { - value = (0.69f * (pm25/50 - 21/5) + 0.786f * (1 - (pm25/50 - 21/5))) * pm25 - (0.0862f * humidity * (1 - (pm25/50 - 21/5))) + (2.966f * (pm25/50 -21/5)) + (5.75f * (1 - (pm25/50 - 21/5))) + (8.84f * (1.e-4) * pm25* (pm25/50 - 21/5)); - } else { - value = 2.966f + (0.69f * pm25) + (8.84f * (1.e-4) * pm25); + if(pm25 < 30) { /** pm2.5 < 30 */ + value = (fpm25 * 0.524f) - (humidity * 0.0862f) + 5.75f; + } else if(pm25 < 50) { /** 30 <= pm2.5 < 50 */ + value = (0.786f * (fpm25 * 0.05f - 1.5f) + 0.524f * (1 - (fpm25 * 0.05f - 1.5f))) * fpm25 - (0.0862f * humidity) + 5.75f; + } else if(pm25 < 210) { /** 50 <= pm2.5 < 210 */ + value = (0.786f * fpm25) - (0.0862f * humidity) + 5.75f; + } else if(pm25 < 260) { /** 210 <= pm2.5 < 260 */ + value = (0.69f * (fpm25 * 0.02f - 4.2f) + 0.786f * (1 - (fpm25 * 0.02f - 4.2f))) * fpm25 - (0.0862f * humidity * (1 - (fpm25 * 0.02f - 4.2f))) + (2.966f * (fpm25 * 0.02f - 4.2f)) + (5.75f * (1 - (fpm25 * 0.02f - 4.2f))) + (8.84f * (1.e-4) * fpm25 * fpm25 * (fpm25 * 0.02f - 4.2f)); + } else { /** 260 <= pm2.5 */ + value = 2.966f + (0.69f * fpm25) + (8.84f * (1.e-4) * fpm25 * fpm25); } if(value < 0) { From c52962d6285a7ed2729ff43f423a803892f10553 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Mon, 26 Aug 2024 20:47:48 +0700 Subject: [PATCH 17/24] Update float constant --- src/PMS/PMS.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PMS/PMS.cpp b/src/PMS/PMS.cpp index 6bcd8ad..450d128 100644 --- a/src/PMS/PMS.cpp +++ b/src/PMS/PMS.cpp @@ -314,11 +314,11 @@ int PMSBase::compensated(int pm25, float humidity) { if(pm25 < 30) { /** pm2.5 < 30 */ value = (fpm25 * 0.524f) - (humidity * 0.0862f) + 5.75f; } else if(pm25 < 50) { /** 30 <= pm2.5 < 50 */ - value = (0.786f * (fpm25 * 0.05f - 1.5f) + 0.524f * (1 - (fpm25 * 0.05f - 1.5f))) * fpm25 - (0.0862f * humidity) + 5.75f; + value = (0.786f * (fpm25 * 0.05f - 1.5f) + 0.524f * (1.0f - (fpm25 * 0.05f - 1.5f))) * fpm25 - (0.0862f * humidity) + 5.75f; } else if(pm25 < 210) { /** 50 <= pm2.5 < 210 */ value = (0.786f * fpm25) - (0.0862f * humidity) + 5.75f; } else if(pm25 < 260) { /** 210 <= pm2.5 < 260 */ - value = (0.69f * (fpm25 * 0.02f - 4.2f) + 0.786f * (1 - (fpm25 * 0.02f - 4.2f))) * fpm25 - (0.0862f * humidity * (1 - (fpm25 * 0.02f - 4.2f))) + (2.966f * (fpm25 * 0.02f - 4.2f)) + (5.75f * (1 - (fpm25 * 0.02f - 4.2f))) + (8.84f * (1.e-4) * fpm25 * fpm25 * (fpm25 * 0.02f - 4.2f)); + value = (0.69f * (fpm25 * 0.02f - 4.2f) + 0.786f * (1.0f - (fpm25 * 0.02f - 4.2f))) * fpm25 - (0.0862f * humidity * (1.0f - (fpm25 * 0.02f - 4.2f))) + (2.966f * (fpm25 * 0.02f - 4.2f)) + (5.75f * (1.0f - (fpm25 * 0.02f - 4.2f))) + (8.84f * (1.e-4) * fpm25 * fpm25 * (fpm25 * 0.02f - 4.2f)); } else { /** 260 <= pm2.5 */ value = 2.966f + (0.69f * fpm25) + (8.84f * (1.e-4) * fpm25 * fpm25); } From 753f22923caa97cf0630c5a8da1ec6c6f44cb47e Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Fri, 30 Aug 2024 19:07:31 +0700 Subject: [PATCH 18/24] rename `isValidPMS` to `isValidPm` --- examples/BASIC/OpenMetrics.cpp | 8 +-- examples/DiyProIndoorV3_3/OpenMetrics.cpp | 8 +-- examples/DiyProIndoorV4_2/OpenMetrics.cpp | 8 +-- examples/OneOpenAir/OpenMetrics.cpp | 8 +-- src/AgOledDisplay.cpp | 6 +-- src/AgValue.cpp | 64 +++++++++++------------ src/Main/utils.cpp | 4 +- src/Main/utils.h | 4 +- 8 files changed, 55 insertions(+), 55 deletions(-) diff --git a/examples/BASIC/OpenMetrics.cpp b/examples/BASIC/OpenMetrics.cpp index 5737a10..cffd2c6 100644 --- a/examples/BASIC/OpenMetrics.cpp +++ b/examples/BASIC/OpenMetrics.cpp @@ -89,28 +89,28 @@ String OpenMetrics::getPayload(void) { } if (config.hasSensorPMS1) { - if (utils::isValidPMS(pm01)) { + if (utils::isValidPm(pm01)) { add_metric("pm1", "PM1.0 concentration as measured by the AirGradient PMS " "sensor, in micrograms per cubic meter", "gauge", "ugm3"); add_metric_point("", String(pm01)); } - if (utils::isValidPMS(pm25)) { + if (utils::isValidPm(pm25)) { add_metric("pm2d5", "PM2.5 concentration as measured by the AirGradient PMS " "sensor, in micrograms per cubic meter", "gauge", "ugm3"); add_metric_point("", String(pm25)); } - if (utils::isValidPMS(pm10)) { + if (utils::isValidPm(pm10)) { add_metric("pm10", "PM10 concentration as measured by the AirGradient PMS " "sensor, in micrograms per cubic meter", "gauge", "ugm3"); add_metric_point("", String(pm10)); } - if (utils::isValidPMS03Count(pm03PCount)) { + if (utils::isValidPm03Count(pm03PCount)) { add_metric("pm0d3", "PM0.3 concentration as measured by the AirGradient PMS " "sensor, in number of particules per 100 milliliters", diff --git a/examples/DiyProIndoorV3_3/OpenMetrics.cpp b/examples/DiyProIndoorV3_3/OpenMetrics.cpp index 5737a10..cffd2c6 100644 --- a/examples/DiyProIndoorV3_3/OpenMetrics.cpp +++ b/examples/DiyProIndoorV3_3/OpenMetrics.cpp @@ -89,28 +89,28 @@ String OpenMetrics::getPayload(void) { } if (config.hasSensorPMS1) { - if (utils::isValidPMS(pm01)) { + if (utils::isValidPm(pm01)) { add_metric("pm1", "PM1.0 concentration as measured by the AirGradient PMS " "sensor, in micrograms per cubic meter", "gauge", "ugm3"); add_metric_point("", String(pm01)); } - if (utils::isValidPMS(pm25)) { + if (utils::isValidPm(pm25)) { add_metric("pm2d5", "PM2.5 concentration as measured by the AirGradient PMS " "sensor, in micrograms per cubic meter", "gauge", "ugm3"); add_metric_point("", String(pm25)); } - if (utils::isValidPMS(pm10)) { + if (utils::isValidPm(pm10)) { add_metric("pm10", "PM10 concentration as measured by the AirGradient PMS " "sensor, in micrograms per cubic meter", "gauge", "ugm3"); add_metric_point("", String(pm10)); } - if (utils::isValidPMS03Count(pm03PCount)) { + if (utils::isValidPm03Count(pm03PCount)) { add_metric("pm0d3", "PM0.3 concentration as measured by the AirGradient PMS " "sensor, in number of particules per 100 milliliters", diff --git a/examples/DiyProIndoorV4_2/OpenMetrics.cpp b/examples/DiyProIndoorV4_2/OpenMetrics.cpp index 5737a10..cffd2c6 100644 --- a/examples/DiyProIndoorV4_2/OpenMetrics.cpp +++ b/examples/DiyProIndoorV4_2/OpenMetrics.cpp @@ -89,28 +89,28 @@ String OpenMetrics::getPayload(void) { } if (config.hasSensorPMS1) { - if (utils::isValidPMS(pm01)) { + if (utils::isValidPm(pm01)) { add_metric("pm1", "PM1.0 concentration as measured by the AirGradient PMS " "sensor, in micrograms per cubic meter", "gauge", "ugm3"); add_metric_point("", String(pm01)); } - if (utils::isValidPMS(pm25)) { + if (utils::isValidPm(pm25)) { add_metric("pm2d5", "PM2.5 concentration as measured by the AirGradient PMS " "sensor, in micrograms per cubic meter", "gauge", "ugm3"); add_metric_point("", String(pm25)); } - if (utils::isValidPMS(pm10)) { + if (utils::isValidPm(pm10)) { add_metric("pm10", "PM10 concentration as measured by the AirGradient PMS " "sensor, in micrograms per cubic meter", "gauge", "ugm3"); add_metric_point("", String(pm10)); } - if (utils::isValidPMS03Count(pm03PCount)) { + if (utils::isValidPm03Count(pm03PCount)) { add_metric("pm0d3", "PM0.3 concentration as measured by the AirGradient PMS " "sensor, in number of particules per 100 milliliters", diff --git a/examples/OneOpenAir/OpenMetrics.cpp b/examples/OneOpenAir/OpenMetrics.cpp index ada9871..9abefd8 100644 --- a/examples/OneOpenAir/OpenMetrics.cpp +++ b/examples/OneOpenAir/OpenMetrics.cpp @@ -123,28 +123,28 @@ String OpenMetrics::getPayload(void) { } if (config.hasSensorPMS1 || config.hasSensorPMS2) { - if (utils::isValidPMS(pm01)) { + if (utils::isValidPm(pm01)) { add_metric("pm1", "PM1.0 concentration as measured by the AirGradient PMS " "sensor, in micrograms per cubic meter", "gauge", "ugm3"); add_metric_point("", String(pm01)); } - if (utils::isValidPMS(pm25)) { + if (utils::isValidPm(pm25)) { add_metric("pm2d5", "PM2.5 concentration as measured by the AirGradient PMS " "sensor, in micrograms per cubic meter", "gauge", "ugm3"); add_metric_point("", String(pm25)); } - if (utils::isValidPMS(pm10)) { + if (utils::isValidPm(pm10)) { add_metric("pm10", "PM10 concentration as measured by the AirGradient PMS " "sensor, in micrograms per cubic meter", "gauge", "ugm3"); add_metric_point("", String(pm10)); } - if (utils::isValidPMS03Count(pm03PCount)) { + if (utils::isValidPm03Count(pm03PCount)) { add_metric("pm0d3", "PM0.3 concentration as measured by the AirGradient PMS " "sensor, in number of particules per 100 milliliters", diff --git a/src/AgOledDisplay.cpp b/src/AgOledDisplay.cpp index f717628..109be27 100644 --- a/src/AgOledDisplay.cpp +++ b/src/AgOledDisplay.cpp @@ -311,7 +311,7 @@ void OledDisplay::showDashboard(const char *status) { } DISP()->setFont(u8g2_font_t0_22b_tf); if (config.isPmStandardInUSAQI()) { - if (utils::isValidPMS(pm25)) { + if (utils::isValidPm(pm25)) { sprintf(strBuf, "%d", ag->pms5003.convertPm25ToUsAqi(pm25)); } else { sprintf(strBuf, "%s", "-"); @@ -320,7 +320,7 @@ void OledDisplay::showDashboard(const char *status) { DISP()->setFont(u8g2_font_t0_12_tf); DISP()->drawUTF8(55, 61, "AQI"); } else { - if (utils::isValidPMS(pm25)) { + if (utils::isValidPm(pm25)) { sprintf(strBuf, "%d", pm25); } else { sprintf(strBuf, "%s", "-"); @@ -370,7 +370,7 @@ void OledDisplay::showDashboard(const char *status) { pm25 = (int)ag->pms5003.compensate(pm25, value.Humidity); } ag->display.setCursor(0, 12); - if (utils::isValidPMS(pm25)) { + if (utils::isValidPm(pm25)) { snprintf(strBuf, sizeof(strBuf), "PM2.5:%d", pm25); } else { snprintf(strBuf, sizeof(strBuf), "PM2.5:-"); diff --git a/src/AgValue.cpp b/src/AgValue.cpp index 3628fbd..70e339b 100644 --- a/src/AgValue.cpp +++ b/src/AgValue.cpp @@ -54,16 +54,16 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, if (ag->isOne() || (ag->isPro4_2()) || ag->isPro3_3() || ag->isBasic()) { if (config->hasSensorPMS1) { - if (utils::isValidPMS(this->pm01_1)) { + if (utils::isValidPm(this->pm01_1)) { root["pm01"] = this->pm01_1; } - if (utils::isValidPMS(this->pm25_1)) { + if (utils::isValidPm(this->pm25_1)) { root["pm02"] = this->pm25_1; } - if (utils::isValidPMS(this->pm10_1)) { + if (utils::isValidPm(this->pm10_1)) { root["pm10"] = this->pm10_1; } - if (utils::isValidPMS03Count(this->pm03PCount_1)) { + if (utils::isValidPm03Count(this->pm03PCount_1)) { root["pm003Count"] = this->pm03PCount_1; } if (!localServer) { @@ -97,16 +97,16 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, } else { if (config->hasSensorPMS1 && config->hasSensorPMS2) { - if (utils::isValidPMS(this->pm01_1) && utils::isValidPMS(this->pm01_2)) { + if (utils::isValidPm(this->pm01_1) && utils::isValidPm(this->pm01_2)) { root["pm01"] = ag->round2((this->pm01_1 + this->pm01_2) / 2.0f); } - if (utils::isValidPMS(this->pm25_1) && utils::isValidPMS(this->pm25_2)) { + if (utils::isValidPm(this->pm25_1) && utils::isValidPm(this->pm25_2)) { root["pm02"] = ag->round2((this->pm25_1 + this->pm25_2) / 2.0f); } - if (utils::isValidPMS(this->pm10_1) && utils::isValidPMS(this->pm10_2)) { + if (utils::isValidPm(this->pm10_1) && utils::isValidPm(this->pm10_2)) { root["pm10"] = ag->round2((this->pm10_1 + this->pm10_2) / 2.0f); } - if (utils::isValidPMS(this->pm03PCount_1) && utils::isValidPMS(this->pm03PCount_2)) { + if (utils::isValidPm(this->pm03PCount_1) && utils::isValidPm(this->pm03PCount_2)) { root["pm003Count"] = ag->round2((this->pm03PCount_1 + this->pm03PCount_2) / 2.0f); } @@ -139,16 +139,16 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, if (fwMode == FW_MODE_O_1PS || fwMode == FW_MODE_O_1PST) { float val; if (config->hasSensorPMS1) { - if (utils::isValidPMS(this->pm01_1)) { + if (utils::isValidPm(this->pm01_1)) { root["pm01"] = this->pm01_1; } - if (utils::isValidPMS(this->pm25_1)) { + if (utils::isValidPm(this->pm25_1)) { root["pm02"] = this->pm25_1; } - if (utils::isValidPMS(this->pm10_1)) { + if (utils::isValidPm(this->pm10_1)) { root["pm10"] = this->pm10_1; } - if (utils::isValidPMS03Count(this->pm03PCount_1)) { + if (utils::isValidPm03Count(this->pm03PCount_1)) { root["pm003Count"] = this->pm03PCount_1; } if (utils::isValidTemperature(this->temp_1)) { @@ -178,16 +178,16 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, } } if (config->hasSensorPMS2) { - if(utils::isValidPMS(this->pm01_2)) { + if(utils::isValidPm(this->pm01_2)) { root["pm01"] = this->pm01_2; } - if(utils::isValidPMS(this->pm25_2)) { + if(utils::isValidPm(this->pm25_2)) { root["pm02"] = this->pm25_2; } - if(utils::isValidPMS(this->pm10_2)) { + if(utils::isValidPm(this->pm10_2)) { root["pm10"] = this->pm10_2; } - if(utils::isValidPMS03Count(this->pm03PCount_2)) { + if(utils::isValidPm03Count(this->pm03PCount_2)) { root["pm003Count"] = this->pm03PCount_2; } @@ -222,16 +222,16 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, if (fwMode == FW_MODE_O_1P) { float val; if (config->hasSensorPMS1) { - if (utils::isValidPMS(this->pm01_1)) { + if (utils::isValidPm(this->pm01_1)) { root["pm01"] = this->pm01_1; } - if (utils::isValidPMS(this->pm25_1)) { + if (utils::isValidPm(this->pm25_1)) { root["pm02"] = this->pm25_1; } - if (utils::isValidPMS(this->pm10_1)) { + if (utils::isValidPm(this->pm10_1)) { root["pm10"] = this->pm10_1; } - if (utils::isValidPMS03Count(this->pm03PCount_1)) { + if (utils::isValidPm03Count(this->pm03PCount_1)) { root["pm003Count"] = this->pm03PCount_1; } if (utils::isValidTemperature(this->temp_1)) { @@ -259,16 +259,16 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, pms5003TFirmwareVersion(ag->pms5003t_1.getFirmwareVersion()); } } else if (config->hasSensorPMS2) { - if(utils::isValidPMS(this->pm01_2)) { + if(utils::isValidPm(this->pm01_2)) { root["pm01"] = this->pm01_2; } - if(utils::isValidPMS(this->pm25_2)) { + if(utils::isValidPm(this->pm25_2)) { root["pm02"] = this->pm25_2; } - if(utils::isValidPMS(this->pm10_2)) { + if(utils::isValidPm(this->pm10_2)) { root["pm10"] = this->pm10_2; } - if(utils::isValidPMS03Count(this->pm03PCount_2)) { + if(utils::isValidPm03Count(this->pm03PCount_2)) { root["pm003Count"] = this->pm03PCount_2; } if (utils::isValidTemperature(this->temp_2)) { @@ -300,16 +300,16 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, } else { float val; if (config->hasSensorPMS1) { - if(utils::isValidPMS(this->pm01_1)) { + if(utils::isValidPm(this->pm01_1)) { root["channels"]["1"]["pm01"] = this->pm01_1; } - if(utils::isValidPMS(this->pm25_1)) { + if(utils::isValidPm(this->pm25_1)) { root["channels"]["1"]["pm02"] = this->pm25_1; } - if(utils::isValidPMS(this->pm10_1)) { + if(utils::isValidPm(this->pm10_1)) { root["channels"]["1"]["pm10"] = this->pm10_1; } - if (utils::isValidPMS03Count(this->pm03PCount_1)) { + if (utils::isValidPm03Count(this->pm03PCount_1)) { root["channels"]["1"]["pm003Count"] = this->pm03PCount_1; } if(utils::isValidTemperature(this->temp_1)) { @@ -342,16 +342,16 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, } if (config->hasSensorPMS2) { float val; - if (utils::isValidPMS(this->pm01_2)) { + if (utils::isValidPm(this->pm01_2)) { root["channels"]["2"]["pm01"] = this->pm01_2; } - if (utils::isValidPMS(this->pm25_2)) { + if (utils::isValidPm(this->pm25_2)) { root["channels"]["2"]["pm02"] = this->pm25_2; } - if (utils::isValidPMS(this->pm10_2)) { + if (utils::isValidPm(this->pm10_2)) { root["channels"]["2"]["pm10"] = this->pm10_2; } - if (utils::isValidPMS03Count(this->pm03PCount_2)) { + if (utils::isValidPm03Count(this->pm03PCount_2)) { root["channels"]["2"]["pm003Count"] = this->pm03PCount_2; } if (utils::isValidTemperature(this->temp_2)) { diff --git a/src/Main/utils.cpp b/src/Main/utils.cpp index 6a4d0e1..42b06a5 100644 --- a/src/Main/utils.cpp +++ b/src/Main/utils.cpp @@ -48,14 +48,14 @@ bool utils::isValidCO2(int16_t value) { return false; } -bool utils::isValidPMS(int value) { +bool utils::isValidPm(int value) { if ((value >= VALID_PMS_MIN) && (value <= VALID_PMS_MAX)) { return true; } return false; } -bool utils::isValidPMS03Count(int value) { +bool utils::isValidPm03Count(int value) { if (value >= VALID_PMS03COUNT_MIN) { return true; } diff --git a/src/Main/utils.h b/src/Main/utils.h index a1efa93..b51ac98 100644 --- a/src/Main/utils.h +++ b/src/Main/utils.h @@ -14,8 +14,8 @@ public: static bool isValidTemperature(float value); static bool isValidHumidity(float value); static bool isValidCO2(int16_t value); - static bool isValidPMS(int value); - static bool isValidPMS03Count(int value); + static bool isValidPm(int value); + static bool isValidPm03Count(int value); static bool isValidNOx(int value); static bool isValidVOC(int value); static float getInvalidTemperature(void); From 28d27ee8fdaa905516828e54df612b7ee9d9a3b5 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Fri, 30 Aug 2024 19:17:58 +0700 Subject: [PATCH 19/24] Rename `temperatureCompensated` to `compensateTemp` and `humidityCompensated` to `compensateHum` --- examples/OneOpenAir/OneOpenAir.ino | 8 ++++---- examples/OneOpenAir/OpenMetrics.cpp | 4 ++-- src/AgValue.cpp | 28 ++++++++++++++-------------- src/PMS/PMS5003TBase.cpp | 4 ++-- src/PMS/PMS5003TBase.h | 4 ++-- 5 files changed, 24 insertions(+), 24 deletions(-) diff --git a/examples/OneOpenAir/OneOpenAir.ino b/examples/OneOpenAir/OneOpenAir.ino index b49deec..456cdda 100644 --- a/examples/OneOpenAir/OneOpenAir.ino +++ b/examples/OneOpenAir/OneOpenAir.ino @@ -1054,9 +1054,9 @@ static void updatePm(void) { Serial.printf("[1] Temperature in C: %0.2f\r\n", measurements.temp_1); Serial.printf("[1] Relative Humidity: %d\r\n", measurements.hum_1); Serial.printf("[1] Temperature compensated in C: %0.2f\r\n", - ag->pms5003t_1.temperatureCompensated(measurements.temp_1)); + ag->pms5003t_1.compensateTemp(measurements.temp_1)); Serial.printf("[1] Relative Humidity compensated: %0.2f\r\n", - ag->pms5003t_1.humidityCompensated(measurements.hum_1)); + ag->pms5003t_1.compensateHum(measurements.hum_1)); ag->pms5003t_1.resetFailCount(); } else { @@ -1097,9 +1097,9 @@ static void updatePm(void) { Serial.printf("[2] Temperature in C: %0.2f\r\n", measurements.temp_2); Serial.printf("[2] Relative Humidity: %d\r\n", measurements.hum_2); Serial.printf("[2] Temperature compensated in C: %0.2f\r\n", - ag->pms5003t_1.temperatureCompensated(measurements.temp_2)); + ag->pms5003t_1.compensateTemp(measurements.temp_2)); Serial.printf("[2] Relative Humidity compensated: %0.2f\r\n", - ag->pms5003t_1.humidityCompensated(measurements.hum_2)); + ag->pms5003t_1.compensateHum(measurements.hum_2)); ag->pms5003t_2.resetFailCount(); } else { diff --git a/examples/OneOpenAir/OpenMetrics.cpp b/examples/OneOpenAir/OpenMetrics.cpp index ada9871..cacba90 100644 --- a/examples/OneOpenAir/OpenMetrics.cpp +++ b/examples/OneOpenAir/OpenMetrics.cpp @@ -118,8 +118,8 @@ String OpenMetrics::getPayload(void) { atmpCompensated = _temp; ahumCompensated = _hum; } else { - atmpCompensated = ag->pms5003t_1.temperatureCompensated(_temp); - ahumCompensated = ag->pms5003t_1.humidityCompensated(_hum); + atmpCompensated = ag->pms5003t_1.compensateTemp(_temp); + ahumCompensated = ag->pms5003t_1.compensateHum(_hum); } if (config.hasSensorPMS1 || config.hasSensorPMS2) { diff --git a/src/AgValue.cpp b/src/AgValue.cpp index 015a788..ce6e238 100644 --- a/src/AgValue.cpp +++ b/src/AgValue.cpp @@ -76,7 +76,7 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, if (utils::isValidTemperature(this->temp_1) && utils::isValidTemperature(this->temp_1)) { root["atmp"] = ag->round2((this->temp_1 + this->temp_2) / 2.0f); if (localServer) { - val = ag->pms5003t_2.temperatureCompensated((this->temp_1 + this->temp_2) / 2.0f); + val = ag->pms5003t_2.compensateTemp((this->temp_1 + this->temp_2) / 2.0f); if (utils::isValidTemperature(val)) { root["atmpCompensated"] = ag->round2(val); } @@ -85,7 +85,7 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, if (utils::isValidHumidity(this->hum_1) && utils::isValidHumidity(this->hum_1)) { root["rhum"] = ag->round2((this->hum_1 + this->hum_2) / 2.0f); if (localServer) { - val = ag->pms5003t_2.humidityCompensated((this->hum_1 + this->hum_2) / 2.0f); + val = ag->pms5003t_2.compensateHum((this->hum_1 + this->hum_2) / 2.0f); if (utils::isValidHumidity(val)) { root["rhumCompensated"] = (int)val; } @@ -117,7 +117,7 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, root["atmp"] = ag->round2(this->temp_1); if (localServer) { - val = ag->pms5003t_1.temperatureCompensated(this->temp_1); + val = ag->pms5003t_1.compensateTemp(this->temp_1); if (utils::isValidTemperature(val)) { root["atmpCompensated"] = ag->round2(val); } @@ -127,7 +127,7 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, root["rhum"] = this->hum_1; if (localServer) { - val = ag->pms5003t_1.humidityCompensated(this->hum_1); + val = ag->pms5003t_1.compensateHum(this->hum_1); if (utils::isValidHumidity(val)) { root["rhumCompensated"] = (int)val; } @@ -154,7 +154,7 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, root["atmp"] = ag->round2(this->temp_2); if (localServer) { - val = ag->pms5003t_2.temperatureCompensated(this->temp_2); + val = ag->pms5003t_2.compensateTemp(this->temp_2); if (utils::isValidTemperature(val)) { root["atmpCompensated"] = ag->round2(val); } @@ -164,7 +164,7 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, root["rhum"] = this->hum_2; if (localServer) { - val = ag->pms5003t_2.humidityCompensated(this->hum_2); + val = ag->pms5003t_2.compensateHum(this->hum_2); if (utils::isValidHumidity(val)) { root["rhumCompensated"] = (int)val; } @@ -192,7 +192,7 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, root["atmp"] = ag->round2(this->temp_1); if (localServer) { - val = ag->pms5003t_1.temperatureCompensated(this->temp_1); + val = ag->pms5003t_1.compensateTemp(this->temp_1); if (utils::isValidTemperature(val)) { root["atmpCompensated"] = ag->round2(val); } @@ -201,7 +201,7 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, if (utils::isValidHumidity(this->hum_1)) { root["rhum"] = this->hum_1; if(localServer) { - val = ag->pms5003t_1.humidityCompensated(this->hum_1); + val = ag->pms5003t_1.compensateHum(this->hum_1); if(utils::isValidHumidity(val)) { root["rhumCompensated"] = (int)val; } @@ -225,7 +225,7 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, root["atmp"] = ag->round2(this->temp_2); if (localServer) { - val = ag->pms5003t_1.temperatureCompensated(this->temp_2); + val = ag->pms5003t_1.compensateTemp(this->temp_2); if (utils::isValidTemperature(val)) { root["atmpCompensated"] = ag->round2(val); } @@ -235,7 +235,7 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, root["rhum"] = this->hum_2; if(localServer) { - val = ag->pms5003t_1.humidityCompensated(this->hum_2); + val = ag->pms5003t_1.compensateHum(this->hum_2); if(utils::isValidHumidity(val)) { root["rhumCompensated"] = (int)val; } @@ -262,7 +262,7 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, root["channels"]["1"]["atmp"] = ag->round2(this->temp_1); if (localServer) { - val = ag->pms5003t_1.temperatureCompensated(this->temp_1); + val = ag->pms5003t_1.compensateTemp(this->temp_1); if (utils::isValidTemperature(val)) { root["channels"]["1"]["atmpCompensated"] = ag->round2(val); } @@ -272,7 +272,7 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, root["channels"]["1"]["rhum"] = this->hum_1; if (localServer) { - val = ag->pms5003t_1.humidityCompensated(this->hum_1); + val = ag->pms5003t_1.compensateHum(this->hum_1); if (utils::isValidHumidity(val)) { root["channels"]["1"]["rhumCompensated"] = (int)val; } @@ -298,7 +298,7 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, root["channels"]["2"]["atmp"] = ag->round2(this->temp_2); if (localServer) { - val = ag->pms5003t_1.temperatureCompensated(this->temp_2); + val = ag->pms5003t_1.compensateTemp(this->temp_2); if (utils::isValidTemperature(val)) { root["channels"]["2"]["atmpCompensated"] = ag->round2(val); } @@ -308,7 +308,7 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi, root["channels"]["2"]["rhum"] = this->hum_2; if (localServer) { - val = ag->pms5003t_1.humidityCompensated(this->hum_2); + val = ag->pms5003t_1.compensateHum(this->hum_2); if (utils::isValidHumidity(val)) { root["channels"]["2"]["rhumCompensated"] = (int)val; } diff --git a/src/PMS/PMS5003TBase.cpp b/src/PMS/PMS5003TBase.cpp index 7d7fdbe..ec5dd39 100644 --- a/src/PMS/PMS5003TBase.cpp +++ b/src/PMS/PMS5003TBase.cpp @@ -4,14 +4,14 @@ PMS5003TBase::PMS5003TBase() {} PMS5003TBase::~PMS5003TBase() {} -float PMS5003TBase::temperatureCompensated(float temp) { +float PMS5003TBase::compensateTemp(float temp) { if (temp < 10.0f) { return temp * 1.327f - 6.738f; } return temp * 1.181f - 5.113f; } -float PMS5003TBase::humidityCompensated(float hum) { +float PMS5003TBase::compensateHum(float hum) { hum = hum * 1.259f + 7.34f; if (hum > 100.0f) { diff --git a/src/PMS/PMS5003TBase.h b/src/PMS/PMS5003TBase.h index 0b50449..f5ce142 100644 --- a/src/PMS/PMS5003TBase.h +++ b/src/PMS/PMS5003TBase.h @@ -8,8 +8,8 @@ private: public: PMS5003TBase(); ~PMS5003TBase(); - float temperatureCompensated(float temp); - float humidityCompensated(float hum); + float compensateTemp(float temp); + float compensateHum(float hum); }; #endif From 244b7814a6b64018f8abee2e30e0dd84d3a771dc Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Fri, 30 Aug 2024 19:20:08 +0700 Subject: [PATCH 20/24] add link to formula documents --- src/PMS/PMS5003TBase.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/PMS/PMS5003TBase.cpp b/src/PMS/PMS5003TBase.cpp index ec5dd39..ae9fbd0 100644 --- a/src/PMS/PMS5003TBase.cpp +++ b/src/PMS/PMS5003TBase.cpp @@ -4,6 +4,14 @@ PMS5003TBase::PMS5003TBase() {} PMS5003TBase::~PMS5003TBase() {} +/** + * @brief Compensate the temperature + * + * Reference formula: https://www.airgradient.com/documentation/correction-algorithms/ + * + * @param temp + * @return * float + */ float PMS5003TBase::compensateTemp(float temp) { if (temp < 10.0f) { return temp * 1.327f - 6.738f; @@ -11,6 +19,14 @@ float PMS5003TBase::compensateTemp(float temp) { return temp * 1.181f - 5.113f; } +/** + * @brief Compensate the humidity + * + * Reference formula: https://www.airgradient.com/documentation/correction-algorithms/ + * + * @param temp + * @return * float + */ float PMS5003TBase::compensateHum(float hum) { hum = hum * 1.259f + 7.34f; From 2e9ff0d7ddd86e846297aea03f71a451664f7fce Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Fri, 30 Aug 2024 19:21:54 +0700 Subject: [PATCH 21/24] add link to formula document --- src/PMS/PMS5003.cpp | 2 ++ src/PMS/PMS5003T.cpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/PMS/PMS5003.cpp b/src/PMS/PMS5003.cpp index 4734659..b632627 100644 --- a/src/PMS/PMS5003.cpp +++ b/src/PMS/PMS5003.cpp @@ -124,6 +124,8 @@ int PMS5003::convertPm25ToUsAqi(int pm25) { return pms.pm25ToAQI(pm25); } /** * @brief Correct PM2.5 * + * Reference formula: https://www.airgradient.com/documentation/correction-algorithms/ + * * @param pm25 PM2.5 raw value * @param humidity Humidity value * @return int diff --git a/src/PMS/PMS5003T.cpp b/src/PMS/PMS5003T.cpp index f659098..b5e65f3 100644 --- a/src/PMS/PMS5003T.cpp +++ b/src/PMS/PMS5003T.cpp @@ -167,6 +167,8 @@ float PMS5003T::getRelativeHumidity(void) { /** * @brief Correct PM2.5 * + * Reference formula: https://www.airgradient.com/documentation/correction-algorithms/ + * * @param pm25 PM2.5 raw value * @param humidity Humidity value * @return int From aafaa42a6869f9e0700f8032746fc4ec793c8de7 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Sun, 1 Sep 2024 19:56:11 +0700 Subject: [PATCH 22/24] Update formula link --- src/PMS/PMS.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PMS/PMS.cpp b/src/PMS/PMS.cpp index 450d128..977e174 100644 --- a/src/PMS/PMS.cpp +++ b/src/PMS/PMS.cpp @@ -295,7 +295,7 @@ int PMSBase::pm25ToAQI(int pm02) { /** * @brief Correction PM2.5 * - * Formula: https://github.com/airgradienthq/arduino/issues/182 + * Formula: https://www.airgradient.com/documentation/correction-algorithms/ * * @param pm25 Raw PM2.5 value * @param humidity Humidity value (%) From d3534cda526f7b39911887f8d6601d819dcff14a Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Sun, 1 Sep 2024 20:19:18 +0700 Subject: [PATCH 23/24] handle `ledBarTestRequested` on `OpenAir` --- examples/OneOpenAir/OneOpenAir.ino | 3 ++ src/AgStateMachine.cpp | 67 ++++++++++++++++++------------ src/AirGradient.cpp | 4 ++ src/AirGradient.h | 8 ++++ 4 files changed, 56 insertions(+), 26 deletions(-) diff --git a/examples/OneOpenAir/OneOpenAir.ino b/examples/OneOpenAir/OneOpenAir.ino index 5f9e0fe..5c80112 100644 --- a/examples/OneOpenAir/OneOpenAir.ino +++ b/examples/OneOpenAir/OneOpenAir.ino @@ -939,6 +939,9 @@ static void configUpdateHandle() { stateMachine.executeLedBarTest(); } + else if(ag->isOpenAir()) { + stateMachine.executeLedBarTest(); + } appDispHandler(); appLedHandler(); diff --git a/src/AgStateMachine.cpp b/src/AgStateMachine.cpp index b6e9610..e5566e2 100644 --- a/src/AgStateMachine.cpp +++ b/src/AgStateMachine.cpp @@ -1,5 +1,6 @@ #include "AgStateMachine.h" +#define LED_TEST_BLINK_DELAY 50 /** ms */ #define LED_FAST_BLINK_DELAY 250 /** ms */ #define LED_SLOW_BLINK_DELAY 1000 /** ms */ #define LED_SHORT_BLINK_DELAY 500 /** ms */ @@ -305,18 +306,23 @@ void StateMachine::co2Calibration(void) { void StateMachine::ledBarTest(void) { if (config.isLedBarTestRequested()) { - if (config.getCountry() == "TH") { - uint32_t tstart = millis(); - logInfo("Start run LED test for 2 min"); - while (1) { - ledBarRunTest(); - uint32_t ms = (uint32_t)(millis() - tstart); - if (ms >= (60 * 1000 * 2)) { - logInfo("LED test after 2 min finish"); - break; + if (ag->isOne()) { + if (config.getCountry() == "TH") { + uint32_t tstart = millis(); + logInfo("Start run LED test for 2 min"); + while (1) { + ledBarRunTest(); + uint32_t ms = (uint32_t)(millis() - tstart); + if (ms >= (60 * 1000 * 2)) { + logInfo("LED test after 2 min finish"); + break; + } } + } else { + ledBarRunTest(); } - } else { + } + else if(ag->isOpenAir()) { ledBarRunTest(); } } @@ -325,22 +331,31 @@ void StateMachine::ledBarTest(void) { void StateMachine::ledBarPowerUpTest(void) { ledBarRunTest(); } void StateMachine::ledBarRunTest(void) { - disp.setText("LED Test", "running", "....."); - runLedTest('r'); - ag->ledBar.show(); - delay(1000); - runLedTest('g'); - ag->ledBar.show(); - delay(1000); - runLedTest('b'); - ag->ledBar.show(); - delay(1000); - runLedTest('w'); - ag->ledBar.show(); - delay(1000); - runLedTest('n'); - ag->ledBar.show(); - delay(1000); + if (ag->isOne()) { + disp.setText("LED Test", "running", "....."); + runLedTest('r'); + ag->ledBar.show(); + delay(1000); + runLedTest('g'); + ag->ledBar.show(); + delay(1000); + runLedTest('b'); + ag->ledBar.show(); + delay(1000); + runLedTest('w'); + ag->ledBar.show(); + delay(1000); + runLedTest('n'); + ag->ledBar.show(); + delay(1000); + } else if (ag->isOpenAir()) { + for (int i = 0; i < 100; i++) { + ag->statusLed.setOn(); + delay(LED_TEST_BLINK_DELAY); + ag->statusLed.setOff(); + delay(LED_TEST_BLINK_DELAY); + } + } } void StateMachine::runLedTest(char color) { diff --git a/src/AirGradient.cpp b/src/AirGradient.cpp index 46ed874..a1b70d9 100644 --- a/src/AirGradient.cpp +++ b/src/AirGradient.cpp @@ -65,6 +65,10 @@ bool AirGradient::isOne(void) { return boardType == BoardType::ONE_INDOOR; } +bool AirGradient::isOpenAir(void) { + return boardType == BoardType::OPEN_AIR_OUTDOOR; +} + bool AirGradient::isPro4_2(void) { return boardType == BoardType::DIY_PRO_INDOOR_V4_2; } diff --git a/src/AirGradient.h b/src/AirGradient.h index e94b25e..0666d1a 100644 --- a/src/AirGradient.h +++ b/src/AirGradient.h @@ -135,6 +135,14 @@ public: */ bool isOne(void); + /** + * @brief Check that Airgradient object is OPEN_AIR + * + * @return true + * @return false + */ + bool isOpenAir(void); + /** * @brief Check that Airgradient object is DIY_PRO 4.2 indoor * From 87cc3fc45f95aa193c9045bb7c9eb7beebc64905 Mon Sep 17 00:00:00 2001 From: AirGradient <68736665+airgradienthq@users.noreply.github.com> Date: Mon, 2 Sep 2024 12:18:04 +0700 Subject: [PATCH 24/24] Update library.properties to v 3.1.6 --- library.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library.properties b/library.properties index 40d9338..9cdf627 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=AirGradient Air Quality Sensor -version=3.1.5 +version=3.1.6 author=AirGradient maintainer=AirGradient sentence=ESP32-C3 / ESP8266 library for air quality monitor measuring PM, CO2, Temperature, TVOC and Humidity with OLED display.