Driver for Sensirion SCD30, CO2 sensor module using I2C. The device also senses Temperature and Humidity.

Dependents:   scd30_HelloWorld scd30_HelloWorld

scd30.h

Committer:
loopsva
Date:
2018-09-13
Revision:
1:24bb922e179c
Parent:
0:2a16832400d0

File content as of revision 1:24bb922e179c:

#ifndef SCD30_H
#define SCD30_H

#define SCD30_I2C_ADDR                  0xc2

#define SCD30_CMMD_STRT_CONT_MEAS       0x0010
#define SCD30_CMMD_STOP_CONT_MEAS       0x0104
#define SCD30_CMMD_SET_MEAS_INTVL       0x4600
#define SCD30_CMMD_GET_READY_STAT       0x0202
#define SCD30_CMMD_READ_MEAS            0x0300
#define SCD30_CMMD_D_A_SELF_CALIB       0x5306
#define SCD30_CMMD_FORCE_CALIB_VAL      0x5204
#define SCD30_CMMD_SET_TEMP_OFFS        0x5403
#define SCD30_CMMD_SET_ALT_COMP         0x5102
#define SCD30_CMMD_SOFT_RESET           0xd304

#define SCD30_CMMD_READ_SERIALNBR       0xD033
#define SCD30_CMMD_READ_ARTICLECODE     0xD025
#define SCD30_CMMD_START_SINGLE_MEAS    0x0006
    
#define SCD30_POLYNOMIAL                0x131   // P(x) = x^8 + x^5 + x^4 + 1 = 100110001
#define SCD30_CRC_INIT                  0xff

#define SCD30_SN_SIZE                   33      //size of the s/n ascii string + CRC values

    /** Create SCD30 controller class
     *
     * @param scd30 class
     *
     */
class scd30 {

public:
    enum SCDerror {
        SCDnoERROR,         //all ok
        SCDisReady,         //ready ststus register
        SCDnoAckERROR,      //no I2C ACK error
        SCDtimeoutERROR,    //I2C timeout error
        SCDcrcERROR,        //CRC error, any
        SCDcrcERRORv1,      //CRC error on value 1
        SCDcrcERRORv2,      //CRC error on value 2
        SCDcrcERRORv3,      //CRC error on value 3
        SCDcrcERRORv4,      //CRC error on value 4
        SCDcrcERRORv5,      //CRC error on value 5
        SCDcrcERRORv6,      //CRC error on value 6
    };
    
    /**
     * Structure to access SCD30's raw and finished data
     *
     */    
    struct scdSTRuct {
        uint16_t co2m;          /**< High order 16 bit word of CO2 */
        uint16_t co2l;          /**< Low  order 16 bit word of CO2 */
        uint16_t tempm;         /**< High order 16 bit word of Temp */
        uint16_t templ;         /**< Low order 16 bit word of Temp */
        uint16_t humm;          /**< High order 16 bit word of Hum */
        uint16_t huml;          /**< Low order 16 bit word of Hum */
        
        uint16_t ready;         /**< 1 = ready, 0 = busy */
        
        uint32_t co2i;          /**< 32 bit int of CO2 */
        uint32_t tempi;         /**< 32 bit int of Temp */
        uint32_t humi;          /**< 32 bit int of Hum */
        
        float co2f;             /**< float of CO2 concentration */
        float tempf;            /**< float of Temp */
        float humf;             /**< float of Hum */
        
        uint16_t acode;         /**< Article code number?? */
        uint8_t sn[24];         /**< ASCII Serial Number */
    } scdSTR;
    
    
    /** Create a SCD30 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
     */
     scd30(PinName sda, PinName scl, int i2cFrequency);
     
    /** Destructor
     *
     * @param --none--
     *
     * @return none
     */
    ~scd30();
    
    /** Start Auto-Measurement 
     *
     * @param Barometer reading (in mB) or 0x0000
     *
     * @return enum SCDerror
     */
    uint8_t startMeasurement(uint16_t baro);
    
    /** Stop Auto-Measurement 
     *
     * @param --none--
     *
     * @return enum SCDerror
     */
    uint8_t stopMeasurement();
    
    /** Set Measurement Interval 
     *
     * @param Time between measurements (in seconds)
     *
     * @return enum SCDerror
     */
    uint8_t setMeasInterval(uint16_t mi);
    
    /** Get Ready Status register 
     *
     * @param --none--
     * @see Ready Status result in scdSTR structure
     *
     * @return enum SCDerror
     */
    uint8_t getReadyStatus();
    
    /** Get all environmental parameters (CO2, Temp and Hum) 
     *
     * @param --none-
     * @see Results in scdSTR structure
     *
     * @return enum SCDerror
     */
    uint8_t readMeasurement();
    
    /** Set Temperature offset
     *
     * @param Temperature offset (value in 0.01 degrees C)
     *
     * @return enum SCDerror
     */
    uint8_t setTemperatureOffs(uint16_t temp);
    
    /** Set Altitude Compensation
     *
     * @param Altitude (in meters)
     *
     * @return enum SCDerror
     */
    uint8_t setAltitudeComp(uint16_t alt);
    
    /** Perform a soft reset
     *
     * @param --none--
     *
     * @return enum SCDerror
     */
    uint8_t softReset();
    
    /** Calculate the SCD30 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 SCDerror
     */
    uint8_t checkCrc2b(uint16_t seed, uint8_t crcIn);
    
    /** Start a Single-Measurement 
     *
     * @param Barometer reading (in mB) or 0x0000
     *
     * @return enum SCDerror
     */
    uint8_t startOneMeasurement(uint16_t baro);
    
    /** Get Article Code
     *
     * @param --none--
     * 
     *
     * @return enum SCDerror
     */
    uint8_t getArticleCode();
    
    /** Get Serial Number
     *
     * @param --none--
     * @see ASCII Serial Number in scdSTR structure
     *
     * @return enum SCDerror
     */
    uint8_t getSerialNumber();
 
private:
    char i2cBuff[34];
 
protected:
    I2C     _i2c;    

};    
#endif