Merge branch 'develop' into hotfix/pms25-compensated-show-on-display

This commit is contained in:
Phat Nguyen
2024-08-30 19:02:50 +07:00
18 changed files with 316 additions and 70 deletions

View File

@ -68,7 +68,6 @@ static LocalServer localServer(Serial, openMetrics, measurements, configuration,
wifiConnector); wifiConnector);
static MqttClient mqttClient(Serial); static MqttClient mqttClient(Serial);
static int pmFailCount = 0;
static int getCO2FailCount = 0; static int getCO2FailCount = 0;
static AgFirmwareMode fwMode = FW_MODE_I_BASIC_40PS; static AgFirmwareMode fwMode = FW_MODE_I_BASIC_40PS;
@ -514,15 +513,20 @@ static void updatePm(void) {
Serial.printf("PM2.5 ug/m3: %d\r\n", measurements.pm25_1); 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("PM10 ug/m3: %d\r\n", measurements.pm10_1);
Serial.printf("PM0.3 Count: %d\r\n", measurements.pm03PCount_1); Serial.printf("PM0.3 Count: %d\r\n", measurements.pm03PCount_1);
pmFailCount = 0; ag.pms5003.resetFailCount();
} else { } else {
pmFailCount++; ag.pms5003.updateFailCount();
Serial.printf("PMS read failed: %d\r\n", pmFailCount); Serial.printf("PMS read failed %d times\r\n", ag.pms5003.getFailCount());
if (pmFailCount >= 3) { if (ag.pms5003.getFailCount() >= PMS_FAIL_COUNT_SET_INVALID) {
measurements.pm01_1 = utils::getInvalidPMS(); measurements.pm01_1 = utils::getInvalidPmValue();
measurements.pm25_1 = utils::getInvalidPMS(); measurements.pm25_1 = utils::getInvalidPmValue();
measurements.pm10_1 = utils::getInvalidPMS(); measurements.pm10_1 = utils::getInvalidPmValue();
measurements.pm03PCount_1 = utils::getInvalidPMS(); measurements.pm03PCount_1 = utils::getInvalidPmValue();
}
if(ag.pms5003.getFailCount() >= ag.pms5003.getFailCountMax()) {
Serial.printf("PMS failure count reach to max set %d, restarting...", ag.pms5003.getFailCountMax());
ESP.restart();
} }
} }
} }

View File

@ -67,10 +67,10 @@ String OpenMetrics::getPayload(void) {
float _temp = utils::getInvalidTemperature(); float _temp = utils::getInvalidTemperature();
float _hum = utils::getInvalidHumidity(); float _hum = utils::getInvalidHumidity();
int pm01 = utils::getInvalidPMS(); int pm01 = utils::getInvalidPmValue();
int pm25 = utils::getInvalidPMS(); int pm25 = utils::getInvalidPmValue();
int pm10 = utils::getInvalidPMS(); int pm10 = utils::getInvalidPmValue();
int pm03PCount = utils::getInvalidPMS(); int pm03PCount = utils::getInvalidPmValue();
int atmpCompensated = utils::getInvalidTemperature(); int atmpCompensated = utils::getInvalidTemperature();
int ahumCompensated = utils::getInvalidHumidity(); int ahumCompensated = utils::getInvalidHumidity();

View File

@ -68,7 +68,6 @@ static LocalServer localServer(Serial, openMetrics, measurements, configuration,
wifiConnector); wifiConnector);
static MqttClient mqttClient(Serial); static MqttClient mqttClient(Serial);
static int pmFailCount = 0;
static int getCO2FailCount = 0; static int getCO2FailCount = 0;
static AgFirmwareMode fwMode = FW_MODE_I_33PS; static AgFirmwareMode fwMode = FW_MODE_I_33PS;
@ -566,15 +565,20 @@ static void updatePm(void) {
Serial.printf("PM2.5 ug/m3: %d\r\n", measurements.pm25_1); 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("PM10 ug/m3: %d\r\n", measurements.pm10_1);
Serial.printf("PM0.3 Count: %d\r\n", measurements.pm03PCount_1); Serial.printf("PM0.3 Count: %d\r\n", measurements.pm03PCount_1);
pmFailCount = 0; ag.pms5003.resetFailCount();
} else { } else {
pmFailCount++; ag.pms5003.updateFailCount();
Serial.printf("PMS read failed: %d\r\n", pmFailCount); Serial.printf("PMS read failed %d times\r\n", ag.pms5003.getFailCount());
if (pmFailCount >= 3) { if (ag.pms5003.getFailCount() >= PMS_FAIL_COUNT_SET_INVALID) {
measurements.pm01_1 = utils::getInvalidPMS(); measurements.pm01_1 = utils::getInvalidPmValue();
measurements.pm25_1 = utils::getInvalidPMS(); measurements.pm25_1 = utils::getInvalidPmValue();
measurements.pm10_1 = utils::getInvalidPMS(); measurements.pm10_1 = utils::getInvalidPmValue();
measurements.pm03PCount_1 = utils::getInvalidPMS(); measurements.pm03PCount_1 = utils::getInvalidPmValue();
}
if(ag.pms5003.getFailCount() >= ag.pms5003.getFailCountMax()) {
Serial.printf("PMS failure count reach to max set %d, restarting...", ag.pms5003.getFailCountMax());
ESP.restart();
} }
} }
} }

View File

@ -67,10 +67,10 @@ String OpenMetrics::getPayload(void) {
float _temp = utils::getInvalidTemperature(); float _temp = utils::getInvalidTemperature();
float _hum = utils::getInvalidHumidity(); float _hum = utils::getInvalidHumidity();
int pm01 = utils::getInvalidPMS(); int pm01 = utils::getInvalidPmValue();
int pm25 = utils::getInvalidPMS(); int pm25 = utils::getInvalidPmValue();
int pm10 = utils::getInvalidPMS(); int pm10 = utils::getInvalidPmValue();
int pm03PCount = utils::getInvalidPMS(); int pm03PCount = utils::getInvalidPmValue();
int atmpCompensated = utils::getInvalidTemperature(); int atmpCompensated = utils::getInvalidTemperature();
int ahumCompensated = utils::getInvalidHumidity(); int ahumCompensated = utils::getInvalidHumidity();

View File

@ -68,7 +68,6 @@ static LocalServer localServer(Serial, openMetrics, measurements, configuration,
wifiConnector); wifiConnector);
static MqttClient mqttClient(Serial); static MqttClient mqttClient(Serial);
static int pmFailCount = 0;
static uint32_t factoryBtnPressTime = 0; static uint32_t factoryBtnPressTime = 0;
static int getCO2FailCount = 0; static int getCO2FailCount = 0;
static AgFirmwareMode fwMode = FW_MODE_I_42PS; static AgFirmwareMode fwMode = FW_MODE_I_42PS;
@ -609,15 +608,20 @@ static void updatePm(void) {
Serial.printf("PM2.5 ug/m3: %d\r\n", measurements.pm25_1); 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("PM10 ug/m3: %d\r\n", measurements.pm10_1);
Serial.printf("PM0.3 Count: %d\r\n", measurements.pm03PCount_1); Serial.printf("PM0.3 Count: %d\r\n", measurements.pm03PCount_1);
pmFailCount = 0; ag.pms5003.resetFailCount();
} else { } else {
pmFailCount++; ag.pms5003.updateFailCount();
Serial.printf("PMS read failed: %d\r\n", pmFailCount); Serial.printf("PMS read failed %d times\r\n", ag.pms5003.getFailCount());
if (pmFailCount >= 3) { if (ag.pms5003.getFailCount() >= PMS_FAIL_COUNT_SET_INVALID) {
measurements.pm01_1 = utils::getInvalidPMS(); measurements.pm01_1 = utils::getInvalidPmValue();
measurements.pm25_1 = utils::getInvalidPMS(); measurements.pm25_1 = utils::getInvalidPmValue();
measurements.pm10_1 = utils::getInvalidPMS(); measurements.pm10_1 = utils::getInvalidPmValue();
measurements.pm03PCount_1 = utils::getInvalidPMS(); measurements.pm03PCount_1 = utils::getInvalidPmValue();
}
if(ag.pms5003.getFailCount() >= ag.pms5003.getFailCountMax()) {
Serial.printf("PMS failure count reach to max set %d, restarting...", ag.pms5003.getFailCountMax());
ESP.restart();
} }
} }
} }

View File

@ -67,10 +67,10 @@ String OpenMetrics::getPayload(void) {
float _temp = utils::getInvalidTemperature(); float _temp = utils::getInvalidTemperature();
float _hum = utils::getInvalidHumidity(); float _hum = utils::getInvalidHumidity();
int pm01 = utils::getInvalidPMS(); int pm01 = utils::getInvalidPmValue();
int pm25 = utils::getInvalidPMS(); int pm25 = utils::getInvalidPmValue();
int pm10 = utils::getInvalidPMS(); int pm10 = utils::getInvalidPmValue();
int pm03PCount = utils::getInvalidPMS(); int pm03PCount = utils::getInvalidPmValue();
int atmpCompensated = utils::getInvalidTemperature(); int atmpCompensated = utils::getInvalidTemperature();
int ahumCompensated = utils::getInvalidHumidity(); int ahumCompensated = utils::getInvalidHumidity();

View File

@ -88,7 +88,6 @@ static OtaHandler otaHandler;
static LocalServer localServer(Serial, openMetrics, measurements, configuration, static LocalServer localServer(Serial, openMetrics, measurements, configuration,
wifiConnector); wifiConnector);
static int pmFailCount = 0;
static uint32_t factoryBtnPressTime = 0; static uint32_t factoryBtnPressTime = 0;
static int getCO2FailCount = 0; static int getCO2FailCount = 0;
static AgFirmwareMode fwMode = FW_MODE_I_9PSL; static AgFirmwareMode fwMode = FW_MODE_I_9PSL;
@ -1006,6 +1005,7 @@ static void updateTvoc(void) {
} }
static void updatePm(void) { static void updatePm(void) {
bool restart = false;
if (ag->isOne()) { if (ag->isOne()) {
if (ag->pms5003.isFailed() == false) { if (ag->pms5003.isFailed() == false) {
measurements.pm01_1 = ag->pms5003.getPm01Ae(); measurements.pm01_1 = ag->pms5003.getPm01Ae();
@ -1018,15 +1018,19 @@ static void updatePm(void) {
Serial.printf("PM2.5 ug/m3: %d\r\n", measurements.pm25_1); 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("PM10 ug/m3: %d\r\n", measurements.pm10_1);
Serial.printf("PM0.3 Count: %d\r\n", measurements.pm03PCount_1); Serial.printf("PM0.3 Count: %d\r\n", measurements.pm03PCount_1);
pmFailCount = 0; ag->pms5003.resetFailCount();
} else { } else {
pmFailCount++; ag->pms5003.updateFailCount();
Serial.printf("PMS read failed: %d\r\n", pmFailCount); Serial.printf("PMS read faile %d times\r\n", ag->pms5003.getFailCount());
if (pmFailCount >= 3) { if (ag->pms5003.getFailCount() >= PMS_FAIL_COUNT_SET_INVALID) {
measurements.pm01_1 = utils::getInvalidPMS(); measurements.pm01_1 = utils::getInvalidPmValue();
measurements.pm25_1 = utils::getInvalidPMS(); measurements.pm25_1 = utils::getInvalidPmValue();
measurements.pm10_1 = utils::getInvalidPMS(); measurements.pm10_1 = utils::getInvalidPmValue();
measurements.pm03PCount_1 = utils::getInvalidPMS(); measurements.pm03PCount_1 = utils::getInvalidPmValue();
}
if (ag->pms5003.getFailCount() >= ag->pms5003.getFailCountMax()) {
restart = true;
} }
} }
} else { } else {
@ -1053,13 +1057,26 @@ static void updatePm(void) {
ag->pms5003t_1.temperatureCompensated(measurements.temp_1)); ag->pms5003t_1.temperatureCompensated(measurements.temp_1));
Serial.printf("[1] Relative Humidity compensated: %f\r\n", Serial.printf("[1] Relative Humidity compensated: %f\r\n",
ag->pms5003t_1.humidityCompensated(measurements.hum_1)); ag->pms5003t_1.humidityCompensated(measurements.hum_1));
ag->pms5003t_1.resetFailCount();
} else { } else {
measurements.pm01_1 = utils::getInvalidPMS(); if (configuration.hasSensorPMS1) {
measurements.pm25_1 = utils::getInvalidPMS(); ag->pms5003t_1.updateFailCount();
measurements.pm10_1 = utils::getInvalidPMS(); Serial.printf("[1] PMS read failed %d times\r\n", ag->pms5003t_1.getFailCount());
measurements.pm03PCount_1 = utils::getInvalidPMS();
measurements.temp_1 = utils::getInvalidTemperature(); if (ag->pms5003t_1.getFailCount() >= PMS_FAIL_COUNT_SET_INVALID) {
measurements.hum_1 = utils::getInvalidHumidity(); 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()) {
restart = true;
}
}
} }
if (configuration.hasSensorPMS2 && (ag->pms5003t_2.isFailed() == false)) { 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] Temperature in C: %0.2f\r\n", measurements.temp_2);
Serial.printf("[2] Relative Humidity: %d\r\n", measurements.hum_2); Serial.printf("[2] Relative Humidity: %d\r\n", measurements.hum_2);
Serial.printf("[2] Temperature compensated in C: %0.2f\r\n", 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", 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 { } else {
measurements.pm01_2 = utils::getInvalidPMS(); if (configuration.hasSensorPMS2) {
measurements.pm25_2 = utils::getInvalidPMS(); ag->pms5003t_2.updateFailCount();
measurements.pm10_2 = utils::getInvalidPMS(); Serial.printf("[2] PMS read failed %d times\r\n", ag->pms5003t_2.getFailCount());
measurements.pm03PCount_2 = utils::getInvalidPMS();
measurements.temp_2 = utils::getInvalidTemperature(); if (ag->pms5003t_2.getFailCount() >= PMS_FAIL_COUNT_SET_INVALID) {
measurements.hum_2 = utils::getInvalidHumidity(); 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()) {
restart = true;
}
}
} }
if (configuration.hasSensorPMS1 && configuration.hasSensorPMS2 && if (configuration.hasSensorPMS1 && configuration.hasSensorPMS2 &&
@ -1189,6 +1219,11 @@ static void updatePm(void) {
ag->sgp41.setCompensationTemperatureHumidity(temp, hum); ag->sgp41.setCompensationTemperatureHumidity(temp, hum);
} }
} }
if (restart) {
Serial.printf("PMS failure count reach to max set %d, restarting...", ag->pms5003.getFailCountMax());
ESP.restart();
}
} }
static void sendDataToServer(void) { static void sendDataToServer(void) {

View File

@ -67,10 +67,10 @@ String OpenMetrics::getPayload(void) {
float _temp = utils::getInvalidTemperature(); float _temp = utils::getInvalidTemperature();
float _hum = utils::getInvalidHumidity(); float _hum = utils::getInvalidHumidity();
int pm01 = utils::getInvalidPMS(); int pm01 = utils::getInvalidPmValue();
int pm25 = utils::getInvalidPMS(); int pm25 = utils::getInvalidPmValue();
int pm10 = utils::getInvalidPMS(); int pm10 = utils::getInvalidPmValue();
int pm03PCount = utils::getInvalidPMS(); int pm03PCount = utils::getInvalidPmValue();
int atmpCompensated = utils::getInvalidTemperature(); int atmpCompensated = utils::getInvalidTemperature();
int ahumCompensated = utils::getInvalidHumidity(); int ahumCompensated = utils::getInvalidHumidity();
if (config.hasSensorPMS1 && config.hasSensorPMS2) { if (config.hasSensorPMS1 && config.hasSensorPMS2) {

View File

@ -4,6 +4,39 @@
#include "Main/utils.h" #include "Main/utils.h"
#include "Libraries/Arduino_JSON/src/Arduino_JSON.h" #include "Libraries/Arduino_JSON/src/Arduino_JSON.h"
#define json_prop_pmFirmware "firmware"
/**
* @brief Get PMS5003 firmware version string
*
* @param fwCode
* @return String
*/
String Measurements::pms5003FirmwareVersion(int fwCode) {
return pms5003FirmwareVersionBase("PMS5003x", fwCode);
}
/**
* @brief Get PMS5003T firmware version string
*
* @param fwCode
* @return String
*/
String Measurements::pms5003TFirmwareVersion(int fwCode) {
return pms5003FirmwareVersionBase("PMS5003x", 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, String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi,
void *_ag, void *_config) { void *_ag, void *_config) {
AirGradient *ag = (AirGradient *)_ag; AirGradient *ag = (AirGradient *)_ag;
@ -33,6 +66,11 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi,
if (utils::isValidPMS03Count(this->pm03PCount_1)) { if (utils::isValidPMS03Count(this->pm03PCount_1)) {
root["pm003Count"] = this->pm03PCount_1; root["pm003Count"] = this->pm03PCount_1;
} }
if (!localServer) {
root[json_prop_pmFirmware] =
this->pms5003FirmwareVersion(ag->pms5003.getFirmwareVersion());
}
} }
if (config->hasSensorSHT) { if (config->hasSensorSHT) {
@ -134,6 +172,10 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi,
} }
} }
root["pm02Compensated"] = ag->pms5003t_1.compensate(this->pm25_1, this->temp_1); root["pm02Compensated"] = ag->pms5003t_1.compensate(this->pm25_1, this->temp_1);
if (!localServer) {
root[json_prop_pmFirmware] =
pms5003TFirmwareVersion(ag->pms5003t_1.getFirmwareVersion());
}
} }
if (config->hasSensorPMS2) { if (config->hasSensorPMS2) {
if(utils::isValidPMS(this->pm01_2)) { if(utils::isValidPMS(this->pm01_2)) {
@ -171,6 +213,10 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi,
} }
} }
root["pm02Compensated"] = ag->pms5003t_2.compensate(this->pm25_2, this->temp_2); root["pm02Compensated"] = ag->pms5003t_2.compensate(this->pm25_2, this->temp_2);
if(!localServer) {
root[json_prop_pmFirmware] =
pms5003TFirmwareVersion(ag->pms5003t_1.getFirmwareVersion());
}
} }
} else { } else {
if (fwMode == FW_MODE_O_1P) { if (fwMode == FW_MODE_O_1P) {
@ -208,6 +254,10 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi,
} }
} }
root["pm02Compensated"] = ag->pms5003t_1.compensate(this->pm25_1, this->temp_1); root["pm02Compensated"] = ag->pms5003t_1.compensate(this->pm25_1, this->temp_1);
if(!localServer) {
root[json_prop_pmFirmware] =
pms5003TFirmwareVersion(ag->pms5003t_1.getFirmwareVersion());
}
} else if (config->hasSensorPMS2) { } else if (config->hasSensorPMS2) {
if(utils::isValidPMS(this->pm01_2)) { if(utils::isValidPMS(this->pm01_2)) {
root["pm01"] = this->pm01_2; root["pm01"] = this->pm01_2;
@ -242,6 +292,10 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi,
} }
} }
root["pm02Compensated"] = ag->pms5003t_1.compensate(this->pm25_1, this->temp_1); root["pm02Compensated"] = ag->pms5003t_1.compensate(this->pm25_1, this->temp_1);
if(!localServer) {
root[json_prop_pmFirmware] =
pms5003TFirmwareVersion(ag->pms5003t_2.getFirmwareVersion());
}
} }
} else { } else {
float val; float val;
@ -279,6 +333,12 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi,
} }
} }
root["channels"]["1"]["pm02Compensated"] = ag->pms5003t_1.compensate(this->pm25_1, this->temp_1); root["channels"]["1"]["pm02Compensated"] = ag->pms5003t_1.compensate(this->pm25_1, this->temp_1);
// PMS5003T version
if(!localServer) {
root["channels"]["1"][json_prop_pmFirmware] =
pms5003TFirmwareVersion(ag->pms5003t_1.getFirmwareVersion());
}
} }
if (config->hasSensorPMS2) { if (config->hasSensorPMS2) {
float val; float val;
@ -315,6 +375,11 @@ String Measurements::toString(bool localServer, AgFirmwareMode fwMode, int rssi,
} }
} }
root["channels"]["2"]["pm02Compensated"] = ag->pms5003t_2.compensate(this->pm25_2, this->temp_2); root["channels"]["2"]["pm02Compensated"] = ag->pms5003t_2.compensate(this->pm25_2, this->temp_2);
// PMS5003T version
if(!localServer) {
root["channels"]["2"][json_prop_pmFirmware] =
pms5003TFirmwareVersion(ag->pms5003t_2.getFirmwareVersion());
}
} }
} }
} }

View File

@ -6,6 +6,9 @@
class Measurements { class Measurements {
private: private:
String pms5003FirmwareVersion(int fwCode);
String pms5003TFirmwareVersion(int fwCode);
String pms5003FirmwareVersionBase(String prefix, int fwCode);
public: public:
Measurements() { Measurements() {
pm25_1 = -1; pm25_1 = -1;

View File

@ -82,7 +82,7 @@ float utils::getInvalidHumidity(void) { return INVALID_HUMIDITY; }
int utils::getInvalidCO2(void) { return INVALID_CO2; } 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; } int utils::getInvalidNOx(void) { return INVALID_NOX; }

View File

@ -21,7 +21,7 @@ public:
static float getInvalidTemperature(void); static float getInvalidTemperature(void);
static float getInvalidHumidity(void); static float getInvalidHumidity(void);
static int getInvalidCO2(void); static int getInvalidCO2(void);
static int getInvalidPMS(void); static int getInvalidPmValue(void);
static int getInvalidNOx(void); static int getInvalidNOx(void);
static int getInvalidVOC(void); static int getInvalidVOC(void);
}; };

View File

@ -12,6 +12,7 @@ bool PMSBase::begin(Stream *stream) {
this->stream = stream; this->stream = stream;
failed = true; failed = true;
failCount = 0;
lastRead = 0; // To read buffer on handle without wait after 1.5sec lastRead = 0; // To read buffer on handle without wait after 1.5sec
this->stream->flush(); this->stream->flush();
@ -147,6 +148,27 @@ void PMSBase::handle() {
*/ */
bool PMSBase::isFailed(void) { return failed; } bool PMSBase::isFailed(void) { return failed; }
/**
* @brief Increate number of fail
*
*/
void PMSBase::updateFailCount(void) {
if (failCount < failCountMax) {
failCount++;
}
}
void PMSBase::resetFailCount(void) { failCount = 0; }
/**
* @brief Get number of fail
*
* @return int
*/
int PMSBase::getFailCount(void) { return failCount; }
int PMSBase::getFailCountMax(void) { return failCountMax; }
/** /**
* @brief Read PMS 0.1 ug/m3 with CF = 1 PM estimates * @brief Read PMS 0.1 ug/m3 with CF = 1 PM estimates
* *
@ -245,6 +267,20 @@ int16_t PMSBase::getTemp(void) { return toI16(&package[24]); }
*/ */
uint16_t PMSBase::getHum(void) { return toU16(&package[26]); } uint16_t PMSBase::getHum(void) { return toU16(&package[26]); }
/**
* @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 * @brief Convert PMS2.5 to US AQI unit
* *

View File

@ -3,11 +3,17 @@
#include <Arduino.h> #include <Arduino.h>
#define PMS_FAIL_COUNT_SET_INVALID 3
class PMSBase { class PMSBase {
public: public:
bool begin(Stream *stream); bool begin(Stream *stream);
void handle(); void handle();
bool isFailed(void); bool isFailed(void);
void updateFailCount(void);
void resetFailCount(void);
int getFailCount(void);
int getFailCountMax(void);
uint16_t getRaw0_1(void); uint16_t getRaw0_1(void);
uint16_t getRaw2_5(void); uint16_t getRaw2_5(void);
uint16_t getRaw10(void); uint16_t getRaw10(void);
@ -26,6 +32,8 @@ public:
/** For PMS5003T*/ /** For PMS5003T*/
int16_t getTemp(void); int16_t getTemp(void);
uint16_t getHum(void); uint16_t getHum(void);
uint8_t getFirmwareVersion(void);
uint8_t getErrorCode(void);
int pm25ToAQI(int pm02); int pm25ToAQI(int pm02);
int compensate(int pm25, float humidity); int compensate(int pm25, float humidity);
@ -36,6 +44,8 @@ private:
int packageIndex; int packageIndex;
bool failed = false; bool failed = false;
uint32_t lastRead; uint32_t lastRead;
const int failCountMax = 10;
int failCount = 0;
int16_t toI16(char *buf); int16_t toI16(char *buf);
uint16_t toU16(char* buf); uint16_t toU16(char* buf);

View File

@ -78,7 +78,7 @@ bool PMS5003::begin(void) {
return false; return false;
} }
#endif #endif
_ver = pms.getFirmwareVersion();
this->_isBegin = true; this->_isBegin = true;
return true; return true;
} }
@ -132,6 +132,20 @@ int PMS5003::compensate(int pm25, float humidity) {
return pms.compensate(pm25, humidity); return pms.compensate(pm25, humidity);
} }
/**
* @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 * @brief Check device initialized or not
* *
@ -175,3 +189,25 @@ void PMS5003::handle(void) { pms.handle(); }
* @return false Communication timeout or sensor has removed * @return false Communication timeout or sensor has removed
*/ */
bool PMS5003::isFailed(void) { return pms.isFailed(); } bool PMS5003::isFailed(void) { return pms.isFailed(); }
void PMS5003::updateFailCount(void) {
pms.updateFailCount();
}
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(); }

View File

@ -19,15 +19,22 @@ public:
void end(void); void end(void);
void handle(void); void handle(void);
bool isFailed(void); bool isFailed(void);
void updateFailCount(void);
void resetFailCount(void);
int getFailCount(void);
int getFailCountMax(void);
int getPm01Ae(void); int getPm01Ae(void);
int getPm25Ae(void); int getPm25Ae(void);
int getPm10Ae(void); int getPm10Ae(void);
int getPm03ParticleCount(void); int getPm03ParticleCount(void);
int convertPm25ToUsAqi(int pm25); int convertPm25ToUsAqi(int pm25);
int compensate(int pm25, float humidity); int compensate(int pm25, float humidity);
int getFirmwareVersion(void);
uint8_t getErrorCode(void);
private: private:
bool _isBegin = false; bool _isBegin = false;
int _ver;
BoardType _boardDef; BoardType _boardDef;
PMSBase pms; PMSBase pms;
const BoardDef *bsp; const BoardDef *bsp;

View File

@ -103,7 +103,7 @@ bool PMS5003T::begin(void) {
return false; return false;
} }
#endif #endif
_ver = pms.getFirmwareVersion();
this->_isBegin = true; this->_isBegin = true;
return true; return true;
} }
@ -175,6 +175,20 @@ int PMS5003T::compensate(int pm25, float humidity) {
return pms.compensate(pm25, humidity); return pms.compensate(pm25, humidity);
} }
/**
* @brief Get module(s) firmware version
*
* @return int Version code
*/
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 * @brief Check device initialized or not
* *
@ -216,3 +230,24 @@ void PMS5003T::handle(void) { pms.handle(); }
*/ */
bool PMS5003T::isFailed(void) { return pms.isFailed(); } bool PMS5003T::isFailed(void) { return pms.isFailed(); }
void PMS5003T::updateFailCount(void) {
pms.updateFailCount();
}
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(); }

View File

@ -22,6 +22,10 @@ public:
void handle(void); void handle(void);
bool isFailed(void); bool isFailed(void);
void updateFailCount(void);
void resetFailCount(void);
int getFailCount(void);
int getFailCountMax(void);
int getPm01Ae(void); int getPm01Ae(void);
int getPm25Ae(void); int getPm25Ae(void);
int getPm10Ae(void); int getPm10Ae(void);
@ -30,10 +34,13 @@ public:
float getTemperature(void); float getTemperature(void);
float getRelativeHumidity(void); float getRelativeHumidity(void);
int compensate(int pm25, float humidity); int compensate(int pm25, float humidity);
int getFirmwareVersion(void);
uint8_t getErrorCode(void);
private: private:
bool _isBegin = false; bool _isBegin = false;
bool _isSleep = false; bool _isSleep = false;
int _ver; /** Firmware version code */
BoardType _boardDef; BoardType _boardDef;
const BoardDef *bsp; const BoardDef *bsp;