Restart device after PMS sensor read failed 10 times

This commit is contained in:
Phat Nguyen
2024-08-25 20:21:26 +07:00
parent 6c3259b94b
commit b049a23657
10 changed files with 186 additions and 33 deletions

View File

@ -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();
}
}
}

View File

@ -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();
}
}
}

View File

@ -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();
}
}
}

View File

@ -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) {

View File

@ -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
*

View File

@ -3,11 +3,17 @@
#include <Arduino.h>
#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);

View File

@ -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(); }

View File

@ -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);

View File

@ -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(); }

View File

@ -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);