From 6b65efd3d60bbfbac3adb0bcb73d826877f4437d Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Mon, 26 Aug 2024 20:43:48 +0700 Subject: [PATCH 1/3] 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 2/3] 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 aafaa42a6869f9e0700f8032746fc4ec793c8de7 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Sun, 1 Sep 2024 19:56:11 +0700 Subject: [PATCH 3/3] 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 (%)