From eeba41f497feafd244a8a4920e8262a6a556beb7 Mon Sep 17 00:00:00 2001 From: samuelbles07 Date: Tue, 22 Oct 2024 17:13:15 +0700 Subject: [PATCH] Include other PMS data to measurements --- examples/OneOpenAir/OneOpenAir.ino | 65 ++++++++++++++++++++++---- src/AgValue.cpp | 74 ++++++++++++++++++++++++++++-- src/AgValue.h | 26 ++++++++--- 3 files changed, 144 insertions(+), 21 deletions(-) diff --git a/examples/OneOpenAir/OneOpenAir.ino b/examples/OneOpenAir/OneOpenAir.ino index b202929..8627583 100644 --- a/examples/OneOpenAir/OneOpenAir.ino +++ b/examples/OneOpenAir/OneOpenAir.ino @@ -1001,12 +1001,24 @@ static void updatePMS5003() { measurements.update(Measurements::PM01, ag->pms5003.getPm01Ae()); measurements.update(Measurements::PM25, ag->pms5003.getPm25Ae()); measurements.update(Measurements::PM10, ag->pms5003.getPm10Ae()); + measurements.update(Measurements::PM01_SP, ag->pms5003.getPm01Sp()); + measurements.update(Measurements::PM25_SP, ag->pms5003.getPm25Sp()); + measurements.update(Measurements::PM10_SP, ag->pms5003.getPm10Sp()); measurements.update(Measurements::PM03_PC, ag->pms5003.getPm03ParticleCount()); + measurements.update(Measurements::PM01_PC, ag->pms5003.getPm01ParticleCount()); + measurements.update(Measurements::PM25_PC, ag->pms5003.getPm25ParticleCount()); + measurements.update(Measurements::PM10_PC, ag->pms5003.getPm10ParticleCount()); } else { measurements.update(Measurements::PM01, utils::getInvalidPmValue()); measurements.update(Measurements::PM25, utils::getInvalidPmValue()); measurements.update(Measurements::PM10, utils::getInvalidPmValue()); + measurements.update(Measurements::PM01_SP, utils::getInvalidPmValue()); + measurements.update(Measurements::PM25_SP, utils::getInvalidPmValue()); + measurements.update(Measurements::PM10_SP, utils::getInvalidPmValue()); measurements.update(Measurements::PM03_PC, utils::getInvalidPmValue()); + measurements.update(Measurements::PM01_PC, utils::getInvalidPmValue()); + measurements.update(Measurements::PM25_PC, utils::getInvalidPmValue()); + measurements.update(Measurements::PM10_PC, utils::getInvalidPmValue()); } } @@ -1027,18 +1039,28 @@ static void updatePm(void) { measurements.update(Measurements::PM01, ag->pms5003t_1.getPm01Ae(), channel); measurements.update(Measurements::PM25, ag->pms5003t_1.getPm25Ae(), channel); measurements.update(Measurements::PM10, ag->pms5003t_1.getPm10Ae(), channel); + measurements.update(Measurements::PM01_SP, ag->pms5003t_1.getPm01Sp(), channel); + measurements.update(Measurements::PM25_SP, ag->pms5003t_1.getPm25Sp(), channel); + measurements.update(Measurements::PM10_SP, ag->pms5003t_1.getPm10Sp(), channel); measurements.update(Measurements::PM03_PC, ag->pms5003t_1.getPm03ParticleCount(), channel); + measurements.update(Measurements::PM01_PC, ag->pms5003t_1.getPm01ParticleCount(), channel); + measurements.update(Measurements::PM25_PC, ag->pms5003t_1.getPm25ParticleCount(), channel); measurements.update(Measurements::Temperature, ag->pms5003t_1.getTemperature(), channel); measurements.update(Measurements::Humidity, ag->pms5003t_1.getRelativeHumidity(), channel); // flag that new valid PMS value exists - newPMS2Value = true; + newPMS1Value = true; } else { // PMS channel 1 now is not connected, update using invalid value measurements.update(Measurements::PM01, utils::getInvalidPmValue(), channel); measurements.update(Measurements::PM25, utils::getInvalidPmValue(), channel); measurements.update(Measurements::PM10, utils::getInvalidPmValue(), channel); + measurements.update(Measurements::PM01_SP, utils::getInvalidPmValue(), channel); + measurements.update(Measurements::PM25_SP, utils::getInvalidPmValue(), channel); + measurements.update(Measurements::PM10_SP, utils::getInvalidPmValue(), channel); measurements.update(Measurements::PM03_PC, utils::getInvalidPmValue(), channel); + measurements.update(Measurements::PM01_PC, utils::getInvalidPmValue(), channel); + measurements.update(Measurements::PM25_PC, utils::getInvalidPmValue(), channel); measurements.update(Measurements::Temperature, utils::getInvalidTemperature(), channel); measurements.update(Measurements::Humidity, utils::getInvalidHumidity(), channel); } @@ -1051,18 +1073,28 @@ static void updatePm(void) { measurements.update(Measurements::PM01, ag->pms5003t_2.getPm01Ae(), channel); measurements.update(Measurements::PM25, ag->pms5003t_2.getPm25Ae(), channel); measurements.update(Measurements::PM10, ag->pms5003t_2.getPm10Ae(), channel); + measurements.update(Measurements::PM01_SP, ag->pms5003t_2.getPm01Sp(), channel); + measurements.update(Measurements::PM25_SP, ag->pms5003t_2.getPm25Sp(), channel); + measurements.update(Measurements::PM10_SP, ag->pms5003t_2.getPm10Sp(), channel); measurements.update(Measurements::PM03_PC, ag->pms5003t_2.getPm03ParticleCount(), channel); + measurements.update(Measurements::PM01_PC, ag->pms5003t_2.getPm01ParticleCount(), channel); + measurements.update(Measurements::PM25_PC, ag->pms5003t_2.getPm25ParticleCount(), channel); measurements.update(Measurements::Temperature, ag->pms5003t_2.getTemperature(), channel); measurements.update(Measurements::Humidity, ag->pms5003t_2.getRelativeHumidity(), channel); // flag that new valid PMS value exists newPMS2Value = true; } else { - // PMS channel channel now is not connected, update using invalid value + // PMS channel 2 now is not connected, update using invalid value measurements.update(Measurements::PM01, utils::getInvalidPmValue(), channel); measurements.update(Measurements::PM25, utils::getInvalidPmValue(), channel); measurements.update(Measurements::PM10, utils::getInvalidPmValue(), channel); + measurements.update(Measurements::PM01_SP, utils::getInvalidPmValue(), channel); + measurements.update(Measurements::PM25_SP, utils::getInvalidPmValue(), channel); + measurements.update(Measurements::PM10_SP, utils::getInvalidPmValue(), channel); measurements.update(Measurements::PM03_PC, utils::getInvalidPmValue(), channel); + measurements.update(Measurements::PM01_PC, utils::getInvalidPmValue(), channel); + measurements.update(Measurements::PM25_PC, utils::getInvalidPmValue(), channel); measurements.update(Measurements::Temperature, utils::getInvalidTemperature(), channel); measurements.update(Measurements::Humidity, utils::getInvalidHumidity(), channel); } @@ -1133,18 +1165,31 @@ static void tempHumUpdate(void) { /* Set max period for each measurement type based on sensor update interval*/ void setMeasurementMaxPeriod() { + int max; + /// Max period for S8 sensors measurements measurements.maxPeriod(Measurements::CO2, calculateMaxPeriod(SENSOR_CO2_UPDATE_INTERVAL)); + /// Max period for SGP sensors measurements - measurements.maxPeriod(Measurements::TVOC, calculateMaxPeriod(SENSOR_TVOC_UPDATE_INTERVAL)); - measurements.maxPeriod(Measurements::TVOCRaw, calculateMaxPeriod(SENSOR_TVOC_UPDATE_INTERVAL)); - measurements.maxPeriod(Measurements::NOx, calculateMaxPeriod(SENSOR_TVOC_UPDATE_INTERVAL)); - measurements.maxPeriod(Measurements::NOxRaw, calculateMaxPeriod(SENSOR_TVOC_UPDATE_INTERVAL)); + max = calculateMaxPeriod(SENSOR_TVOC_UPDATE_INTERVAL); + measurements.maxPeriod(Measurements::TVOC, max); + measurements.maxPeriod(Measurements::TVOCRaw, max); + measurements.maxPeriod(Measurements::NOx, max); + measurements.maxPeriod(Measurements::NOxRaw, max); + /// Max period for PMS sensors measurements - measurements.maxPeriod(Measurements::PM25, calculateMaxPeriod(SENSOR_PM_UPDATE_INTERVAL)); - measurements.maxPeriod(Measurements::PM01, calculateMaxPeriod(SENSOR_PM_UPDATE_INTERVAL)); - measurements.maxPeriod(Measurements::PM10, calculateMaxPeriod(SENSOR_PM_UPDATE_INTERVAL)); - measurements.maxPeriod(Measurements::PM03_PC, calculateMaxPeriod(SENSOR_PM_UPDATE_INTERVAL)); + max = calculateMaxPeriod(SENSOR_PM_UPDATE_INTERVAL); + measurements.maxPeriod(Measurements::PM25, max); + measurements.maxPeriod(Measurements::PM01, max); + measurements.maxPeriod(Measurements::PM10, max); + measurements.maxPeriod(Measurements::PM25_SP, max); + measurements.maxPeriod(Measurements::PM01_SP, max); + measurements.maxPeriod(Measurements::PM10_SP, max); + measurements.maxPeriod(Measurements::PM03_PC, max); + measurements.maxPeriod(Measurements::PM01_PC, max); + measurements.maxPeriod(Measurements::PM25_PC, max); + measurements.maxPeriod(Measurements::PM10_PC, max); + // Temperature and Humidity if (configuration.hasSensorSHT) { /// Max period for SHT sensors measurements diff --git a/src/AgValue.cpp b/src/AgValue.cpp index 7965b68..748303d 100644 --- a/src/AgValue.cpp +++ b/src/AgValue.cpp @@ -41,10 +41,34 @@ void Measurements::maxPeriod(MeasurementType type, int max) { _pm_10[0].update.max = max; _pm_10[1].update.max = max; break; + case PM01_SP: + _pm_01_sp[0].update.max = max; + _pm_01_sp[1].update.max = max; + break; + case PM25_SP: + _pm_25_sp[0].update.max = max; + _pm_25_sp[1].update.max = max; + break; + case PM10_SP: + _pm_10_sp[0].update.max = max; + _pm_10_sp[1].update.max = max; + break; case PM03_PC: _pm_03_pc[0].update.max = max; _pm_03_pc[1].update.max = max; break; + case PM01_PC: + _pm_01_pc[0].update.max = max; + _pm_01_pc[1].update.max = max; + break; + case PM25_PC: + _pm_25_pc[0].update.max = max; + _pm_25_pc[1].update.max = max; + break; + case PM10_PC: + _pm_10_pc[0].update.max = max; + _pm_10_pc[1].update.max = max; + break; }; } @@ -91,10 +115,34 @@ bool Measurements::update(MeasurementType type, int val, int ch) { temporary = &_pm_10[ch]; invalidValue = utils::getInvalidPmValue(); break; + case PM01_SP: + temporary = &_pm_01_sp[ch]; + invalidValue = utils::getInvalidPmValue(); + break; + case PM25_SP: + temporary = &_pm_25_sp[ch]; + invalidValue = utils::getInvalidPmValue(); + break; + case PM10_SP: + temporary = &_pm_10_sp[ch]; + invalidValue = utils::getInvalidPmValue(); + break; case PM03_PC: temporary = &_pm_03_pc[ch]; invalidValue = utils::getInvalidPmValue(); break; + case PM01_PC: + temporary = &_pm_01_pc[ch]; + invalidValue = utils::getInvalidPmValue(); + break; + case PM25_PC: + temporary = &_pm_25_pc[ch]; + invalidValue = utils::getInvalidPmValue(); + break; + case PM10_PC: + temporary = &_pm_10_pc[ch]; + invalidValue = utils::getInvalidPmValue(); + break; default: break; }; @@ -344,16 +392,34 @@ String Measurements::measurementTypeStr(MeasurementType type) { str = "NOxRaw"; break; case PM25: - str = "PM25"; + str = "PM25_AE"; break; case PM01: - str = "PM01"; + str = "PM1_AE"; break; case PM10: - str = "PM10"; + str = "PM10_AE"; + break; + case PM25_SP: + str = "PM25_SP"; + break; + case PM01_SP: + str = "PM1_SP"; + break; + case PM10_SP: + str = "PM10_SP"; break; case PM03_PC: - str = "PM03"; + str = "PM003_PC"; + break; + case PM01_PC: + str = "PM01_PC"; + break; + case PM25_PC: + str = "PM25_PC"; + break; + case PM10_PC: + str = "PM10_PC"; break; default: break; diff --git a/src/AgValue.h b/src/AgValue.h index 8c26bf2..cb723a0 100644 --- a/src/AgValue.h +++ b/src/AgValue.h @@ -46,10 +46,16 @@ public: TVOCRaw, NOx, // index value NOxRaw, - PM25, - PM01, - PM10, - PM03_PC, // Particle count + PM01, // PM1.0 under atmospheric environment + PM25, // PM2.5 under athompheric environment + PM10, // PM10 under atmospheric environment + PM01_SP, // PM1.0 standard particle + PM25_SP, // PM2.5 standard particle + PM10_SP, // PM10 standard particle + PM03_PC, // Particle 0.3 count + PM01_PC, // Particle 1.0 count + PM25_PC, // Particle 2.5 count + PM10_PC, // Particle 10 count }; /** @@ -129,10 +135,16 @@ private: IntegerValue _tvoc_raw; IntegerValue _nox; // Index value IntegerValue _nox_raw; - IntegerValue _pm_25[2]; - IntegerValue _pm_01[2]; - IntegerValue _pm_10[2]; + IntegerValue _pm_01[2]; // pm 1.0 atmospheric environment + IntegerValue _pm_25[2]; // pm 2.5 atmospheric environment + IntegerValue _pm_10[2]; // pm 10 atmospheric environment + IntegerValue _pm_01_sp[2]; // pm 1.0 standard particle + IntegerValue _pm_25_sp[2]; // pm 2.5 standard particle + IntegerValue _pm_10_sp[2]; // pm 10 standard particle IntegerValue _pm_03_pc[2]; // particle count 0.3 + IntegerValue _pm_01_pc[2]; // particle count 1.0 + IntegerValue _pm_25_pc[2]; // particle count 2.5 + IntegerValue _pm_10_pc[2]; // particle count 10 bool _debug = false;