I2C HUMIDITY AND TEMPERATURE SENSOR

Dependents:   dashboard_f1

Committer:
mcm
Date:
Mon Feb 05 12:51:46 2018 +0000
Revision:
3:75cece7f7329
Parent:
1:54da1ce19764
The library was completed and tested, it works as expected ( NUCLEO-L152RE was used for testing )

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mcm 1:54da1ce19764 1 /**
mcm 1:54da1ce19764 2 * @brief SI7021.h
mcm 1:54da1ce19764 3 * @details I2C HUMIDITY AND TEMPERATURE SENSOR.
mcm 1:54da1ce19764 4 * Header file.
mcm 1:54da1ce19764 5 *
mcm 1:54da1ce19764 6 *
mcm 1:54da1ce19764 7 * @return NA
mcm 1:54da1ce19764 8 *
mcm 1:54da1ce19764 9 * @author Manuel Caballero
mcm 1:54da1ce19764 10 * @date 5/February/2018
mcm 1:54da1ce19764 11 * @version 5/February/2018 The ORIGIN
mcm 1:54da1ce19764 12 * @pre NaN.
mcm 1:54da1ce19764 13 * @warning NaN
mcm 1:54da1ce19764 14 * @pre This code belongs to AqueronteBlog ( http://unbarquero.blogspot.com ).
mcm 1:54da1ce19764 15 */
mcm 1:54da1ce19764 16 #ifndef SI7021_H
mcm 1:54da1ce19764 17 #define SI7021_H
mcm 1:54da1ce19764 18
mcm 1:54da1ce19764 19 #include "mbed.h"
mcm 1:54da1ce19764 20
mcm 1:54da1ce19764 21
mcm 1:54da1ce19764 22 /**
mcm 1:54da1ce19764 23 Example:
mcm 1:54da1ce19764 24
mcm 3:75cece7f7329 25 #include "mbed.h"
mcm 3:75cece7f7329 26 #include "SI7021.h"
mcm 3:75cece7f7329 27
mcm 3:75cece7f7329 28
mcm 3:75cece7f7329 29 SI7021 myTempRHsensor ( I2C_SDA, I2C_SCL, SI7021::SI7021_ADDRESS, 400000 );
mcm 3:75cece7f7329 30 Serial pc ( USBTX, USBRX );
mcm 3:75cece7f7329 31
mcm 3:75cece7f7329 32 Ticker newReading;
mcm 3:75cece7f7329 33 DigitalOut myled1 ( LED1 );
mcm 3:75cece7f7329 34
mcm 3:75cece7f7329 35
mcm 3:75cece7f7329 36
mcm 3:75cece7f7329 37 SI7021::SI7021_vector_data_t myData;
mcm 3:75cece7f7329 38 SI7021::SI7021_status_t mySI7021status;
mcm 3:75cece7f7329 39 uint32_t myState;
mcm 3:75cece7f7329 40
mcm 3:75cece7f7329 41
mcm 3:75cece7f7329 42 void readDATA ( void )
mcm 3:75cece7f7329 43 {
mcm 3:75cece7f7329 44 myState++;
mcm 3:75cece7f7329 45 }
mcm 3:75cece7f7329 46
mcm 3:75cece7f7329 47
mcm 3:75cece7f7329 48 int main()
mcm 3:75cece7f7329 49 {
mcm 3:75cece7f7329 50 pc.baud ( 115200 );
mcm 3:75cece7f7329 51
mcm 3:75cece7f7329 52 // Reset the device
mcm 3:75cece7f7329 53 mySI7021status = myTempRHsensor.SI7021_SoftReset ();
mcm 3:75cece7f7329 54 wait_ms ( 15 );
mcm 3:75cece7f7329 55
mcm 3:75cece7f7329 56
mcm 3:75cece7f7329 57 // Configure the device
mcm 3:75cece7f7329 58 mySI7021status = myTempRHsensor.SI7021_Conf ( SI7021::SI7021_RESOLUTION_RH_12_TEMP_14, SI7021::SI7021_HTRE_DISABLED );
mcm 3:75cece7f7329 59
mcm 3:75cece7f7329 60 // Get the Electronic Serial Number
mcm 3:75cece7f7329 61 mySI7021status = myTempRHsensor.SI7021_GetElectronicSerialNumber ( &myData );
mcm 3:75cece7f7329 62
mcm 3:75cece7f7329 63 // Get the Firmware revision
mcm 3:75cece7f7329 64 mySI7021status = myTempRHsensor.SI7021_GetFirmwareRevision ( &myData );
mcm 3:75cece7f7329 65
mcm 3:75cece7f7329 66 // Plot all the information through the srial port.
mcm 3:75cece7f7329 67 pc.printf( "Electronic Serial Number: %16x %16x\nFirmware Revision: %02x\r\n", myData.ElectronicSerialNumber_MSB, myData.ElectronicSerialNumber_LSB, myData.FirmwareRevision );
mcm 3:75cece7f7329 68
mcm 3:75cece7f7329 69
mcm 3:75cece7f7329 70 newReading.attach( &readDATA, 0.5 ); // the address of the function to be attached ( readDATA ) and the interval ( 0.5s )
mcm 3:75cece7f7329 71
mcm 3:75cece7f7329 72
mcm 3:75cece7f7329 73 // Let the callbacks take care of everything
mcm 3:75cece7f7329 74 while(1) {
mcm 3:75cece7f7329 75 sleep();
mcm 3:75cece7f7329 76
mcm 3:75cece7f7329 77 if ( myState == 1 ) {
mcm 3:75cece7f7329 78 // Trigger a new Humidity conversion ( the temperature conversion is triggered by default )
mcm 3:75cece7f7329 79 myled1 = 1;
mcm 3:75cece7f7329 80
mcm 3:75cece7f7329 81 mySI7021status = myTempRHsensor.SI7021_TriggerHumidity ( SI7021::SI7021_NO_HOLD_MASTER_MODE );
mcm 3:75cece7f7329 82 } else if ( myState == 2 ) {
mcm 3:75cece7f7329 83 // Read Humidity and Temperature result
mcm 3:75cece7f7329 84 mySI7021status = myTempRHsensor.SI7021_ReadHumidity ( &myData );
mcm 3:75cece7f7329 85 mySI7021status = myTempRHsensor.SI7021_ReadTemperatureFromRH ( &myData );
mcm 3:75cece7f7329 86
mcm 3:75cece7f7329 87 // Send it through the UART
mcm 3:75cece7f7329 88 pc.printf( "Temp: %0.5f C, RH: %0.5f\r\n", myData.Temperature, myData.RelativeHumidity );
mcm 3:75cece7f7329 89
mcm 3:75cece7f7329 90 myState = 0; // Reset state
mcm 3:75cece7f7329 91 myled1 = 0;
mcm 3:75cece7f7329 92 }
mcm 3:75cece7f7329 93 }
mcm 3:75cece7f7329 94 }
mcm 1:54da1ce19764 95
mcm 1:54da1ce19764 96 */
mcm 1:54da1ce19764 97
mcm 1:54da1ce19764 98
mcm 1:54da1ce19764 99 /*!
mcm 1:54da1ce19764 100 Library for the SI7021 I2C Humidity and Temperature sensor.
mcm 1:54da1ce19764 101 */
mcm 1:54da1ce19764 102 class SI7021
mcm 1:54da1ce19764 103 {
mcm 1:54da1ce19764 104 public:
mcm 1:54da1ce19764 105 /**
mcm 1:54da1ce19764 106 * @brief DEFAULT ADDRESSES
mcm 1:54da1ce19764 107 */
mcm 1:54da1ce19764 108 typedef enum {
mcm 1:54da1ce19764 109 SI7021_ADDRESS = ( 0x40 << 1 ) /*!< SI7021 I2C Address */
mcm 1:54da1ce19764 110 } SI7021_address_t;
mcm 1:54da1ce19764 111
mcm 1:54da1ce19764 112
mcm 1:54da1ce19764 113 // REGISTERS
mcm 1:54da1ce19764 114 /**
mcm 1:54da1ce19764 115 * @brief COMMAND CODE
mcm 1:54da1ce19764 116 */
mcm 1:54da1ce19764 117 typedef enum {
mcm 1:54da1ce19764 118 SI7021_MEASURE_RELATIVE_HUMIDITY_HOLD_MASTER_MODE = 0xE5, /*!< Measure Relative Humidity, Hold Master Mode */
mcm 1:54da1ce19764 119 SI7021_MEASURE_RELATIVE_HUMIDITY_NO_HOLD_MASTER_MODE = 0xF5, /*!< Measure Relative Humidity, No Hold Master Mode */
mcm 1:54da1ce19764 120 SI7021_MEASURE_TEMPERATURE_HOLD_MASTER_MODE = 0xE3, /*!< Measure Temperature, Hold Master Mode */
mcm 1:54da1ce19764 121 SI7021_MEASURE_TEMPERATURE_NO_HOLD_MASTER_MODE = 0xF3, /*!< Measure Temperature, No Hold Master Mode */
mcm 1:54da1ce19764 122 SI7021_READ_TEMPERATURE_VALUE_FROM_PREVIOUS_RH_MEASUREMENT = 0xE0, /*!< Read Temperature Value from Previous RH Measurement */
mcm 1:54da1ce19764 123 SI7021_RESET = 0xFE, /*!< Reset */
mcm 1:54da1ce19764 124 SI7021_WRITE_RH_T_USER_REGISTER_1 = 0xE6, /*!< Write RH/T User Register 1 */
mcm 1:54da1ce19764 125 SI7021_READ_RH_T_USER_REGISTER_1 = 0xE7, /*!< Read RH/T User Register 1 */
mcm 1:54da1ce19764 126 SI7021_WRITE_HEATER_CONTROL_REGISTER = 0x51, /*!< Write Heater Control Register */
mcm 1:54da1ce19764 127 SI7021_READ_HEATER_CONTROL_REGISTER = 0x11, /*!< Read Heater Control Register */
mcm 1:54da1ce19764 128 SI7021_READ_ELECTRONIC_ID_FIRST_BYTE_CMD1 = 0xFA, /*!< Read Electronic ID 1st Byte */
mcm 1:54da1ce19764 129 SI7021_READ_ELECTRONIC_ID_FIRST_BYTE_CMD2 = 0x0F, /*!< Read Electronic ID 1st Byte */
mcm 1:54da1ce19764 130 SI7021_READ_ELECTRONIC_ID_SECOND_BYTE_CMD1 = 0xFC, /*!< Read Electronic ID 2nd Byte */
mcm 1:54da1ce19764 131 SI7021_READ_ELECTRONIC_ID_SECOND_BYTE_CMD2 = 0xC9, /*!< Read Electronic ID 2nd Byte */
mcm 1:54da1ce19764 132 SI7021_READ_FIRMWARE_VERSION_CMD1 = 0x84, /*!< Read Firmware Revision */
mcm 1:54da1ce19764 133 SI7021_READ_FIRMWARE_VERSION_CMD2 = 0xB8 /*!< Read Firmware Revision */
mcm 1:54da1ce19764 134 } SI7021_command_code_t;
mcm 1:54da1ce19764 135
mcm 1:54da1ce19764 136
mcm 1:54da1ce19764 137
mcm 1:54da1ce19764 138 // MASTER MODE
mcm 1:54da1ce19764 139 /**
mcm 1:54da1ce19764 140 * @brief MEASUREMENT RESOLUTION
mcm 1:54da1ce19764 141 */
mcm 1:54da1ce19764 142 typedef enum {
mcm 1:54da1ce19764 143 SI7021_HOLD_MASTER_MODE = 0x01, /*!< SI7021 HOLD MASTER MODE enabled */
mcm 1:54da1ce19764 144 SI7021_NO_HOLD_MASTER_MODE = 0x00 /*!< SI7021 NO HOLD MASTER MODE enabled */
mcm 1:54da1ce19764 145 } SI7021_master_mode_t;
mcm 1:54da1ce19764 146
mcm 1:54da1ce19764 147
mcm 1:54da1ce19764 148
mcm 1:54da1ce19764 149 // USER REGISTER 1
mcm 1:54da1ce19764 150 /*
mcm 1:54da1ce19764 151 NOTE: Reset Settings = 0011_1010.
mcm 1:54da1ce19764 152 Except where noted, reserved register bits will always read back as “1,” and are not affected by write operations. For
mcm 1:54da1ce19764 153 future compatibility, it is recommended that prior to a write operation, registers should be read. Then the values read
mcm 1:54da1ce19764 154 from the RSVD bits should be written back unchanged during the write operation.
mcm 1:54da1ce19764 155 */
mcm 1:54da1ce19764 156 /**
mcm 1:54da1ce19764 157 * @brief MEASUREMENT RESOLUTION
mcm 1:54da1ce19764 158 */
mcm 1:54da1ce19764 159 typedef enum {
mcm 1:54da1ce19764 160 SI7021_RESOLUTION_MASK = 0x81, /*!< SI7021 Measurement Resolution */
mcm 1:54da1ce19764 161 SI7021_RESOLUTION_RH_12_TEMP_14 = 0x00, /*!< SI7021 12b RH 14b Temp. */
mcm 1:54da1ce19764 162 SI7021_RESOLUTION_RH_8_TEMP_12 = 0x01, /*!< SI7021 9b RH 12b Temp. */
mcm 1:54da1ce19764 163 SI7021_RESOLUTION_RH_10_TEMP_13 = 0x80, /*!< SI7021 10b RH 13b Temp. */
mcm 1:54da1ce19764 164 SI7021_RESOLUTION_RH_11_TEMP_11 = 0x81 /*!< SI7021 11b RH 11b Temp. */
mcm 1:54da1ce19764 165 } SI7021_measurement_resolution_t;
mcm 1:54da1ce19764 166
mcm 1:54da1ce19764 167
mcm 1:54da1ce19764 168
mcm 1:54da1ce19764 169 /**
mcm 1:54da1ce19764 170 * @brief VDDS
mcm 1:54da1ce19764 171 */
mcm 1:54da1ce19764 172 /*
mcm 1:54da1ce19764 173 NOTE: The minimum recommended operating voltage is 1.9 V. A transition
mcm 1:54da1ce19764 174 of the VDD status bit from 0 to 1 indicates that VDD is
mcm 1:54da1ce19764 175 between 1.8 V and 1.9 V. If the VDD drops below 1.8 V, the
mcm 1:54da1ce19764 176 device will no longer operate correctly.
mcm 1:54da1ce19764 177 */
mcm 1:54da1ce19764 178 typedef enum {
mcm 1:54da1ce19764 179 SI7021_VDDS_STATUS_MASK = 0x40, /*!< SI7021 VDD mask. */
mcm 1:54da1ce19764 180 SI7021_VDDS_STATUS_VDD_OK = ( 0 << 6 ), /*!< VDD OK. */
mcm 1:54da1ce19764 181 SI7021_VDDS_STATUS_VDD_LOW = ( 1 << 6 ) /*!< VDD Low. */
mcm 1:54da1ce19764 182 } SI7021_vdds_status_t;
mcm 1:54da1ce19764 183
mcm 1:54da1ce19764 184
mcm 1:54da1ce19764 185
mcm 1:54da1ce19764 186 /**
mcm 1:54da1ce19764 187 * @brief HTRE
mcm 1:54da1ce19764 188 */
mcm 1:54da1ce19764 189 typedef enum {
mcm 1:54da1ce19764 190 SI7021_HTRE_MASK = 0x03, /*!< SI7021 HTRE Mask */
mcm 1:54da1ce19764 191 SI7021_HTRE_ENABLED = ( 1 << 2 ), /*!< SI7021 On-chip Heater Enable */
mcm 1:54da1ce19764 192 SI7021_HTRE_DISABLED = ( 0 << 2 ) /*!< SI7021 On-chip Heater Disable */
mcm 1:54da1ce19764 193 } SI7021_heater_t;
mcm 1:54da1ce19764 194
mcm 1:54da1ce19764 195
mcm 1:54da1ce19764 196
mcm 1:54da1ce19764 197
mcm 1:54da1ce19764 198
mcm 1:54da1ce19764 199
mcm 1:54da1ce19764 200 #ifndef SI7021_VECTOR_STRUCT_H
mcm 1:54da1ce19764 201 #define SI7021_VECTOR_STRUCT_H
mcm 1:54da1ce19764 202 typedef struct {
mcm 1:54da1ce19764 203 float RelativeHumidity;
mcm 1:54da1ce19764 204 float Temperature;
mcm 1:54da1ce19764 205
mcm 1:54da1ce19764 206 uint32_t ElectronicSerialNumber_LSB;
mcm 1:54da1ce19764 207 uint32_t ElectronicSerialNumber_MSB;
mcm 1:54da1ce19764 208
mcm 1:54da1ce19764 209 uint8_t FirmwareRevision;
mcm 1:54da1ce19764 210 SI7021_vdds_status_t BatteryStatus;
mcm 1:54da1ce19764 211 } SI7021_vector_data_t;
mcm 1:54da1ce19764 212 #endif
mcm 1:54da1ce19764 213
mcm 1:54da1ce19764 214
mcm 1:54da1ce19764 215
mcm 1:54da1ce19764 216 /**
mcm 1:54da1ce19764 217 * @brief INTERNAL CONSTANTS
mcm 1:54da1ce19764 218 */
mcm 1:54da1ce19764 219 typedef enum {
mcm 1:54da1ce19764 220 SI7021_SUCCESS = 0,
mcm 1:54da1ce19764 221 SI7021_FAILURE = 1,
mcm 1:54da1ce19764 222 I2C_SUCCESS = 0 /*!< I2C communication was fine */
mcm 1:54da1ce19764 223 } SI7021_status_t;
mcm 1:54da1ce19764 224
mcm 1:54da1ce19764 225
mcm 1:54da1ce19764 226
mcm 1:54da1ce19764 227
mcm 1:54da1ce19764 228 /** Create an SI7021 object connected to the specified I2C pins.
mcm 1:54da1ce19764 229 *
mcm 1:54da1ce19764 230 * @param sda I2C data pin
mcm 1:54da1ce19764 231 * @param scl I2C clock pin
mcm 1:54da1ce19764 232 * @param addr I2C slave address
mcm 1:54da1ce19764 233 * @param freq I2C frequency in Hz.
mcm 1:54da1ce19764 234 */
mcm 1:54da1ce19764 235 SI7021 ( PinName sda, PinName scl, uint32_t addr, uint32_t freq );
mcm 1:54da1ce19764 236
mcm 1:54da1ce19764 237 /** Delete SI7021 object.
mcm 1:54da1ce19764 238 */
mcm 1:54da1ce19764 239 ~SI7021();
mcm 1:54da1ce19764 240
mcm 1:54da1ce19764 241 /** It configures the device: resolution and heater.
mcm 1:54da1ce19764 242 */
mcm 1:54da1ce19764 243 SI7021_status_t SI7021_Conf ( SI7021_measurement_resolution_t myResolution, SI7021_heater_t myHeater );
mcm 1:54da1ce19764 244
mcm 1:54da1ce19764 245 /** It performs a software reset.
mcm 1:54da1ce19764 246 */
mcm 1:54da1ce19764 247 SI7021_status_t SI7021_SoftReset ( void );
mcm 1:54da1ce19764 248
mcm 1:54da1ce19764 249 /** It gets the electronic serial number.
mcm 1:54da1ce19764 250 */
mcm 1:54da1ce19764 251 SI7021_status_t SI7021_GetElectronicSerialNumber ( SI7021_vector_data_t* mySerialNumber );
mcm 1:54da1ce19764 252
mcm 1:54da1ce19764 253 /** It gets the firmware revision.
mcm 1:54da1ce19764 254 */
mcm 1:54da1ce19764 255 SI7021_status_t SI7021_GetFirmwareRevision ( SI7021_vector_data_t* myFirmwareRevision );
mcm 1:54da1ce19764 256
mcm 1:54da1ce19764 257 /** It sets the heater current.
mcm 1:54da1ce19764 258 */
mcm 1:54da1ce19764 259 SI7021_status_t SI7021_SetHeaterCurrent ( char myHeaterCurrent );
mcm 1:54da1ce19764 260
mcm 1:54da1ce19764 261 /** It performs a new temperature measurement.
mcm 1:54da1ce19764 262 */
mcm 1:54da1ce19764 263 SI7021_status_t SI7021_TriggerTemperature ( SI7021_master_mode_t myMode );
mcm 1:54da1ce19764 264
mcm 1:54da1ce19764 265 /** It read the temperature.
mcm 1:54da1ce19764 266 */
mcm 1:54da1ce19764 267 SI7021_status_t SI7021_ReadTemperature ( SI7021_vector_data_t* myTemperature );
mcm 1:54da1ce19764 268
mcm 1:54da1ce19764 269 /** It reads the raw data from temperature.
mcm 1:54da1ce19764 270 */
mcm 1:54da1ce19764 271 SI7021_status_t SI7021_ReadRawTemperature ( SI7021_vector_data_t* myTemperature );
mcm 1:54da1ce19764 272
mcm 1:54da1ce19764 273 /** It reads the raw temperature data after a relative humidity measurement was done.
mcm 1:54da1ce19764 274 */
mcm 1:54da1ce19764 275 SI7021_status_t SI7021_ReadRawTemperatureFromRH ( SI7021_vector_data_t* myTemperature );
mcm 1:54da1ce19764 276
mcm 1:54da1ce19764 277 /** It reads the temperature after a relative humidity measurement was done.
mcm 1:54da1ce19764 278 */
mcm 1:54da1ce19764 279 SI7021_status_t SI7021_ReadTemperatureFromRH ( SI7021_vector_data_t* myTemperature );
mcm 1:54da1ce19764 280
mcm 1:54da1ce19764 281 /** It performs a new relative humidity measurement.
mcm 1:54da1ce19764 282 */
mcm 1:54da1ce19764 283 SI7021_status_t SI7021_TriggerHumidity ( SI7021_master_mode_t myMode );
mcm 1:54da1ce19764 284
mcm 1:54da1ce19764 285 /** It reads the relative humidity.
mcm 1:54da1ce19764 286 */
mcm 1:54da1ce19764 287 SI7021_status_t SI7021_ReadHumidity ( SI7021_vector_data_t* myHumidity );
mcm 1:54da1ce19764 288
mcm 1:54da1ce19764 289 /** It reads the raw data from relative humidity.
mcm 1:54da1ce19764 290 */
mcm 1:54da1ce19764 291 SI7021_status_t SI7021_ReadRawHumidity ( SI7021_vector_data_t* myHumidity );
mcm 1:54da1ce19764 292
mcm 1:54da1ce19764 293 /** It gets the battery status.
mcm 1:54da1ce19764 294 */
mcm 1:54da1ce19764 295 SI7021_status_t SI7021_GetBatteryStatus ( SI7021_vector_data_t* myBatteryStatus );
mcm 1:54da1ce19764 296
mcm 1:54da1ce19764 297
mcm 1:54da1ce19764 298
mcm 1:54da1ce19764 299
mcm 1:54da1ce19764 300 private:
mcm 1:54da1ce19764 301 I2C _i2c;
mcm 1:54da1ce19764 302 uint32_t _SI7021_Addr;
mcm 1:54da1ce19764 303 };
mcm 1:54da1ce19764 304
mcm 1:54da1ce19764 305 #endif