mirror of
https://github.com/airgradienthq/arduino.git
synced 2025-07-17 18:52:07 +02:00
Add PM2.5 correction formula, #182
This commit is contained in:
@ -270,6 +270,41 @@ int PMSBase::pm25ToAQI(int pm02) {
|
||||
return 500;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Correction PM2.5
|
||||
*
|
||||
* @param pm25 Raw PM2.5 value
|
||||
* @param humidity Humidity value (%)
|
||||
* @return float
|
||||
*/
|
||||
int PMSBase::pm25Compensated(int pm25, float humidity) {
|
||||
float value;
|
||||
if (humidity < 0) {
|
||||
humidity = 0;
|
||||
}
|
||||
if (humidity > 100) {
|
||||
humidity = 100;
|
||||
}
|
||||
|
||||
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(value < 0) {
|
||||
value = 0;
|
||||
}
|
||||
|
||||
return (int)value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Convert two byte value to uint16_t value
|
||||
*
|
||||
|
@ -28,6 +28,7 @@ public:
|
||||
uint16_t getHum(void);
|
||||
|
||||
int pm25ToAQI(int pm02);
|
||||
int pm25Compensated(int pm25, float humidity);
|
||||
|
||||
private:
|
||||
Stream *stream;
|
||||
|
@ -118,6 +118,17 @@ int PMS5003::getPm03ParticleCount(void) { return pms.getCount0_3(); }
|
||||
*/
|
||||
int PMS5003::convertPm25ToUsAqi(int pm25) { return pms.pm25ToAQI(pm25); }
|
||||
|
||||
/**
|
||||
* @brief Correct PM2.5
|
||||
*
|
||||
* @param pm25 PM2.5 raw value
|
||||
* @param humidity Humidity value
|
||||
* @return float
|
||||
*/
|
||||
int PMS5003::pm25Compensated(int pm25, float humidity) {
|
||||
return pms.pm25Compensated(pm25, humidity);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Check device initialized or not
|
||||
*
|
||||
|
@ -24,6 +24,7 @@ public:
|
||||
int getPm10Ae(void);
|
||||
int getPm03ParticleCount(void);
|
||||
int convertPm25ToUsAqi(int pm25);
|
||||
int pm25Compensated(int pm25, float humidity);
|
||||
|
||||
private:
|
||||
bool _isBegin = false;
|
||||
|
@ -161,6 +161,17 @@ float PMS5003T::getRelativeHumidity(void) {
|
||||
return pms.getHum()/10.0f;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Correct PM2.5
|
||||
*
|
||||
* @param pm25 PM2.5 raw value
|
||||
* @param humidity Humidity value
|
||||
* @return float
|
||||
*/
|
||||
float PMS5003T::pm25Compensated(int pm25, float humidity) {
|
||||
return pms.pm25Compensated(pm25, humidity);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Check device initialized or not
|
||||
*
|
||||
|
@ -29,6 +29,7 @@ public:
|
||||
int convertPm25ToUsAqi(int pm25);
|
||||
float getTemperature(void);
|
||||
float getRelativeHumidity(void);
|
||||
float pm25Compensated(int pm25, float humidity);
|
||||
|
||||
private:
|
||||
bool _isBegin = false;
|
||||
|
Reference in New Issue
Block a user