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