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

Dependents:   scd30_HelloWorld scd30_HelloWorld

Committer:
loopsva
Date:
Thu Sep 13 17:38:26 2018 +0000
Revision:
1:24bb922e179c
Parent:
0:2a16832400d0
Changed the way the data structure is handled

Who changed what in which revision?

UserRevisionLine numberNew contents of line
loopsva 0:2a16832400d0 1 #ifndef SCD30_H
loopsva 0:2a16832400d0 2 #define SCD30_H
loopsva 0:2a16832400d0 3
loopsva 0:2a16832400d0 4 #define SCD30_I2C_ADDR 0xc2
loopsva 0:2a16832400d0 5
loopsva 0:2a16832400d0 6 #define SCD30_CMMD_STRT_CONT_MEAS 0x0010
loopsva 0:2a16832400d0 7 #define SCD30_CMMD_STOP_CONT_MEAS 0x0104
loopsva 0:2a16832400d0 8 #define SCD30_CMMD_SET_MEAS_INTVL 0x4600
loopsva 0:2a16832400d0 9 #define SCD30_CMMD_GET_READY_STAT 0x0202
loopsva 0:2a16832400d0 10 #define SCD30_CMMD_READ_MEAS 0x0300
loopsva 0:2a16832400d0 11 #define SCD30_CMMD_D_A_SELF_CALIB 0x5306
loopsva 0:2a16832400d0 12 #define SCD30_CMMD_FORCE_CALIB_VAL 0x5204
loopsva 0:2a16832400d0 13 #define SCD30_CMMD_SET_TEMP_OFFS 0x5403
loopsva 0:2a16832400d0 14 #define SCD30_CMMD_SET_ALT_COMP 0x5102
loopsva 0:2a16832400d0 15 #define SCD30_CMMD_SOFT_RESET 0xd304
loopsva 0:2a16832400d0 16
loopsva 0:2a16832400d0 17 #define SCD30_CMMD_READ_SERIALNBR 0xD033
loopsva 0:2a16832400d0 18 #define SCD30_CMMD_READ_ARTICLECODE 0xD025
loopsva 0:2a16832400d0 19 #define SCD30_CMMD_START_SINGLE_MEAS 0x0006
loopsva 0:2a16832400d0 20
loopsva 0:2a16832400d0 21 #define SCD30_POLYNOMIAL 0x131 // P(x) = x^8 + x^5 + x^4 + 1 = 100110001
loopsva 0:2a16832400d0 22 #define SCD30_CRC_INIT 0xff
loopsva 0:2a16832400d0 23
loopsva 0:2a16832400d0 24 #define SCD30_SN_SIZE 33 //size of the s/n ascii string + CRC values
loopsva 0:2a16832400d0 25
loopsva 0:2a16832400d0 26 /** Create SCD30 controller class
loopsva 0:2a16832400d0 27 *
loopsva 0:2a16832400d0 28 * @param scd30 class
loopsva 0:2a16832400d0 29 *
loopsva 0:2a16832400d0 30 */
loopsva 0:2a16832400d0 31 class scd30 {
loopsva 0:2a16832400d0 32
loopsva 0:2a16832400d0 33 public:
loopsva 0:2a16832400d0 34 enum SCDerror {
loopsva 0:2a16832400d0 35 SCDnoERROR, //all ok
loopsva 0:2a16832400d0 36 SCDisReady, //ready ststus register
loopsva 0:2a16832400d0 37 SCDnoAckERROR, //no I2C ACK error
loopsva 0:2a16832400d0 38 SCDtimeoutERROR, //I2C timeout error
loopsva 0:2a16832400d0 39 SCDcrcERROR, //CRC error, any
loopsva 0:2a16832400d0 40 SCDcrcERRORv1, //CRC error on value 1
loopsva 0:2a16832400d0 41 SCDcrcERRORv2, //CRC error on value 2
loopsva 0:2a16832400d0 42 SCDcrcERRORv3, //CRC error on value 3
loopsva 0:2a16832400d0 43 SCDcrcERRORv4, //CRC error on value 4
loopsva 0:2a16832400d0 44 SCDcrcERRORv5, //CRC error on value 5
loopsva 0:2a16832400d0 45 SCDcrcERRORv6, //CRC error on value 6
loopsva 0:2a16832400d0 46 };
loopsva 0:2a16832400d0 47
loopsva 0:2a16832400d0 48 /**
loopsva 0:2a16832400d0 49 * Structure to access SCD30's raw and finished data
loopsva 0:2a16832400d0 50 *
loopsva 0:2a16832400d0 51 */
loopsva 1:24bb922e179c 52 struct scdSTRuct {
loopsva 0:2a16832400d0 53 uint16_t co2m; /**< High order 16 bit word of CO2 */
loopsva 0:2a16832400d0 54 uint16_t co2l; /**< Low order 16 bit word of CO2 */
loopsva 0:2a16832400d0 55 uint16_t tempm; /**< High order 16 bit word of Temp */
loopsva 0:2a16832400d0 56 uint16_t templ; /**< Low order 16 bit word of Temp */
loopsva 0:2a16832400d0 57 uint16_t humm; /**< High order 16 bit word of Hum */
loopsva 0:2a16832400d0 58 uint16_t huml; /**< Low order 16 bit word of Hum */
loopsva 0:2a16832400d0 59
loopsva 0:2a16832400d0 60 uint16_t ready; /**< 1 = ready, 0 = busy */
loopsva 0:2a16832400d0 61
loopsva 0:2a16832400d0 62 uint32_t co2i; /**< 32 bit int of CO2 */
loopsva 0:2a16832400d0 63 uint32_t tempi; /**< 32 bit int of Temp */
loopsva 0:2a16832400d0 64 uint32_t humi; /**< 32 bit int of Hum */
loopsva 0:2a16832400d0 65
loopsva 0:2a16832400d0 66 float co2f; /**< float of CO2 concentration */
loopsva 0:2a16832400d0 67 float tempf; /**< float of Temp */
loopsva 0:2a16832400d0 68 float humf; /**< float of Hum */
loopsva 0:2a16832400d0 69
loopsva 0:2a16832400d0 70 uint16_t acode; /**< Article code number?? */
loopsva 0:2a16832400d0 71 uint8_t sn[24]; /**< ASCII Serial Number */
loopsva 1:24bb922e179c 72 } scdSTR;
loopsva 0:2a16832400d0 73
loopsva 0:2a16832400d0 74
loopsva 0:2a16832400d0 75 /** Create a SCD30 object using the specified I2C object
loopsva 0:2a16832400d0 76 * @param sda - mbed I2C interface pin
loopsva 0:2a16832400d0 77 * @param scl - mbed I2C interface pin
loopsva 0:2a16832400d0 78 * @param I2C Frequency (in Hz)
loopsva 0:2a16832400d0 79 *
loopsva 0:2a16832400d0 80 * @return none
loopsva 0:2a16832400d0 81 */
loopsva 0:2a16832400d0 82 scd30(PinName sda, PinName scl, int i2cFrequency);
loopsva 0:2a16832400d0 83
loopsva 0:2a16832400d0 84 /** Destructor
loopsva 0:2a16832400d0 85 *
loopsva 0:2a16832400d0 86 * @param --none--
loopsva 0:2a16832400d0 87 *
loopsva 0:2a16832400d0 88 * @return none
loopsva 0:2a16832400d0 89 */
loopsva 0:2a16832400d0 90 ~scd30();
loopsva 0:2a16832400d0 91
loopsva 0:2a16832400d0 92 /** Start Auto-Measurement
loopsva 0:2a16832400d0 93 *
loopsva 0:2a16832400d0 94 * @param Barometer reading (in mB) or 0x0000
loopsva 0:2a16832400d0 95 *
loopsva 0:2a16832400d0 96 * @return enum SCDerror
loopsva 0:2a16832400d0 97 */
loopsva 0:2a16832400d0 98 uint8_t startMeasurement(uint16_t baro);
loopsva 0:2a16832400d0 99
loopsva 0:2a16832400d0 100 /** Stop Auto-Measurement
loopsva 0:2a16832400d0 101 *
loopsva 0:2a16832400d0 102 * @param --none--
loopsva 0:2a16832400d0 103 *
loopsva 0:2a16832400d0 104 * @return enum SCDerror
loopsva 0:2a16832400d0 105 */
loopsva 0:2a16832400d0 106 uint8_t stopMeasurement();
loopsva 0:2a16832400d0 107
loopsva 0:2a16832400d0 108 /** Set Measurement Interval
loopsva 0:2a16832400d0 109 *
loopsva 0:2a16832400d0 110 * @param Time between measurements (in seconds)
loopsva 0:2a16832400d0 111 *
loopsva 0:2a16832400d0 112 * @return enum SCDerror
loopsva 0:2a16832400d0 113 */
loopsva 0:2a16832400d0 114 uint8_t setMeasInterval(uint16_t mi);
loopsva 0:2a16832400d0 115
loopsva 0:2a16832400d0 116 /** Get Ready Status register
loopsva 0:2a16832400d0 117 *
loopsva 1:24bb922e179c 118 * @param --none--
loopsva 1:24bb922e179c 119 * @see Ready Status result in scdSTR structure
loopsva 0:2a16832400d0 120 *
loopsva 0:2a16832400d0 121 * @return enum SCDerror
loopsva 0:2a16832400d0 122 */
loopsva 1:24bb922e179c 123 uint8_t getReadyStatus();
loopsva 0:2a16832400d0 124
loopsva 0:2a16832400d0 125 /** Get all environmental parameters (CO2, Temp and Hum)
loopsva 0:2a16832400d0 126 *
loopsva 1:24bb922e179c 127 * @param --none-
loopsva 1:24bb922e179c 128 * @see Results in scdSTR structure
loopsva 0:2a16832400d0 129 *
loopsva 0:2a16832400d0 130 * @return enum SCDerror
loopsva 0:2a16832400d0 131 */
loopsva 1:24bb922e179c 132 uint8_t readMeasurement();
loopsva 0:2a16832400d0 133
loopsva 0:2a16832400d0 134 /** Set Temperature offset
loopsva 0:2a16832400d0 135 *
loopsva 0:2a16832400d0 136 * @param Temperature offset (value in 0.01 degrees C)
loopsva 0:2a16832400d0 137 *
loopsva 0:2a16832400d0 138 * @return enum SCDerror
loopsva 0:2a16832400d0 139 */
loopsva 0:2a16832400d0 140 uint8_t setTemperatureOffs(uint16_t temp);
loopsva 0:2a16832400d0 141
loopsva 0:2a16832400d0 142 /** Set Altitude Compensation
loopsva 0:2a16832400d0 143 *
loopsva 0:2a16832400d0 144 * @param Altitude (in meters)
loopsva 0:2a16832400d0 145 *
loopsva 0:2a16832400d0 146 * @return enum SCDerror
loopsva 0:2a16832400d0 147 */
loopsva 0:2a16832400d0 148 uint8_t setAltitudeComp(uint16_t alt);
loopsva 0:2a16832400d0 149
loopsva 0:2a16832400d0 150 /** Perform a soft reset
loopsva 0:2a16832400d0 151 *
loopsva 0:2a16832400d0 152 * @param --none--
loopsva 0:2a16832400d0 153 *
loopsva 0:2a16832400d0 154 * @return enum SCDerror
loopsva 0:2a16832400d0 155 */
loopsva 0:2a16832400d0 156 uint8_t softReset();
loopsva 0:2a16832400d0 157
loopsva 0:2a16832400d0 158 /** Calculate the SCD30 CRC value
loopsva 0:2a16832400d0 159 *
loopsva 0:2a16832400d0 160 * @param 16 bit value to perform a CRC check on
loopsva 0:2a16832400d0 161 *
loopsva 0:2a16832400d0 162 * @return 8 bit CRC value
loopsva 0:2a16832400d0 163 */
loopsva 0:2a16832400d0 164 uint8_t calcCrc2b(uint16_t seed);
loopsva 0:2a16832400d0 165
loopsva 0:2a16832400d0 166 /** Compare received CRC value with calculated CRC value
loopsva 0:2a16832400d0 167 *
loopsva 0:2a16832400d0 168 * @param 16 bit value to perform a CRC check on
loopsva 0:2a16832400d0 169 * @param 8 bit value to compare CRC values
loopsva 0:2a16832400d0 170 *
loopsva 0:2a16832400d0 171 * @return enum SCDerror
loopsva 0:2a16832400d0 172 */
loopsva 0:2a16832400d0 173 uint8_t checkCrc2b(uint16_t seed, uint8_t crcIn);
loopsva 0:2a16832400d0 174
loopsva 0:2a16832400d0 175 /** Start a Single-Measurement
loopsva 0:2a16832400d0 176 *
loopsva 0:2a16832400d0 177 * @param Barometer reading (in mB) or 0x0000
loopsva 0:2a16832400d0 178 *
loopsva 0:2a16832400d0 179 * @return enum SCDerror
loopsva 0:2a16832400d0 180 */
loopsva 0:2a16832400d0 181 uint8_t startOneMeasurement(uint16_t baro);
loopsva 0:2a16832400d0 182
loopsva 0:2a16832400d0 183 /** Get Article Code
loopsva 0:2a16832400d0 184 *
loopsva 1:24bb922e179c 185 * @param --none--
loopsva 0:2a16832400d0 186 *
loopsva 0:2a16832400d0 187 *
loopsva 0:2a16832400d0 188 * @return enum SCDerror
loopsva 0:2a16832400d0 189 */
loopsva 1:24bb922e179c 190 uint8_t getArticleCode();
loopsva 0:2a16832400d0 191
loopsva 0:2a16832400d0 192 /** Get Serial Number
loopsva 0:2a16832400d0 193 *
loopsva 1:24bb922e179c 194 * @param --none--
loopsva 1:24bb922e179c 195 * @see ASCII Serial Number in scdSTR structure
loopsva 0:2a16832400d0 196 *
loopsva 0:2a16832400d0 197 * @return enum SCDerror
loopsva 0:2a16832400d0 198 */
loopsva 1:24bb922e179c 199 uint8_t getSerialNumber();
loopsva 0:2a16832400d0 200
loopsva 0:2a16832400d0 201 private:
loopsva 0:2a16832400d0 202 char i2cBuff[34];
loopsva 0:2a16832400d0 203
loopsva 0:2a16832400d0 204 protected:
loopsva 0:2a16832400d0 205 I2C _i2c;
loopsva 0:2a16832400d0 206
loopsva 0:2a16832400d0 207 };
loopsva 0:2a16832400d0 208 #endif
loopsva 0:2a16832400d0 209