forked from airgradienthq/arduino
251 lines
5.0 KiB
C++
251 lines
5.0 KiB
C++
#include "PMS5003.h"
|
|
#include "Arduino.h"
|
|
#include "../Main/utils.h"
|
|
|
|
#if defined(ESP8266)
|
|
/**
|
|
* @brief Init sensor
|
|
*
|
|
* @param _debugStream Serial use for print debug log
|
|
* @return true Success
|
|
* @return false Failure
|
|
*/
|
|
bool PMS5003::begin(Stream *_debugStream) {
|
|
this->_debugStream = _debugStream;
|
|
return this->begin();
|
|
}
|
|
#else
|
|
|
|
/**
|
|
* @brief Init Sensor
|
|
*
|
|
* @param serial Serial communication with sensor
|
|
* @return true Success
|
|
* @return false Failure
|
|
*/
|
|
bool PMS5003::begin(HardwareSerial &serial) {
|
|
this->_serial = &serial;
|
|
return this->begin();
|
|
}
|
|
#endif
|
|
|
|
/**
|
|
* @brief Construct a new PMS5003::PMS5003 object
|
|
*
|
|
* @param def Board type @ref BoardType
|
|
*/
|
|
PMS5003::PMS5003(BoardType def) : _boardDef(def) {}
|
|
|
|
/**
|
|
* Initializes the sensor.
|
|
*/
|
|
bool PMS5003::begin(void) {
|
|
if (this->_isBegin) {
|
|
AgLog("Already initialized, call end() then try again");
|
|
return true;
|
|
}
|
|
|
|
#if defined(ESP32)
|
|
#endif
|
|
this->bsp = getBoardDef(this->_boardDef);
|
|
if (bsp == NULL) {
|
|
AgLog("Board [%d] not supported", this->_boardDef);
|
|
return false;
|
|
}
|
|
|
|
if (bsp->Pms5003.supported == false) {
|
|
AgLog("Board [%d] PMS50035003 not supported", this->_boardDef);
|
|
return false;
|
|
}
|
|
|
|
#if defined(ESP8266)
|
|
this->_serial =
|
|
new SoftwareSerial(bsp->Pms5003.uart_tx_pin, bsp->Pms5003.uart_rx_pin);
|
|
this->_serial->begin(9600);
|
|
if (pms.begin(this->_serial) == false) {
|
|
AgLog("PMS failed");
|
|
return false;
|
|
}
|
|
#else
|
|
this->_serial->begin(9600);
|
|
if (pms.begin(this->_serial) == false) {
|
|
AgLog("PMS failed");
|
|
return false;
|
|
}
|
|
#endif
|
|
_ver = pms.getFirmwareVersion();
|
|
this->_isBegin = true;
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* @brief Read PM1.0
|
|
*
|
|
* @return int PM1.0 index (atmospheric environment)
|
|
*/
|
|
int PMS5003::getPm01Ae(void) { return pms.getPM0_1(); }
|
|
|
|
/**
|
|
* @brief Read PM2.5
|
|
*
|
|
* @return int PM2.5 index (atmospheric environment)
|
|
*/
|
|
int PMS5003::getPm25Ae(void) { return pms.getPM2_5(); }
|
|
|
|
/**
|
|
* @brief Read PM10.0
|
|
*
|
|
* @return int PM10.0 index (atmospheric environment)
|
|
*/
|
|
int PMS5003::getPm10Ae(void) { return pms.getPM10(); }
|
|
|
|
/**
|
|
* @brief Read PM1.0
|
|
*
|
|
* @return int PM1.0 index (standard particle)
|
|
*/
|
|
int PMS5003::getPm01Sp(void) { return pms.getRaw0_1(); }
|
|
|
|
/**
|
|
* @brief Read PM2.5
|
|
*
|
|
* @return int PM2.5 index (standard particle)
|
|
*/
|
|
int PMS5003::getPm25Sp(void) { return pms.getRaw2_5(); }
|
|
|
|
/**
|
|
* @brief Read PM10
|
|
*
|
|
* @return int PM10 index (standard particle)
|
|
*/
|
|
int PMS5003::getPm10Sp(void) { return pms.getRaw10(); }
|
|
|
|
/**
|
|
* @brief Read particle 0.3 count
|
|
*
|
|
* @return int PM0.3 index
|
|
*/
|
|
int PMS5003::getPm03ParticleCount(void) {
|
|
return pms.getCount0_3();
|
|
}
|
|
|
|
/**
|
|
* @brief Read particle 1.0 count
|
|
*
|
|
* @return int particle 1.0 count index
|
|
*/
|
|
int PMS5003::getPm01ParticleCount(void) { return pms.getCount1_0(); }
|
|
|
|
/**
|
|
* @brief Read particle 2.5 count
|
|
*
|
|
* @return int particle 2.5 count index
|
|
*/
|
|
int PMS5003::getPm25ParticleCount(void) { return pms.getCount2_5(); }
|
|
|
|
/**
|
|
* @brief Read particle 10 count
|
|
*
|
|
* @return int particle 10 count index
|
|
*/
|
|
int PMS5003::getPm10ParticleCount(void) { return pms.getCount10(); }
|
|
|
|
/**
|
|
* @brief Convert PM2.5 to US AQI
|
|
*
|
|
* @param pm25 PM2.5 index
|
|
* @return int PM2.5 US AQI
|
|
*/
|
|
int PMS5003::convertPm25ToUsAqi(int pm25) { return pms.pm25ToAQI(pm25); }
|
|
|
|
/**
|
|
* @brief Correct PM2.5
|
|
*
|
|
* Reference formula: https://www.airgradient.com/documentation/correction-algorithms/
|
|
*
|
|
* @param pm25 PM2.5 raw value
|
|
* @param humidity Humidity value
|
|
* @return compensated value in float
|
|
*/
|
|
float PMS5003::compensate(float pm25, float humidity) { return pms.compensate(pm25, humidity); }
|
|
|
|
/**
|
|
* @brief Get sensor firmware version
|
|
*
|
|
* @return int
|
|
*/
|
|
int PMS5003::getFirmwareVersion(void) { return _ver; }
|
|
|
|
/**
|
|
* @brief Get sensor error code
|
|
*
|
|
* @return uint8_t
|
|
*/
|
|
uint8_t PMS5003::getErrorCode(void) { return pms.getErrorCode(); }
|
|
|
|
/**
|
|
* @brief Is sensor connect with device
|
|
*
|
|
* @return true Connected
|
|
* @return false Removed
|
|
*/
|
|
bool PMS5003::connected(void) { return pms.connected(); }
|
|
|
|
/**
|
|
* @brief Check device initialized or not
|
|
*
|
|
* @return true Initialized
|
|
* @return false No-initialized
|
|
*/
|
|
bool PMS5003::isBegin(void) {
|
|
if (this->_isBegin == false) {
|
|
AgLog("Not-initialized");
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* @brief De-initialize sensor
|
|
*/
|
|
void PMS5003::end(void) {
|
|
if (_isBegin == false) {
|
|
return;
|
|
}
|
|
_isBegin = false;
|
|
#if defined(ESP8266)
|
|
_debugStream = NULL;
|
|
#else
|
|
delete _serial;
|
|
#endif
|
|
AgLog("De-initialize");
|
|
}
|
|
|
|
/**
|
|
* @brief Check and read PMS sensor data. This method should be callack from
|
|
* loop process to continoue check sensor data if it's available
|
|
*/
|
|
void PMS5003::handle(void) { pms.readPackage(this->_serial); }
|
|
|
|
void PMS5003::updateFailCount(void) {
|
|
pms.updateFailCount();
|
|
}
|
|
|
|
void PMS5003::resetFailCount(void) {
|
|
pms.resetFailCount();
|
|
}
|
|
|
|
/**
|
|
* @brief Get number of fail count
|
|
*
|
|
* @return int
|
|
*/
|
|
int PMS5003::getFailCount(void) { return pms.getFailCount(); }
|
|
|
|
/**
|
|
* @brief Get number of fail count max
|
|
*
|
|
* @return int
|
|
*/
|
|
int PMS5003::getFailCountMax(void) { return pms.getFailCountMax(); }
|