CO2, humidity, and temperature sensor

Committer:
mcm
Date:
Mon May 10 14:13:38 2021 +0000
Revision:
3:ca833b38050f
Parent:
2:0d0174b46fd3
This driver was completed and tested (NUCLEO-L053R8), it works as expected.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mcm 1:c5b8dc5cdcee 1 /**
mcm 1:c5b8dc5cdcee 2 * @brief SCD30.h
mcm 1:c5b8dc5cdcee 3 * @details CO2, humidity and temperature sensor.
mcm 1:c5b8dc5cdcee 4 * Header file.
mcm 1:c5b8dc5cdcee 5 *
mcm 1:c5b8dc5cdcee 6 *
mcm 1:c5b8dc5cdcee 7 * @return N/A
mcm 1:c5b8dc5cdcee 8 *
mcm 1:c5b8dc5cdcee 9 * @author Manuel Caballero
mcm 1:c5b8dc5cdcee 10 * @date 07/May/2021
mcm 1:c5b8dc5cdcee 11 * @version 07/May/2021 The ORIGIN
mcm 1:c5b8dc5cdcee 12 * @pre N/A
mcm 1:c5b8dc5cdcee 13 * @warning N/A
mcm 1:c5b8dc5cdcee 14 * @pre This code belongs to Nimbus Centre ( http://www.nimbus.cit.ie ).
mcm 1:c5b8dc5cdcee 15 */
mcm 1:c5b8dc5cdcee 16 #ifndef SCD30_H_
mcm 1:c5b8dc5cdcee 17 #define SCD30_H_
mcm 1:c5b8dc5cdcee 18
mcm 1:c5b8dc5cdcee 19 #include "mbed.h"
mcm 1:c5b8dc5cdcee 20
mcm 1:c5b8dc5cdcee 21
mcm 1:c5b8dc5cdcee 22 /**
mcm 1:c5b8dc5cdcee 23 Example:
mcm 1:c5b8dc5cdcee 24
mcm 1:c5b8dc5cdcee 25 @code
mcm 3:ca833b38050f 26 #include "mbed.h"
mcm 3:ca833b38050f 27 #include "SCD30.h"
mcm 1:c5b8dc5cdcee 28
mcm 3:ca833b38050f 29 SCD30 mySCD30 ( I2C_SDA, I2C_SCL, SCD30::SCD30_ADDRESS, 100000 ); // I2C_SDA | I2C_SCL
mcm 3:ca833b38050f 30 Serial pc ( USBTX, USBRX ); // tx, rx
mcm 3:ca833b38050f 31
mcm 3:ca833b38050f 32 DigitalOut myled ( LED1 );
mcm 3:ca833b38050f 33 Ticker newAction;
mcm 3:ca833b38050f 34
mcm 3:ca833b38050f 35
mcm 3:ca833b38050f 36 //@brief Constants.
mcm 3:ca833b38050f 37
mcm 3:ca833b38050f 38
mcm 3:ca833b38050f 39 //@brief Variables.
mcm 3:ca833b38050f 40 volatile uint32_t myState; // State that indicates when to perform a new sample
mcm 3:ca833b38050f 41
mcm 3:ca833b38050f 42
mcm 3:ca833b38050f 43 //@brief FUNCTION PROTOTYPES
mcm 3:ca833b38050f 44 void changeDATA ( void );
mcm 3:ca833b38050f 45
mcm 3:ca833b38050f 46
mcm 3:ca833b38050f 47 //@brief FUNCTION FOR APPLICATION MAIN ENTRY.
mcm 3:ca833b38050f 48 int main()
mcm 3:ca833b38050f 49 {
mcm 3:ca833b38050f 50 SCD30::SCD30_status_t aux;
mcm 3:ca833b38050f 51 SCD30::SCD30_data_t mySCD30_Data;
mcm 3:ca833b38050f 52
mcm 3:ca833b38050f 53 pc.baud ( 115200 );
mcm 3:ca833b38050f 54
mcm 3:ca833b38050f 55 myled = 1;
mcm 3:ca833b38050f 56 wait(3);
mcm 3:ca833b38050f 57 myled = 0;
mcm 3:ca833b38050f 58
mcm 3:ca833b38050f 59 // It performs a software reset
mcm 3:ca833b38050f 60 aux = mySCD30.SCD30_SoftReset ();
mcm 3:ca833b38050f 61 wait_ms (2000);
mcm 3:ca833b38050f 62
mcm 3:ca833b38050f 63 // It gets the firmware version
mcm 3:ca833b38050f 64 aux = mySCD30.SCD30_GetFirmwareVersion ( &mySCD30_Data.firmware );
mcm 3:ca833b38050f 65 pc.printf ( "Version Major: %d, Version Minor: %d\r\n", mySCD30_Data.firmware.version_major, mySCD30_Data.firmware.version_minor );
mcm 3:ca833b38050f 66
mcm 3:ca833b38050f 67 // It sets two mesurement interval
mcm 3:ca833b38050f 68 mySCD30_Data.measurement_interval = 2U;
mcm 3:ca833b38050f 69 aux = mySCD30.SCD30_SetMeasurementInterval ( mySCD30_Data.measurement_interval );
mcm 3:ca833b38050f 70
mcm 3:ca833b38050f 71 // It configures the continuous automatic self-calibration
mcm 3:ca833b38050f 72 mySCD30_Data.asc = SCD30::CONTINUOUS_AUTOMATIC_SELF_CALIBRATION_ASC_ACTIVATE;
mcm 3:ca833b38050f 73 aux = mySCD30.SCD30_SetContinuousASC ( mySCD30_Data.asc );
mcm 3:ca833b38050f 74 wait_ms(2000);
mcm 3:ca833b38050f 75
mcm 3:ca833b38050f 76 // It sets the trigger without pressure compensation
mcm 3:ca833b38050f 77 mySCD30_Data.pressure_compensation = 0U;
mcm 3:ca833b38050f 78 aux = mySCD30.SCD30_TriggerContinuousMeasurement ( mySCD30_Data.pressure_compensation );
mcm 3:ca833b38050f 79
mcm 3:ca833b38050f 80 myState = 0UL; // Reset the variable
mcm 3:ca833b38050f 81 newAction.attach( &changeDATA, 5U ); // the address of the function to be attached ( changeDATA ) and the interval ( 5s )
mcm 3:ca833b38050f 82
mcm 3:ca833b38050f 83 // Let the callbacks take care of everything
mcm 3:ca833b38050f 84 while(1) {
mcm 3:ca833b38050f 85 sleep();
mcm 3:ca833b38050f 86
mcm 3:ca833b38050f 87 if ( myState == 1UL ) {
mcm 3:ca833b38050f 88 myled = 1U;
mcm 3:ca833b38050f 89
mcm 3:ca833b38050f 90 // Trigger to get a new data set
mcm 3:ca833b38050f 91 aux = mySCD30.SCD30_TriggerContinuousMeasurement ( mySCD30_Data.pressure_compensation );
mcm 3:ca833b38050f 92
mcm 3:ca833b38050f 93 // Wait for a new data value
mcm 3:ca833b38050f 94 do {
mcm 3:ca833b38050f 95 aux = mySCD30.SCD30_GetDataReadyStatus ( &mySCD30_Data.status );
mcm 3:ca833b38050f 96 wait_ms (100);
mcm 3:ca833b38050f 97 } while( mySCD30_Data.status == SCD30::GET_READY_STATUS_BIT_DATA_NO_READY );
mcm 3:ca833b38050f 98
mcm 3:ca833b38050f 99 // Get all the values
mcm 3:ca833b38050f 100 aux = mySCD30.SCD30_ReadMeasurement ( &mySCD30_Data.data );
mcm 3:ca833b38050f 101
mcm 3:ca833b38050f 102 // Send data through the UART
mcm 3:ca833b38050f 103 pc.printf ( "CO2: %d ppm, T: %d C, RH: %d %%\r\n", (uint32_t)mySCD30_Data.data.processed.co2, (uint32_t)mySCD30_Data.data.processed.temperature, (uint32_t)mySCD30_Data.data.processed.humidity );
mcm 3:ca833b38050f 104
mcm 3:ca833b38050f 105 // Reset the variables
mcm 3:ca833b38050f 106 myState = 0UL;
mcm 3:ca833b38050f 107 myled = 0U;
mcm 3:ca833b38050f 108 }
mcm 3:ca833b38050f 109 }
mcm 3:ca833b38050f 110 }
mcm 3:ca833b38050f 111
mcm 3:ca833b38050f 112
mcm 3:ca833b38050f 113 // @brief changeDATA ( void )
mcm 3:ca833b38050f 114 //
mcm 3:ca833b38050f 115 // @details It changes myState variable
mcm 3:ca833b38050f 116 //
mcm 3:ca833b38050f 117 // @param[in] N/A
mcm 3:ca833b38050f 118 //
mcm 3:ca833b38050f 119 // @param[out] N/A.
mcm 3:ca833b38050f 120 //
mcm 3:ca833b38050f 121 // @return N/A.
mcm 3:ca833b38050f 122 //
mcm 3:ca833b38050f 123 // @author Manuel Caballero
mcm 3:ca833b38050f 124 // @date 07/May/2021
mcm 3:ca833b38050f 125 // @version 07/May/2021 The ORIGIN
mcm 3:ca833b38050f 126 // @pre N/A
mcm 3:ca833b38050f 127 // @warning N/A.
mcm 3:ca833b38050f 128 void changeDATA ( void )
mcm 3:ca833b38050f 129 {
mcm 3:ca833b38050f 130 myState = 1UL;
mcm 3:ca833b38050f 131 }
mcm 1:c5b8dc5cdcee 132 @endcode
mcm 1:c5b8dc5cdcee 133 */
mcm 1:c5b8dc5cdcee 134
mcm 1:c5b8dc5cdcee 135
mcm 1:c5b8dc5cdcee 136 /*!
mcm 1:c5b8dc5cdcee 137 Library for the SCD30 CO2, humidity and temperature sensor.
mcm 1:c5b8dc5cdcee 138 */
mcm 1:c5b8dc5cdcee 139 class SCD30
mcm 1:c5b8dc5cdcee 140 {
mcm 1:c5b8dc5cdcee 141 public:
mcm 1:c5b8dc5cdcee 142 /**
mcm 1:c5b8dc5cdcee 143 * @brief DEFAULT ADDRESS
mcm 1:c5b8dc5cdcee 144 */
mcm 1:c5b8dc5cdcee 145 typedef enum {
mcm 2:0d0174b46fd3 146 SCD30_ADDRESS = ( 0x61 << 1U ) /*!< SCD30 ADDR */
mcm 1:c5b8dc5cdcee 147 } SCD30_address_t;
mcm 1:c5b8dc5cdcee 148
mcm 1:c5b8dc5cdcee 149
mcm 1:c5b8dc5cdcee 150
mcm 1:c5b8dc5cdcee 151 /**
mcm 1:c5b8dc5cdcee 152 * @brief COMMAND REGISTERS
mcm 1:c5b8dc5cdcee 153 */
mcm 1:c5b8dc5cdcee 154 typedef enum {
mcm 1:c5b8dc5cdcee 155 SCD30_TRIGGERS_CONTINUOUS_MEASUREMENT = 0x0010, /*!< Triggers continuous measurement. Ambient pressure is optional */
mcm 1:c5b8dc5cdcee 156 SCD30_STOP_CONTINUOUS_MEASUREMENT = 0x0104, /*!< Stop continuous measurement */
mcm 1:c5b8dc5cdcee 157 SCD30_SET_MEASUREMENT_INTERVAL = 0x4600, /*!< Set measurement interval for continuous measurement mode */
mcm 1:c5b8dc5cdcee 158 SCD30_GET_DATA_READY_STATUS = 0x0202, /*!< Data ready status */
mcm 1:c5b8dc5cdcee 159 SCD30_READ_MEASUREMENT = 0x0300, /*!< Reads a single measurement of C02 concentration */
mcm 1:c5b8dc5cdcee 160 SCD30_CONTINUOUS_AUTOMATIC_SELF_CALIBRATION = 0x5306, /*!< Continuous automatic self-calibration can be (de-)activated */
mcm 1:c5b8dc5cdcee 161 SCD30_SET_FORCED_RECALIBRATION = 0x5204, /*!< Forced recalibration (FRC) */
mcm 1:c5b8dc5cdcee 162 SCD30_SET_TEMPERATURE_OFFSET = 0x5403, /*!< Temperature offset */
mcm 1:c5b8dc5cdcee 163 SCD30_SET_ALTITUDE_COMPENSATION = 0x5102, /*!< Altitude compensation */
mcm 1:c5b8dc5cdcee 164 SCD30_FIRMWARE_VERSION = 0xD100, /*!< Firmware version */
mcm 1:c5b8dc5cdcee 165 SCD30_SOFTRESET = 0xD304 /*!< Software reset: Restart the sensor */
mcm 1:c5b8dc5cdcee 166 } SCD30_command_registers_t;
mcm 1:c5b8dc5cdcee 167
mcm 1:c5b8dc5cdcee 168
mcm 1:c5b8dc5cdcee 169
mcm 1:c5b8dc5cdcee 170 /**
mcm 1:c5b8dc5cdcee 171 * @brief GET DATA READY STATUS.
mcm 1:c5b8dc5cdcee 172 * NOTE: N/A.
mcm 1:c5b8dc5cdcee 173 */
mcm 1:c5b8dc5cdcee 174 /* BIT <0>
mcm 1:c5b8dc5cdcee 175 * NOTE: N/A.
mcm 1:c5b8dc5cdcee 176 */
mcm 1:c5b8dc5cdcee 177 typedef enum {
mcm 1:c5b8dc5cdcee 178 GET_READY_STATUS_BIT_MASK = ( 1U << 0U ), /*!< BIT mask */
mcm 1:c5b8dc5cdcee 179 GET_READY_STATUS_BIT_DATA_NO_READY = ( 0U << 0U ), /*!< Measurement is not ready to be read from the sensor */
mcm 1:c5b8dc5cdcee 180 GET_READY_STATUS_BIT_DATA_READY = ( 1U << 0U ) /*!< Measurement is ready to be read from the sensor */
mcm 1:c5b8dc5cdcee 181 } SCD30_get_ready_status_bit_t;
mcm 1:c5b8dc5cdcee 182
mcm 1:c5b8dc5cdcee 183
mcm 1:c5b8dc5cdcee 184 /**
mcm 1:c5b8dc5cdcee 185 * @brief CONTINUOUS AUTOMATIC SELF CALIBRATION.
mcm 1:c5b8dc5cdcee 186 * NOTE: N/A.
mcm 1:c5b8dc5cdcee 187 */
mcm 1:c5b8dc5cdcee 188 /* ASC <0>
mcm 1:c5b8dc5cdcee 189 * NOTE: N/A.
mcm 1:c5b8dc5cdcee 190 */
mcm 1:c5b8dc5cdcee 191 typedef enum {
mcm 1:c5b8dc5cdcee 192 CONTINUOUS_AUTOMATIC_SELF_CALIBRATION_ASC_MASK = ( 1U << 0U ), /*!< ASC mask */
mcm 1:c5b8dc5cdcee 193 CONTINUOUS_AUTOMATIC_SELF_CALIBRATION_ASC_DEACTIVATE = ( 0U << 0U ), /*!< Deactivate continuous ASC */
mcm 1:c5b8dc5cdcee 194 CONTINUOUS_AUTOMATIC_SELF_CALIBRATION_ASC_ACTIVATE = ( 1U << 0U ) /*!< Activate continuous ASC */
mcm 1:c5b8dc5cdcee 195 } SCD30_continuous_auto_selfcal_t;
mcm 1:c5b8dc5cdcee 196
mcm 1:c5b8dc5cdcee 197
mcm 1:c5b8dc5cdcee 198 /**
mcm 1:c5b8dc5cdcee 199 * @brief CRC-8.
mcm 1:c5b8dc5cdcee 200 * NOTE: Polynomial: 0x31 (x^8 + x^5 + x^4 + 1)
mcm 1:c5b8dc5cdcee 201 * Initialization: 0xFF
mcm 1:c5b8dc5cdcee 202 * Final XOR: 0x00.
mcm 1:c5b8dc5cdcee 203 */
mcm 1:c5b8dc5cdcee 204 #define SCD30_CRC8_POLYNOMIAL 0x31 /*!< SCD30 CRC-8: Polynomial */
mcm 1:c5b8dc5cdcee 205 #define SCD30_CRC8_INITIALIZATION 0xFF /*!< SCD30 CRC-8: Initialization */
mcm 1:c5b8dc5cdcee 206 #define SCD30_CRC8_FINAL_XOR 0x00 /*!< SCD30 CRC-8: Final XOR */
mcm 1:c5b8dc5cdcee 207
mcm 1:c5b8dc5cdcee 208
mcm 1:c5b8dc5cdcee 209
mcm 1:c5b8dc5cdcee 210
mcm 1:c5b8dc5cdcee 211
mcm 1:c5b8dc5cdcee 212
mcm 1:c5b8dc5cdcee 213 #ifndef SCD30_VECTOR_STRUCT_H
mcm 1:c5b8dc5cdcee 214 #define SCD30_VECTOR_STRUCT_H
mcm 1:c5b8dc5cdcee 215 /* Firmware version */
mcm 1:c5b8dc5cdcee 216 typedef struct {
mcm 1:c5b8dc5cdcee 217 uint8_t version_major;
mcm 1:c5b8dc5cdcee 218 uint8_t version_minor;
mcm 1:c5b8dc5cdcee 219 } SCD30_fw_version_t;
mcm 1:c5b8dc5cdcee 220
mcm 1:c5b8dc5cdcee 221
mcm 1:c5b8dc5cdcee 222 /* Raw measurement data */
mcm 1:c5b8dc5cdcee 223 typedef struct {
mcm 1:c5b8dc5cdcee 224 uint8_t co2_mmsb;
mcm 1:c5b8dc5cdcee 225 uint8_t co2_mlsb;
mcm 1:c5b8dc5cdcee 226 uint8_t co2_mmsb_mlsb_crc;
mcm 1:c5b8dc5cdcee 227
mcm 1:c5b8dc5cdcee 228 uint8_t co2_lmsb;
mcm 1:c5b8dc5cdcee 229 uint8_t co2_llsb;
mcm 1:c5b8dc5cdcee 230 uint8_t co2_lmsb_llsb_crc;
mcm 1:c5b8dc5cdcee 231
mcm 1:c5b8dc5cdcee 232 uint8_t temperature_mmsb;
mcm 1:c5b8dc5cdcee 233 uint8_t temperature_mlsb;
mcm 1:c5b8dc5cdcee 234 uint8_t temperature_mmsb_mlsb_crc;
mcm 1:c5b8dc5cdcee 235
mcm 1:c5b8dc5cdcee 236 uint8_t temperature_lmsb;
mcm 1:c5b8dc5cdcee 237 uint8_t temperature_llsb;
mcm 1:c5b8dc5cdcee 238 uint8_t temperature_lmsb_llsb_crc;
mcm 1:c5b8dc5cdcee 239
mcm 1:c5b8dc5cdcee 240 uint8_t humidity_mmsb;
mcm 1:c5b8dc5cdcee 241 uint8_t humidity_mlsb;
mcm 1:c5b8dc5cdcee 242 uint8_t humidity_mmsb_mlsb_crc;
mcm 1:c5b8dc5cdcee 243
mcm 1:c5b8dc5cdcee 244 uint8_t humidity_lmsb;
mcm 1:c5b8dc5cdcee 245 uint8_t humidity_llsb;
mcm 1:c5b8dc5cdcee 246 uint8_t humidity_lmsb_llsb_crc;
mcm 1:c5b8dc5cdcee 247 } SCD30_raw_output_data_t;
mcm 1:c5b8dc5cdcee 248
mcm 1:c5b8dc5cdcee 249
mcm 1:c5b8dc5cdcee 250 /* Measurement processed data */
mcm 1:c5b8dc5cdcee 251 typedef struct {
mcm 1:c5b8dc5cdcee 252 float co2;
mcm 1:c5b8dc5cdcee 253 float temperature;
mcm 1:c5b8dc5cdcee 254 float humidity;
mcm 1:c5b8dc5cdcee 255 } SCD30_processed_data_t;
mcm 1:c5b8dc5cdcee 256
mcm 1:c5b8dc5cdcee 257
mcm 1:c5b8dc5cdcee 258 /* Measurement data: Raw and processed data */
mcm 1:c5b8dc5cdcee 259 typedef struct {
mcm 1:c5b8dc5cdcee 260 SCD30_raw_output_data_t raw;
mcm 1:c5b8dc5cdcee 261 SCD30_processed_data_t processed;
mcm 1:c5b8dc5cdcee 262 } SCD30_output_data_t;
mcm 1:c5b8dc5cdcee 263
mcm 1:c5b8dc5cdcee 264
mcm 1:c5b8dc5cdcee 265
mcm 1:c5b8dc5cdcee 266
mcm 1:c5b8dc5cdcee 267 /* USER: User's variables */
mcm 1:c5b8dc5cdcee 268 typedef struct {
mcm 1:c5b8dc5cdcee 269 /* Output data */
mcm 1:c5b8dc5cdcee 270 SCD30_output_data_t data; /*< Data (processed and raw): CO2, Temperature and Humidity */
mcm 1:c5b8dc5cdcee 271
mcm 1:c5b8dc5cdcee 272 /* Pressure compensation */
mcm 1:c5b8dc5cdcee 273 uint16_t pressure_compensation; /*< 0 (desactivates pressure compensation) or [700 - 1400]. Pressure in mBar */
mcm 1:c5b8dc5cdcee 274
mcm 1:c5b8dc5cdcee 275 /* Set measurement interval */
mcm 1:c5b8dc5cdcee 276 uint16_t measurement_interval; /*< [2 - 1800]. Interval in seconds */
mcm 1:c5b8dc5cdcee 277
mcm 1:c5b8dc5cdcee 278 /* Status */
mcm 1:c5b8dc5cdcee 279 SCD30_get_ready_status_bit_t status; /*< Measurement is ready to be read from the sensor */
mcm 1:c5b8dc5cdcee 280
mcm 1:c5b8dc5cdcee 281 /* (De-)Activate automatic self-calibration */
mcm 1:c5b8dc5cdcee 282 SCD30_continuous_auto_selfcal_t asc; /*< Continuos automatic self-calibration */
mcm 1:c5b8dc5cdcee 283
mcm 1:c5b8dc5cdcee 284 /* Forced recalibration */
mcm 1:c5b8dc5cdcee 285 uint16_t frc; /*< Value of C02 concentration in ppm */
mcm 1:c5b8dc5cdcee 286
mcm 1:c5b8dc5cdcee 287 /* Set temperature offset */
mcm 1:c5b8dc5cdcee 288 uint16_t temperature_offset; /*< Value of Temperature offset. [°C x 100]. One tick corresponds to 0.01 C */
mcm 1:c5b8dc5cdcee 289
mcm 1:c5b8dc5cdcee 290 /* Altitude compensation */
mcm 1:c5b8dc5cdcee 291 uint16_t altitude_compensation; /*< Altitude compensation value. Height over sea level in [m] above 0 */
mcm 1:c5b8dc5cdcee 292
mcm 1:c5b8dc5cdcee 293 /* Firmware version */
mcm 1:c5b8dc5cdcee 294 SCD30_fw_version_t firmware; /*< Firmware version */
mcm 1:c5b8dc5cdcee 295 } SCD30_data_t;
mcm 1:c5b8dc5cdcee 296 #endif
mcm 1:c5b8dc5cdcee 297
mcm 1:c5b8dc5cdcee 298
mcm 1:c5b8dc5cdcee 299
mcm 1:c5b8dc5cdcee 300
mcm 1:c5b8dc5cdcee 301 /**
mcm 1:c5b8dc5cdcee 302 * @brief INTERNAL CONSTANTS
mcm 1:c5b8dc5cdcee 303 */
mcm 1:c5b8dc5cdcee 304 typedef enum {
mcm 1:c5b8dc5cdcee 305 SCD30_SUCCESS = 0,
mcm 1:c5b8dc5cdcee 306 SCD30_FAILURE = 1,
mcm 1:c5b8dc5cdcee 307 SCD30_DATA_CORRUPTED = 2,
mcm 1:c5b8dc5cdcee 308 I2C_SUCCESS = 0
mcm 1:c5b8dc5cdcee 309 } SCD30_status_t;
mcm 1:c5b8dc5cdcee 310
mcm 1:c5b8dc5cdcee 311
mcm 1:c5b8dc5cdcee 312
mcm 1:c5b8dc5cdcee 313 /**
mcm 1:c5b8dc5cdcee 314 * @brief FUNCTION PROTOTYPES
mcm 1:c5b8dc5cdcee 315 */
mcm 1:c5b8dc5cdcee 316 /** Create an SCD30 object connected to the specified I2C pins.
mcm 1:c5b8dc5cdcee 317 *
mcm 1:c5b8dc5cdcee 318 * @param sda I2C data pin
mcm 1:c5b8dc5cdcee 319 * @param scl I2C clock pin
mcm 1:c5b8dc5cdcee 320 * @param addr I2C slave address
mcm 1:c5b8dc5cdcee 321 * @param freq I2C frequency in Hz.
mcm 1:c5b8dc5cdcee 322 */
mcm 1:c5b8dc5cdcee 323 SCD30 ( PinName sda, PinName scl, uint32_t addr, uint32_t freq );
mcm 1:c5b8dc5cdcee 324
mcm 1:c5b8dc5cdcee 325 /** Delete SCD30 object.
mcm 1:c5b8dc5cdcee 326 */
mcm 1:c5b8dc5cdcee 327 ~SCD30();
mcm 1:c5b8dc5cdcee 328
mcm 1:c5b8dc5cdcee 329 /** It configures the I2C peripheral.
mcm 1:c5b8dc5cdcee 330 */
mcm 1:c5b8dc5cdcee 331 SCD30_status_t SCD30_Init ( void );
mcm 1:c5b8dc5cdcee 332
mcm 1:c5b8dc5cdcee 333 /** It triggers continuous measurement with or without ambient pressure compensation.
mcm 1:c5b8dc5cdcee 334 */
mcm 1:c5b8dc5cdcee 335 SCD30_status_t SCD30_TriggerContinuousMeasurement ( uint16_t pressure_compensation );
mcm 1:c5b8dc5cdcee 336
mcm 1:c5b8dc5cdcee 337 /** It stops the continuous measurement.
mcm 1:c5b8dc5cdcee 338 */
mcm 1:c5b8dc5cdcee 339 SCD30_status_t SCD30_StopContinuousMeasurement ( void );
mcm 1:c5b8dc5cdcee 340
mcm 1:c5b8dc5cdcee 341 /** It sets the measurement interval.
mcm 1:c5b8dc5cdcee 342 */
mcm 1:c5b8dc5cdcee 343 SCD30_status_t SCD30_SetMeasurementInterval ( uint16_t measurement_interval );
mcm 1:c5b8dc5cdcee 344
mcm 1:c5b8dc5cdcee 345 /** It gets the measurement interval.
mcm 1:c5b8dc5cdcee 346 */
mcm 1:c5b8dc5cdcee 347 SCD30_status_t SCD30_GetMeasurementInterval ( uint16_t* measurement_interval );
mcm 1:c5b8dc5cdcee 348
mcm 1:c5b8dc5cdcee 349 /** It gets the status when the data is ready to be read.
mcm 1:c5b8dc5cdcee 350 */
mcm 1:c5b8dc5cdcee 351 SCD30_status_t SCD30_GetDataReadyStatus ( SCD30_get_ready_status_bit_t* status );
mcm 1:c5b8dc5cdcee 352
mcm 1:c5b8dc5cdcee 353 /** It gets all the raw data.
mcm 1:c5b8dc5cdcee 354 */
mcm 1:c5b8dc5cdcee 355 SCD30_status_t SCD30_ReadRawMeasurement ( SCD30_raw_output_data_t* raw_data );
mcm 1:c5b8dc5cdcee 356
mcm 1:c5b8dc5cdcee 357 /** It gets all the data.
mcm 1:c5b8dc5cdcee 358 */
mcm 1:c5b8dc5cdcee 359 SCD30_status_t SCD30_ReadMeasurement ( SCD30_output_data_t* data );
mcm 1:c5b8dc5cdcee 360
mcm 1:c5b8dc5cdcee 361 /** It enables/disables the continuous automatic self-calibration.
mcm 1:c5b8dc5cdcee 362 */
mcm 1:c5b8dc5cdcee 363 SCD30_status_t SCD30_SetContinuousASC ( SCD30_continuous_auto_selfcal_t asc );
mcm 1:c5b8dc5cdcee 364
mcm 1:c5b8dc5cdcee 365 /** It gets the continuous automatic self-calibration bit.
mcm 1:c5b8dc5cdcee 366 */
mcm 1:c5b8dc5cdcee 367 SCD30_status_t SCD30_GetContinuousASC ( SCD30_continuous_auto_selfcal_t* asc );
mcm 1:c5b8dc5cdcee 368
mcm 1:c5b8dc5cdcee 369 /** It sets the forced recalibration value.
mcm 1:c5b8dc5cdcee 370 */
mcm 1:c5b8dc5cdcee 371 SCD30_status_t SCD30_SetForcedRecalibrationValue ( uint16_t frc );
mcm 1:c5b8dc5cdcee 372
mcm 1:c5b8dc5cdcee 373 /** It gets the forced recalibration value.
mcm 1:c5b8dc5cdcee 374 */
mcm 1:c5b8dc5cdcee 375 SCD30_status_t SCD30_GetForcedRecalibrationValue ( uint16_t* frc );
mcm 1:c5b8dc5cdcee 376
mcm 1:c5b8dc5cdcee 377 /** It sets the temperature offset value.
mcm 1:c5b8dc5cdcee 378 */
mcm 1:c5b8dc5cdcee 379 SCD30_status_t SCD30_SetTemperatureOffsetValue ( uint16_t temp_offset );
mcm 1:c5b8dc5cdcee 380
mcm 1:c5b8dc5cdcee 381 /** It gets the temperature offset value.
mcm 1:c5b8dc5cdcee 382 */
mcm 1:c5b8dc5cdcee 383 SCD30_status_t SCD30_GetTemperatureOffsetValue ( uint16_t* temp_offset );
mcm 1:c5b8dc5cdcee 384
mcm 1:c5b8dc5cdcee 385 /** It sets the altitude compensation value.
mcm 1:c5b8dc5cdcee 386 */
mcm 1:c5b8dc5cdcee 387 SCD30_status_t SCD30_SetAltitudeCompensationValue ( uint16_t alt_comp );
mcm 1:c5b8dc5cdcee 388
mcm 1:c5b8dc5cdcee 389 /** It gets the altitude compensation value.
mcm 1:c5b8dc5cdcee 390 */
mcm 1:c5b8dc5cdcee 391 SCD30_status_t SCD30_GetAltitudeCompensationValue ( uint16_t* alt_comp );
mcm 1:c5b8dc5cdcee 392
mcm 1:c5b8dc5cdcee 393 /** It gets the firmware version value.
mcm 1:c5b8dc5cdcee 394 */
mcm 1:c5b8dc5cdcee 395 SCD30_status_t SCD30_GetFirmwareVersion ( SCD30_fw_version_t* fw );
mcm 1:c5b8dc5cdcee 396
mcm 1:c5b8dc5cdcee 397 /** It performs a software reset.
mcm 1:c5b8dc5cdcee 398 */
mcm 1:c5b8dc5cdcee 399 SCD30_status_t SCD30_SoftReset ( void );
mcm 1:c5b8dc5cdcee 400
mcm 2:0d0174b46fd3 401 private:
mcm 1:c5b8dc5cdcee 402 /** It calculates the I2C checksum calculation (CRC-8).
mcm 1:c5b8dc5cdcee 403 */
mcm 1:c5b8dc5cdcee 404 uint8_t SCD30_CalculateI2C_CRC8 ( uint16_t seed );
mcm 3:ca833b38050f 405
mcm 1:c5b8dc5cdcee 406 I2C _i2c;
mcm 1:c5b8dc5cdcee 407 uint32_t _SCD30_Addr;
mcm 1:c5b8dc5cdcee 408 };
mcm 1:c5b8dc5cdcee 409
mcm 1:c5b8dc5cdcee 410 #endif /* SCD30_H */