From 183f62daf72bd76c0dfb561f647536df06c0a7a4 Mon Sep 17 00:00:00 2001 From: Achim Date: Thu, 10 Nov 2022 16:25:01 +0700 Subject: [PATCH] Adding additional parameters for Plantower PM sensors --- AirGradient.cpp | 112 ++++++++++++++++++++++++++++++++++++++++++++++++ AirGradient.h | 28 +++++++++++- 2 files changed, 139 insertions(+), 1 deletion(-) diff --git a/AirGradient.cpp b/AirGradient.cpp index 9b72e04..4c26c34 100644 --- a/AirGradient.cpp +++ b/AirGradient.cpp @@ -109,6 +109,103 @@ int AirGradient::getPM2_Raw(){ } } +int AirGradient::getPM0_3Count(){ + int count; + DATA data; + requestRead(); + if (readUntil(data)) { + count = data.PM_RAW_0_3; + return count; + } else { + return -1; + } +} + +int AirGradient::getPM10_0Count(){ + int count; + DATA data; + requestRead(); + if (readUntil(data)) { + count = data.PM_RAW_10_0; + return count; + } else { + return -1; + } +} + +int AirGradient::getPM5_0Count(){ + int count; + DATA data; + requestRead(); + if (readUntil(data)) { + count = data.PM_RAW_5_0; + return count; + } else { + return -1; + } +} + +int AirGradient::getPM2_5Count(){ + int count; + DATA data; + requestRead(); + if (readUntil(data)) { + count = data.PM_RAW_2_5; + return count; + } else { + return -1; + } +} + +int AirGradient::getPM1_0Count(){ + int count; + DATA data; + requestRead(); + if (readUntil(data)) { + count = data.PM_RAW_1_0; + return count; + } else { + return -1; + } +} + +int AirGradient::getPM0_5Count(){ + int count; + DATA data; + requestRead(); + if (readUntil(data)) { + count = data.PM_RAW_0_5; + return count; + } else { + return -1; + } +} + + +int AirGradient::getAMB_TMP(){ + int count; + DATA data; + requestRead(); + if (readUntil(data)) { + count = data.AMB_TMP; + return count; + } else { + return -1; + } +} + +int AirGradient::getAMB_HUM(){ + int count; + DATA data; + requestRead(); + if (readUntil(data)) { + count = data.AMB_HUM; + return count; + } else { + return -1; + } +} + // Private Methods ///////////////////////////////////////////////////////////// // Functions only available to other functions in this library @@ -248,6 +345,21 @@ void AirGradient::loop() _data->PM_AE_UG_1_0 = makeWord(_payload[6], _payload[7]); _data->PM_AE_UG_2_5 = makeWord(_payload[8], _payload[9]); _data->PM_AE_UG_10_0 = makeWord(_payload[10], _payload[11]); + + // Total particles count per 100ml air + _data->PM_RAW_0_3 = makeWord(_payload[12], _payload[13]); + _data->PM_RAW_0_5 = makeWord(_payload[14], _payload[15]); + _data->PM_RAW_1_0 = makeWord(_payload[16], _payload[17]); + _data->PM_RAW_2_5 = makeWord(_payload[18], _payload[19]); + _data->PM_RAW_5_0 = makeWord(_payload[20], _payload[21]); + _data->PM_RAW_10_0 = makeWord(_payload[22], _payload[23]); + + // Formaldehyde concentration (PMSxxxxST units only) + _data->AMB_HCHO = makeWord(_payload[24], _payload[25]) / 1000; + + // Temperature & humidity (PMSxxxxST units only) + _data->AMB_TMP = makeWord(_payload[26], _payload[27]) / 10; + _data->AMB_HUM = makeWord(_payload[28], _payload[29]) / 10; } _index = 0; diff --git a/AirGradient.h b/AirGradient.h index 1a2ef2b..8f00582 100644 --- a/AirGradient.h +++ b/AirGradient.h @@ -186,6 +186,21 @@ class AirGradient uint16_t PM_AE_UG_1_0; uint16_t PM_AE_UG_2_5; uint16_t PM_AE_UG_10_0; + + // Raw particles count (number of particles in 0.1l of air + uint16_t PM_RAW_0_3; + uint16_t PM_RAW_0_5; + uint16_t PM_RAW_1_0; + uint16_t PM_RAW_2_5; + uint16_t PM_RAW_5_0; + uint16_t PM_RAW_10_0; + + // Formaldehyde (HCHO) concentration in mg/m^3 - PMSxxxxST units only + uint16_t AMB_HCHO; + + // Temperature & humidity - PMSxxxxST units only + int16_t AMB_TMP; + uint16_t AMB_HUM; }; void PMS(Stream&); @@ -197,8 +212,19 @@ class AirGradient void requestRead(); bool read_PMS(DATA& data); bool readUntil(DATA& data, uint16_t timeout = SINGLE_RESPONSE_TIME); + + const char* getPM2(); int getPM2_Raw(); + int getPM0_3Count(); + int getPM0_5Count(); + int getPM1_0Count(); + int getPM2_5Count(); + int getPM5_0Count(); + int getPM10_0Count(); + + int getAMB_TMP(); + int getAMB_HUM(); //PMS VARIABLES PUBLIC_END @@ -252,7 +278,7 @@ class AirGradient enum STATUS { STATUS_WAITING, STATUS_OK }; enum MODE { MODE_ACTIVE, MODE_PASSIVE }; - uint8_t _payload[12]; + uint8_t _payload[30]; Stream* _stream; DATA* _data; STATUS _PMSstatus;