Fix: PMS5003T only return positive temperature value

This commit is contained in:
Phat Nguyen
2024-08-15 09:10:48 +07:00
parent 1a347e9cfe
commit 5edb21cfe9
2 changed files with 32 additions and 21 deletions

View File

@ -86,7 +86,7 @@ void PMSBase::handle() {
case 2: { case 2: {
buf[bufIndex++] = value; buf[bufIndex++] = value;
if (bufIndex >= 4) { if (bufIndex >= 4) {
len = toValue(&buf[2]); len = toI16(&buf[2]);
if (len != 28) { if (len != 28) {
// Serial.printf("Got good bad len %d\r\n", len); // Serial.printf("Got good bad len %d\r\n", len);
len += 4; len += 4;
@ -152,98 +152,98 @@ bool PMSBase::isFailed(void) { return failed; }
* *
* @return uint16_t * @return uint16_t
*/ */
uint16_t PMSBase::getRaw0_1(void) { return toValue(&package[4]); } uint16_t PMSBase::getRaw0_1(void) { return toU16(&package[4]); }
/** /**
* @brief Read PMS 2.5 ug/m3 with CF = 1 PM estimates * @brief Read PMS 2.5 ug/m3 with CF = 1 PM estimates
* *
* @return uint16_t * @return uint16_t
*/ */
uint16_t PMSBase::getRaw2_5(void) { return toValue(&package[6]); } uint16_t PMSBase::getRaw2_5(void) { return toU16(&package[6]); }
/** /**
* @brief Read PMS 10 ug/m3 with CF = 1 PM estimates * @brief Read PMS 10 ug/m3 with CF = 1 PM estimates
* *
* @return uint16_t * @return uint16_t
*/ */
uint16_t PMSBase::getRaw10(void) { return toValue(&package[8]); } uint16_t PMSBase::getRaw10(void) { return toU16(&package[8]); }
/** /**
* @brief Read PMS 0.1 ug/m3 * @brief Read PMS 0.1 ug/m3
* *
* @return uint16_t * @return uint16_t
*/ */
uint16_t PMSBase::getPM0_1(void) { return toValue(&package[10]); } uint16_t PMSBase::getPM0_1(void) { return toU16(&package[10]); }
/** /**
* @brief Read PMS 2.5 ug/m3 * @brief Read PMS 2.5 ug/m3
* *
* @return uint16_t * @return uint16_t
*/ */
uint16_t PMSBase::getPM2_5(void) { return toValue(&package[12]); } uint16_t PMSBase::getPM2_5(void) { return toU16(&package[12]); }
/** /**
* @brief Read PMS 10 ug/m3 * @brief Read PMS 10 ug/m3
* *
* @return uint16_t * @return uint16_t
*/ */
uint16_t PMSBase::getPM10(void) { return toValue(&package[14]); } uint16_t PMSBase::getPM10(void) { return toU16(&package[14]); }
/** /**
* @brief Get numnber concentrations over 0.3 um/0.1L * @brief Get numnber concentrations over 0.3 um/0.1L
* *
* @return uint16_t * @return uint16_t
*/ */
uint16_t PMSBase::getCount0_3(void) { return toValue(&package[16]); } uint16_t PMSBase::getCount0_3(void) { return toU16(&package[16]); }
/** /**
* @brief Get numnber concentrations over 0.5 um/0.1L * @brief Get numnber concentrations over 0.5 um/0.1L
* *
* @return uint16_t * @return uint16_t
*/ */
uint16_t PMSBase::getCount0_5(void) { return toValue(&package[18]); } uint16_t PMSBase::getCount0_5(void) { return toU16(&package[18]); }
/** /**
* @brief Get numnber concentrations over 1.0 um/0.1L * @brief Get numnber concentrations over 1.0 um/0.1L
* *
* @return uint16_t * @return uint16_t
*/ */
uint16_t PMSBase::getCount1_0(void) { return toValue(&package[20]); } uint16_t PMSBase::getCount1_0(void) { return toU16(&package[20]); }
/** /**
* @brief Get numnber concentrations over 2.5 um/0.1L * @brief Get numnber concentrations over 2.5 um/0.1L
* *
* @return uint16_t * @return uint16_t
*/ */
uint16_t PMSBase::getCount2_5(void) { return toValue(&package[22]); } uint16_t PMSBase::getCount2_5(void) { return toU16(&package[22]); }
/** /**
* @brief Get numnber concentrations over 5.0 um/0.1L (only PMS5003) * @brief Get numnber concentrations over 5.0 um/0.1L (only PMS5003)
* *
* @return uint16_t * @return uint16_t
*/ */
uint16_t PMSBase::getCount5_0(void) { return toValue(&package[24]); } uint16_t PMSBase::getCount5_0(void) { return toU16(&package[24]); }
/** /**
* @brief Get numnber concentrations over 10.0 um/0.1L (only PMS5003) * @brief Get numnber concentrations over 10.0 um/0.1L (only PMS5003)
* *
* @return uint16_t * @return uint16_t
*/ */
uint16_t PMSBase::getCount10(void) { return toValue(&package[26]); } uint16_t PMSBase::getCount10(void) { return toU16(&package[26]); }
/** /**
* @brief Get temperature (only PMS5003T) * @brief Get temperature (only PMS5003T)
* *
* @return uint16_t * @return uint16_t
*/ */
uint16_t PMSBase::getTemp(void) { return toValue(&package[24]); } int16_t PMSBase::getTemp(void) { return toI16(&package[24]); }
/** /**
* @brief Get humidity (only PMS5003T) * @brief Get humidity (only PMS5003T)
* *
* @return uint16_t * @return uint16_t
*/ */
uint16_t PMSBase::getHum(void) { return toValue(&package[26]); } uint16_t PMSBase::getHum(void) { return toU16(&package[26]); }
/** /**
* @brief Convert PMS2.5 to US AQI unit * @brief Convert PMS2.5 to US AQI unit
@ -274,9 +274,19 @@ int PMSBase::pm25ToAQI(int pm02) {
* @brief Convert two byte value to uint16_t value * @brief Convert two byte value to uint16_t value
* *
* @param buf bytes array (must be >= 2) * @param buf bytes array (must be >= 2)
* @return uint16_t * @return int16_t
*/ */
uint16_t PMSBase::toValue(char *buf) { return (buf[0] << 8) | buf[1]; } int16_t PMSBase::toI16(char *buf) {
int16_t value = buf[0];
value = (value << 8) | buf[1];
return value;
}
uint16_t PMSBase::toU16(char *buf) {
uint16_t value = buf[0];
value = (value << 8) | buf[1];
return value;
}
/** /**
* @brief Validate package data * @brief Validate package data
@ -290,7 +300,7 @@ bool PMSBase::validate(char *buf) {
for (int i = 0; i < 30; i++) { for (int i = 0; i < 30; i++) {
sum += buf[i]; sum += buf[i];
} }
if (sum == toValue(&buf[30])) { if (sum == toU16(&buf[30])) {
for (int i = 0; i < 32; i++) { for (int i = 0; i < 32; i++) {
package[i] = buf[i]; package[i] = buf[i];
} }

View File

@ -24,7 +24,7 @@ public:
uint16_t getCount10(void); uint16_t getCount10(void);
/** For PMS5003T*/ /** For PMS5003T*/
uint16_t getTemp(void); int16_t getTemp(void);
uint16_t getHum(void); uint16_t getHum(void);
int pm25ToAQI(int pm02); int pm25ToAQI(int pm02);
@ -36,7 +36,8 @@ private:
bool failed = false; bool failed = false;
uint32_t lastRead; uint32_t lastRead;
uint16_t toValue(char *buf); int16_t toI16(char *buf);
uint16_t toU16(char* buf);
bool validate(char *buf); bool validate(char *buf);
}; };