Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
sps30.h
- Committer:
- ziqiyap
- Date:
- 2019-03-27
- Revision:
- 9:a5fe43e183e2
- Parent:
- 8:f6b216228067
- Child:
- 10:228c926a2416
File content as of revision 9:a5fe43e183e2:
/*******************************************************************************
* Copyright (c) 2018-2019, Sensors and IoT Capability Centre (SIOT) at GovTech.
*
* Contributor(s):
* Yap Zi Qi yap_zi_qi@tech.gov.sg
*******************************************************************************/
#include "src/SensorDriver/sensor_driver.h"
#ifndef SPS30_H
#define SPS30_H
#define SPS30_I2C_ADDR 0xd2 // left shifted by 1 bit from 0x69
#define SPS30_CMMD_STRT_MEAS 0x0010
#define SPS30_CMMD_STOP_MEAS 0x0104
#define SPS30_CMMD_GET_READY_STAT 0x0202
#define SPS30_CMMD_READ_MEAS 0x0300
#define SPS30_CMMD_AUTO_CLEAN_INTV 0x8004
#define SPS30_CMMD_START_FAN_CLEAN 0x5607
#define SPS30_CMMD_SOFT_RESET 0xD304
#define SPS30_CMMD_READ_SERIALNBR 0xD033
#define SPS30_CMMD_READ_ARTICLECODE 0xD025
#define SPS30_STRT_MEAS_WRITE_DATA 0x0300
#define SPS30_POLYNOMIAL 0x31 // P(x) = x^8 + x^5 + x^4 + 1 = 100110p01
#define SPS30_CRC_INIT 0xff
#define SPS30_SN_SIZE 33 // size of the s/n ascii string + CRC values
#define MASS_MAX 1000.00f
#define MASS_MIN 0.00f
#define NUM_MAX 3000.00f
#define NUM_MIN 0.00f
#define I2C_FREQUENCY_STD 100000 // SPS30 uses 100MHz for I2C communication
/** Create SPS30 controller class
* @brief inherits SensorDriver members and methods essential for Sensor Thread
*
* @param sps30 class
*
*/
class Sps30: public SensorDriver {
public:
uint16_t sps_ready; /**< 1 = ready, 0 = busy */
uint32_t clean_interval_i; /** 32 unsigned bit in seconds */
/** Create a SPS30 object using the specified I2C object
* @param sda - mbed I2C interface pin
* @param scl - mbed I2C interface pin
* @param I2C Frequency (in Hz)
*
* @return none
*/
Sps30(PinName sda, PinName scl, int i2c_frequency);
/** Destructor
*
* @param --none--
*
* @return none
*/
~Sps30();
/** Initialise SPS30
*
* @param --none--
*
* @return enum SPSStatus
*/
void InitSensor();
/** Poll SPS30 Data
*
* @param --none--
*
* @return enum SPSStatus
*/
int PollSensor();
private:
enum SPSError {
SPSNOERROR, //all ok
SPSISREADY, //ready status register
SPSNOACKERROR, //no I2C ACK error
SPSCRCERROR, //CRC error, any
};
char i2cbuff[60];
uint8_t sn[33]; /**< ASCII Serial Number */
std::vector<float> sensor_float_data; /** Vector of sensor float data **/
std::vector<std::string> sensor_data_name; /** Private list of sensor data types **/
uint16_t clean_interval_m; /**< High order 16 bit word of Auto Clean Interval */
uint16_t clean_interval_l; /**< High order 16 bit word of Auto Clean Interval */
uint16_t mass_1p0_m; /**< High order 16 bit word of Mass Conc of PM1.0 */
uint16_t mass_1p0_l; /**< Low order 16 bit word of Mass Conc of PM1.0 */
uint16_t mass_2p5_m; /**< High order 16 bit word of Mass Conc of PM2.5 */
uint16_t mass_2p5_l; /**< Low order 16 bit word of Mass Conc of PM2.5 */
uint16_t mass_4p0_m; /**< High order 16 bit word of Mass Conc of PM4.0 */
uint16_t mass_4p0_l; /**< Low order 16 bit word of Mass Conc of PM4.0 */
uint16_t mass_10p0_m; /**< High order 16 bit word of Mass Conc of PM10 */
uint16_t mass_10p0_l; /**< Low order 16 bit word of Mass Conc of PM10 */
uint16_t num_0p5_m; /**< High order 16 bit word of Number Conc of PM0.5 */
uint16_t num_0p5_l; /**< Low order 16 bit word of Number Conc of PM0.5 */
uint16_t num_1p0_m; /**< High order 16 bit word of Number Conc of PM1.0 */
uint16_t num_1p0_l; /**< Low order 16 bit word of Number Conc of PM1.0 */
uint16_t num_2p5_m; /**< High order 16 bit word of Number Conc of PM2.5 */
uint16_t num_2p5_l; /**< Low order 16 bit word of Number Conc of PM2.5 */
uint16_t num_4p0_m; /**< High order 16 bit word of Number Conc of PM4.0 */
uint16_t num_4p0_l; /**< Low order 16 bit word of Number Conc of PM4.0 */
uint16_t num_10p0_m; /**< High order 16 bit word of Number Conc of PM10 */
uint16_t num_10p0_l; /**< Low order 16 bit word of Number Conc of PM10 */
uint16_t typ_pm_size_m; /**< High order 16 bit word of Typical Particle Size */
uint16_t typ_pm_size_l; /**< Low order 16 bit word of Typical Particle Size */
uint32_t mass_1p0_i; /**< 32 bit int of Mass Conc of PM1.0 */
uint32_t mass_2p5_i; /**< 32 bit int of Mass Conc of PM2.5 */
uint32_t mass_4p0_i; /**< 32 bit int of Mass Conc of PM4.0 */
uint32_t mass_10p0_i; /**< 32 bit int of Mass Conc of PM10 */
uint32_t num_0p5_i; /**< 32 bit int of Number Conc of PM0.5 */
uint32_t num_1p0_i; /**< 32 bit int of Number Conc of PM1.0 */
uint32_t num_2p5_i; /**< 32 bit int of Number Conc of PM2.5 */
uint32_t num_4p0_i; /**< 32 bit int of Number Conc of PM4.0 */
uint32_t num_10p0_i; /**< 32 bit int of Number Conc of PM10 */
uint32_t typ_pm_size_i; /**< 32 bit int of Typical Particle Size */
float mass_1p0_f; /**< float of Mass Conc of PM1.0 */
float mass_2p5_f; /**< float of Mass Conc of PM2.5 */
float mass_4p0_f; /**< float of Mass Conc of PM4.0 */
float mass_10p0_f; /**< float of Mass Conc of PM10 */
float num_0p5_f; /**< float of Number Conc of PM0.5 */
float num_1p0_f; /**< float of Number Conc of PM1.0 */
float num_2p5_f; /**< float of Number Conc of PM2.5 */
float num_4p0_f; /**< float of Number Conc of PM4.0 */
float num_10p0_f; /**< float of Number Conc of PM10 */
float typ_pm_size_f; /**< float of Typical Particle Size */
/** Start Auto-Measurement
*
* @param --none--
*
* @return enum SPSerror
*/
uint8_t StartMeasurement();
/** Stop Auto-Measurement
*
* @param --none--
*
* @return enum SPSerror
*/
uint8_t StopMeasurement();
/** Get Serial Number
*
* @param --none--
* @see ASCII Serial Number as sn[33]
*
* @return enum SPSerror
*/
int GetSerialNumber();
/** Get Ready Status register
*
* @param --none--
* @see Ready Status result
*
* @return enum SPSerror
*/
uint8_t GetReadyStatus();
/** Get all particulate matter parameters
*
* @param --none-
* @see Results in Public member variables
*
* @return enum SPSerror
*/
uint8_t ReadMeasurement();
/** Calculate the SPS30 CRC value
*
* @param 16 bit value to perform a CRC check on
*
* @return 8 bit CRC value
*/
uint8_t CalcCrc2b(uint16_t seed);
/** Compare received CRC value with calculated CRC value
*
* @param 16 bit value to perform a CRC check on
* @param 8 bit value to compare CRC values
*
* @return enum SPSerror
*/
uint8_t CheckCrc2b(uint16_t seed, uint8_t crc_in);
/** Read Auto Cleaning Interval on the SPS30
*
* @param --none--
*
* @return enum SPSerror
*/
uint8_t ReadAutoCleanInterval();
/** Set Auto Cleaning Interval on the SPS30
*
* @param Auto Cleaning Interval in seconds
* default is 604800s = 1 week, 0 to disable auto clean
*
* @return enum SPSerror
*/
uint8_t SetAutoCleanInterval(uint32_t set_interval = 604800);
/** Perform manual Fan Cleaning
*
* @param --none--
*
* @return enum SPSerror
*/
uint8_t StartFanClean();
/** Perform a soft reset
*
* @param --none--
*
* @return enum SPSerror
*/
uint8_t SoftReset();
/** Create a Sensor Data Array to be read from Sensor Thread
*
* @param --none--
* @see sensor_data vector pair in SensorDriver
*
* @return none
*/
void GetDataArray();
protected:
I2C _i2c;
};
#endif