CO2, humidity, and temperature sensor
SCD30.h@3:ca833b38050f, 2021-05-10 (annotated)
- 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?
User | Revision | Line number | New 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 */ |