I2C HUMIDITY AND TEMPERATURE SENSOR

Dependents:   dashboard_f1

Committer:
mcm
Date:
Mon Feb 05 12:51:46 2018 +0000
Revision:
3:75cece7f7329
Parent:
2:18c159179b08
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 2:18c159179b08 1 /**
mcm 2:18c159179b08 2 * @brief SI7021.h
mcm 2:18c159179b08 3 * @details I2C HUMIDITY AND TEMPERATURE SENSOR.
mcm 2:18c159179b08 4 * Header file.
mcm 2:18c159179b08 5 *
mcm 2:18c159179b08 6 *
mcm 2:18c159179b08 7 * @return NA
mcm 2:18c159179b08 8 *
mcm 2:18c159179b08 9 * @author Manuel Caballero
mcm 2:18c159179b08 10 * @date 5/February/2018
mcm 2:18c159179b08 11 * @version 5/February/2018 The ORIGIN
mcm 2:18c159179b08 12 * @pre N/A.
mcm 2:18c159179b08 13 * @warning N/A
mcm 2:18c159179b08 14 * @pre This code belongs to AqueronteBlog ( http://unbarquero.blogspot.com ).
mcm 2:18c159179b08 15 */
mcm 2:18c159179b08 16
mcm 2:18c159179b08 17 #include "SI7021.h"
mcm 2:18c159179b08 18
mcm 2:18c159179b08 19
mcm 2:18c159179b08 20 SI7021::SI7021 ( PinName sda, PinName scl, uint32_t addr, uint32_t freq )
mcm 2:18c159179b08 21 : _i2c ( sda, scl )
mcm 2:18c159179b08 22 , _SI7021_Addr ( addr )
mcm 2:18c159179b08 23 {
mcm 2:18c159179b08 24 _i2c.frequency( freq );
mcm 2:18c159179b08 25 }
mcm 2:18c159179b08 26
mcm 2:18c159179b08 27
mcm 2:18c159179b08 28 SI7021::~SI7021()
mcm 2:18c159179b08 29 {
mcm 2:18c159179b08 30 }
mcm 2:18c159179b08 31
mcm 2:18c159179b08 32
mcm 2:18c159179b08 33
mcm 2:18c159179b08 34 /**
mcm 2:18c159179b08 35 * @brief SI7021_Conf ( SI7021_measurement_resolution_t , SI7021_heater_t )
mcm 2:18c159179b08 36 *
mcm 2:18c159179b08 37 * @details It configures the device: resolution and heater.
mcm 2:18c159179b08 38 *
mcm 2:18c159179b08 39 * @param[in] myResolution: Resolution for RH and temperature.
mcm 2:18c159179b08 40 * @param[in] myHeater: Enable/Disable heater.
mcm 2:18c159179b08 41 *
mcm 2:18c159179b08 42 * @param[out] N/A.
mcm 2:18c159179b08 43 *
mcm 2:18c159179b08 44 *
mcm 2:18c159179b08 45 * @return Status of SI7021_Conf.
mcm 2:18c159179b08 46 *
mcm 2:18c159179b08 47 *
mcm 2:18c159179b08 48 * @author Manuel Caballero
mcm 2:18c159179b08 49 * @date 5/February/2018
mcm 2:18c159179b08 50 * @version 5/February/2018 The ORIGIN
mcm 2:18c159179b08 51 * @pre Except where noted, reserved register bits will always read back as “1,” and are not affected by write operations. For
mcm 2:18c159179b08 52 * future compatibility, it is recommended that prior to a write operation, registers should be read. Then the values read
mcm 2:18c159179b08 53 * from the RSVD bits should be written back unchanged during the write operation
mcm 2:18c159179b08 54 * @warning N/A.
mcm 2:18c159179b08 55 */
mcm 2:18c159179b08 56 SI7021::SI7021_status_t SI7021::SI7021_Conf ( SI7021_measurement_resolution_t myResolution, SI7021_heater_t myHeater )
mcm 2:18c159179b08 57 {
mcm 2:18c159179b08 58 char cmd[] = { SI7021_READ_RH_T_USER_REGISTER_1, 0 };
mcm 2:18c159179b08 59 uint32_t aux = 0;
mcm 2:18c159179b08 60
mcm 2:18c159179b08 61
mcm 2:18c159179b08 62
mcm 2:18c159179b08 63 // Read USER REGISTER to mask it
mcm 2:18c159179b08 64 aux = _i2c.write ( _SI7021_Addr, &cmd[0], 1, true );
mcm 2:18c159179b08 65 aux = _i2c.read ( _SI7021_Addr, &cmd[1], 1 );
mcm 2:18c159179b08 66
mcm 2:18c159179b08 67
mcm 2:18c159179b08 68 // Update USER REGISTER according to user requirements
mcm 2:18c159179b08 69 // Resolution
mcm 2:18c159179b08 70 cmd[1] &= ~SI7021_RESOLUTION_MASK;
mcm 2:18c159179b08 71 cmd[1] |= myResolution;
mcm 2:18c159179b08 72
mcm 2:18c159179b08 73 // Hater
mcm 2:18c159179b08 74 cmd[1] &= ~SI7021_HTRE_MASK;
mcm 2:18c159179b08 75 cmd[1] |= myHeater;
mcm 2:18c159179b08 76
mcm 2:18c159179b08 77
mcm 2:18c159179b08 78
mcm 2:18c159179b08 79 // Update USER REGISTER
mcm 2:18c159179b08 80 cmd[0] = SI7021_WRITE_RH_T_USER_REGISTER_1;
mcm 2:18c159179b08 81 aux = _i2c.write ( _SI7021_Addr, &cmd[0], 2, false );
mcm 2:18c159179b08 82
mcm 2:18c159179b08 83
mcm 2:18c159179b08 84
mcm 2:18c159179b08 85
mcm 2:18c159179b08 86 if ( aux == I2C_SUCCESS )
mcm 2:18c159179b08 87 return SI7021_SUCCESS;
mcm 2:18c159179b08 88 else
mcm 2:18c159179b08 89 return SI7021_FAILURE;
mcm 2:18c159179b08 90 }
mcm 2:18c159179b08 91
mcm 2:18c159179b08 92
mcm 2:18c159179b08 93
mcm 2:18c159179b08 94 /**
mcm 2:18c159179b08 95 * @brief SI7021_SoftReset ( void )
mcm 2:18c159179b08 96 *
mcm 2:18c159179b08 97 * @details It resets the device by software.
mcm 2:18c159179b08 98 *
mcm 2:18c159179b08 99 * @param[in] N/A
mcm 2:18c159179b08 100 *
mcm 2:18c159179b08 101 * @param[out] N/A.
mcm 2:18c159179b08 102 *
mcm 2:18c159179b08 103 *
mcm 2:18c159179b08 104 * @return Status of SI7021_SoftReset.
mcm 2:18c159179b08 105 *
mcm 2:18c159179b08 106 *
mcm 2:18c159179b08 107 * @author Manuel Caballero
mcm 2:18c159179b08 108 * @date 5/February/2018
mcm 2:18c159179b08 109 * @version 5/February/2018 The ORIGIN
mcm 2:18c159179b08 110 * @pre N/A
mcm 2:18c159179b08 111 * @warning The user MUST keep in mind that the device will be
mcm 2:18c159179b08 112 * available after 5ms ( typically, 15ms maximum )
mcm 2:18c159179b08 113 * The user MUST take care of this delay!.
mcm 2:18c159179b08 114 */
mcm 2:18c159179b08 115 SI7021::SI7021_status_t SI7021::SI7021_SoftReset ( void )
mcm 2:18c159179b08 116 {
mcm 2:18c159179b08 117 char cmd = SI7021_RESET;
mcm 2:18c159179b08 118 uint32_t aux = 0;
mcm 2:18c159179b08 119
mcm 2:18c159179b08 120
mcm 2:18c159179b08 121 aux = _i2c.write ( _SI7021_Addr, &cmd, 1, false );
mcm 2:18c159179b08 122
mcm 2:18c159179b08 123 // The user needs to wait for certain period of time before communicating
mcm 2:18c159179b08 124 // with the device again.
mcm 2:18c159179b08 125
mcm 2:18c159179b08 126
mcm 2:18c159179b08 127 if ( aux == I2C_SUCCESS )
mcm 2:18c159179b08 128 return SI7021_SUCCESS;
mcm 2:18c159179b08 129 else
mcm 2:18c159179b08 130 return SI7021_FAILURE;
mcm 2:18c159179b08 131 }
mcm 2:18c159179b08 132
mcm 2:18c159179b08 133
mcm 2:18c159179b08 134
mcm 2:18c159179b08 135 /**
mcm 2:18c159179b08 136 * @brief SI7021_GetElectronicSerialNumber ( SI7021_vector_data_t* )
mcm 2:18c159179b08 137 *
mcm 2:18c159179b08 138 * @details It gets the electronic serial number.
mcm 2:18c159179b08 139 *
mcm 2:18c159179b08 140 * @param[in] N/A
mcm 2:18c159179b08 141 *
mcm 2:18c159179b08 142 * @param[out] mySerialNumber: The Electronic Serial Number.
mcm 2:18c159179b08 143 *
mcm 2:18c159179b08 144 *
mcm 2:18c159179b08 145 * @return Status of SI7021_GetElectronicSerialNumber.
mcm 2:18c159179b08 146 *
mcm 2:18c159179b08 147 *
mcm 2:18c159179b08 148 * @author Manuel Caballero
mcm 2:18c159179b08 149 * @date 5/February/2018
mcm 2:18c159179b08 150 * @version 5/February/2018 The ORIGIN
mcm 2:18c159179b08 151 * @pre This function does NOT check the CRC
mcm 2:18c159179b08 152 * @warning N/A.
mcm 2:18c159179b08 153 */
mcm 2:18c159179b08 154 SI7021::SI7021_status_t SI7021::SI7021_GetElectronicSerialNumber ( SI7021_vector_data_t* mySerialNumber )
mcm 2:18c159179b08 155 {
mcm 2:18c159179b08 156 char cmd[] = { SI7021_READ_ELECTRONIC_ID_FIRST_BYTE_CMD1, SI7021_READ_ELECTRONIC_ID_FIRST_BYTE_CMD2, 0, 0, 0, 0, 0, 0 };
mcm 2:18c159179b08 157 uint32_t aux = 0;
mcm 2:18c159179b08 158
mcm 2:18c159179b08 159
mcm 2:18c159179b08 160 // Read Electronic Serial Number. First Access
mcm 2:18c159179b08 161 aux = _i2c.write ( _SI7021_Addr, &cmd[0], 2, true );
mcm 2:18c159179b08 162 aux = _i2c.read ( _SI7021_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 2:18c159179b08 163
mcm 2:18c159179b08 164
mcm 2:18c159179b08 165 mySerialNumber->ElectronicSerialNumber_MSB = ( ( cmd[0] << 24 ) | ( cmd[2] << 16 ) | ( cmd[4] << 8 ) | cmd[6] );
mcm 2:18c159179b08 166
mcm 2:18c159179b08 167
mcm 2:18c159179b08 168 // Read Electronic Serial Number. Second Access
mcm 2:18c159179b08 169 cmd[0] = SI7021_READ_ELECTRONIC_ID_SECOND_BYTE_CMD1;
mcm 2:18c159179b08 170 cmd[1] = SI7021_READ_ELECTRONIC_ID_SECOND_BYTE_CMD2;
mcm 2:18c159179b08 171
mcm 2:18c159179b08 172 aux = _i2c.write ( _SI7021_Addr, &cmd[0], 2, true );
mcm 2:18c159179b08 173 aux = _i2c.read ( _SI7021_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 2:18c159179b08 174
mcm 2:18c159179b08 175
mcm 2:18c159179b08 176 mySerialNumber->ElectronicSerialNumber_LSB = ( ( cmd[0] << 24 ) | ( cmd[2] << 16 ) | ( cmd[4] << 8 ) | cmd[6] );
mcm 2:18c159179b08 177
mcm 2:18c159179b08 178
mcm 2:18c159179b08 179
mcm 2:18c159179b08 180
mcm 2:18c159179b08 181 if ( aux == I2C_SUCCESS )
mcm 2:18c159179b08 182 return SI7021_SUCCESS;
mcm 2:18c159179b08 183 else
mcm 2:18c159179b08 184 return SI7021_FAILURE;
mcm 2:18c159179b08 185 }
mcm 2:18c159179b08 186
mcm 2:18c159179b08 187
mcm 2:18c159179b08 188
mcm 2:18c159179b08 189 /**
mcm 2:18c159179b08 190 * @brief SI7021_GetFirmwareRevision ( SI7021_vector_data_t* )
mcm 2:18c159179b08 191 *
mcm 2:18c159179b08 192 * @details It gets the firmware revision.
mcm 2:18c159179b08 193 *
mcm 2:18c159179b08 194 * @param[in] N/A
mcm 2:18c159179b08 195 *
mcm 2:18c159179b08 196 * @param[out] myFirmwareRevision: The firmware revision.
mcm 2:18c159179b08 197 *
mcm 2:18c159179b08 198 *
mcm 2:18c159179b08 199 * @return Status of SI7021_GetFirmwareRevision.
mcm 2:18c159179b08 200 *
mcm 2:18c159179b08 201 *
mcm 2:18c159179b08 202 * @author Manuel Caballero
mcm 2:18c159179b08 203 * @date 5/February/2018
mcm 2:18c159179b08 204 * @version 5/February/2018 The ORIGIN
mcm 2:18c159179b08 205 * @pre N/A.
mcm 2:18c159179b08 206 * @warning N/A.
mcm 2:18c159179b08 207 */
mcm 2:18c159179b08 208 SI7021::SI7021_status_t SI7021::SI7021_GetFirmwareRevision ( SI7021_vector_data_t* myFirmwareRevision )
mcm 2:18c159179b08 209 {
mcm 2:18c159179b08 210 char cmd[] = { SI7021_READ_FIRMWARE_VERSION_CMD1, SI7021_READ_FIRMWARE_VERSION_CMD2 };
mcm 2:18c159179b08 211 uint32_t aux = 0;
mcm 2:18c159179b08 212
mcm 2:18c159179b08 213
mcm 2:18c159179b08 214 // Read the firmware revision
mcm 2:18c159179b08 215 aux = _i2c.write ( _SI7021_Addr, &cmd[0], 2, true );
mcm 2:18c159179b08 216 aux = _i2c.read ( _SI7021_Addr, &cmd[0], 1 );
mcm 2:18c159179b08 217
mcm 2:18c159179b08 218
mcm 2:18c159179b08 219 myFirmwareRevision->FirmwareRevision = cmd[0];
mcm 2:18c159179b08 220
mcm 2:18c159179b08 221
mcm 2:18c159179b08 222
mcm 2:18c159179b08 223
mcm 2:18c159179b08 224 if ( aux == I2C_SUCCESS )
mcm 2:18c159179b08 225 return SI7021_SUCCESS;
mcm 2:18c159179b08 226 else
mcm 2:18c159179b08 227 return SI7021_FAILURE;
mcm 2:18c159179b08 228 }
mcm 2:18c159179b08 229
mcm 2:18c159179b08 230
mcm 2:18c159179b08 231
mcm 2:18c159179b08 232 /**
mcm 2:18c159179b08 233 * @brief SI7021_SetHeaterCurrent ( char )
mcm 2:18c159179b08 234 *
mcm 2:18c159179b08 235 * @details It sets the heater current.
mcm 2:18c159179b08 236 *
mcm 2:18c159179b08 237 * @param[in] myHeaterCurrent: New heater current value
mcm 2:18c159179b08 238 *
mcm 2:18c159179b08 239 * @param[out] N/A.
mcm 2:18c159179b08 240 *
mcm 2:18c159179b08 241 *
mcm 2:18c159179b08 242 * @return Status of SI7021_SetHeaterCurrent.
mcm 2:18c159179b08 243 *
mcm 2:18c159179b08 244 *
mcm 2:18c159179b08 245 * @author Manuel Caballero
mcm 2:18c159179b08 246 * @date 5/February/2018
mcm 2:18c159179b08 247 * @version 5/February/2018 The ORIGIN
mcm 2:18c159179b08 248 * @pre N/A.
mcm 2:18c159179b08 249 * @warning N/A.
mcm 2:18c159179b08 250 */
mcm 2:18c159179b08 251 SI7021::SI7021_status_t SI7021::SI7021_SetHeaterCurrent ( char myHeaterCurrent )
mcm 2:18c159179b08 252 {
mcm 2:18c159179b08 253 char cmd[] = { SI7021_READ_HEATER_CONTROL_REGISTER, 0 };
mcm 2:18c159179b08 254 uint32_t aux = 0;
mcm 2:18c159179b08 255
mcm 2:18c159179b08 256
mcm 2:18c159179b08 257 // myHeaterCurrent MUST be from 0 ( 0x00 ) to 15 ( 0x0F )
mcm 2:18c159179b08 258 if ( myHeaterCurrent <= 15 ) {
mcm 2:18c159179b08 259 // Read the heater control register
mcm 2:18c159179b08 260 aux = _i2c.write ( _SI7021_Addr, &cmd[0], 1, true );
mcm 2:18c159179b08 261 aux = _i2c.read ( _SI7021_Addr, &cmd[1], 1 );
mcm 2:18c159179b08 262
mcm 2:18c159179b08 263
mcm 2:18c159179b08 264 // Mask the data
mcm 2:18c159179b08 265 cmd[1] &= 0xF0;
mcm 2:18c159179b08 266
mcm 2:18c159179b08 267 // Update the value
mcm 2:18c159179b08 268 cmd[0] = SI7021_WRITE_HEATER_CONTROL_REGISTER;
mcm 2:18c159179b08 269 cmd[1] |= myHeaterCurrent;
mcm 2:18c159179b08 270
mcm 2:18c159179b08 271
mcm 2:18c159179b08 272 aux = _i2c.write ( _SI7021_Addr, &cmd[0], 2, false );
mcm 2:18c159179b08 273 } else
mcm 2:18c159179b08 274 return SI7021_FAILURE;
mcm 2:18c159179b08 275
mcm 2:18c159179b08 276
mcm 2:18c159179b08 277
mcm 2:18c159179b08 278
mcm 2:18c159179b08 279 if ( aux == I2C_SUCCESS )
mcm 2:18c159179b08 280 return SI7021_SUCCESS;
mcm 2:18c159179b08 281 else
mcm 2:18c159179b08 282 return SI7021_FAILURE;
mcm 2:18c159179b08 283 }
mcm 2:18c159179b08 284
mcm 2:18c159179b08 285
mcm 2:18c159179b08 286
mcm 2:18c159179b08 287 /**
mcm 2:18c159179b08 288 * @brief SI7021_TriggerTemperature ( SI7021_master_mode_t )
mcm 2:18c159179b08 289 *
mcm 2:18c159179b08 290 * @details It performs a new temperature measurement.
mcm 2:18c159179b08 291 *
mcm 2:18c159179b08 292 * @param[in] myMode: HOLD/NO HOLD mode.
mcm 2:18c159179b08 293 *
mcm 2:18c159179b08 294 * @param[out] N/A
mcm 2:18c159179b08 295 *
mcm 2:18c159179b08 296 *
mcm 2:18c159179b08 297 * @return Status of SI7021_TriggerTemperature.
mcm 2:18c159179b08 298 *
mcm 2:18c159179b08 299 *
mcm 2:18c159179b08 300 * @author Manuel Caballero
mcm 2:18c159179b08 301 * @date 5/February/2018
mcm 2:18c159179b08 302 * @version 5/February/2018 The ORIGIN
mcm 2:18c159179b08 303 * @pre N/A.
mcm 2:18c159179b08 304 * @warning The user MUST respect the total conversion time.
mcm 2:18c159179b08 305 * 14-bit temperature: 7ms ( 10.8ms max )
mcm 2:18c159179b08 306 * 13-bit temperature: 4ms ( 6.2ms max )
mcm 2:18c159179b08 307 * 12-bit temperature: 2.4ms ( 3.8ms max )
mcm 2:18c159179b08 308 * 11-bit temperature: 1.5ms ( 2.4ms max )
mcm 2:18c159179b08 309 */
mcm 2:18c159179b08 310 SI7021::SI7021_status_t SI7021::SI7021_TriggerTemperature ( SI7021_master_mode_t myMode )
mcm 2:18c159179b08 311 {
mcm 2:18c159179b08 312 char cmd = 0;
mcm 2:18c159179b08 313 bool myI2C_stop = false;
mcm 2:18c159179b08 314 uint32_t aux = 0;
mcm 2:18c159179b08 315
mcm 2:18c159179b08 316
mcm 2:18c159179b08 317
mcm 2:18c159179b08 318 // Check the mode if it is HOLD MASTER MODE, then not generate a stop bit
mcm 2:18c159179b08 319 if ( myMode == SI7021_HOLD_MASTER_MODE ) {
mcm 2:18c159179b08 320 cmd = SI7021_MEASURE_TEMPERATURE_HOLD_MASTER_MODE;
mcm 2:18c159179b08 321 myI2C_stop = true;
mcm 2:18c159179b08 322 } else {
mcm 2:18c159179b08 323 cmd = SI7021_MEASURE_TEMPERATURE_NO_HOLD_MASTER_MODE;
mcm 2:18c159179b08 324 myI2C_stop = false;
mcm 2:18c159179b08 325 }
mcm 2:18c159179b08 326
mcm 2:18c159179b08 327
mcm 2:18c159179b08 328
mcm 2:18c159179b08 329 aux = _i2c.write ( _SI7021_Addr, &cmd, 1, myI2C_stop );
mcm 2:18c159179b08 330
mcm 2:18c159179b08 331
mcm 2:18c159179b08 332 // NOTE: The user has to respect the total conversion time!
mcm 2:18c159179b08 333
mcm 2:18c159179b08 334
mcm 2:18c159179b08 335 if ( aux == I2C_SUCCESS )
mcm 2:18c159179b08 336 return SI7021_SUCCESS;
mcm 2:18c159179b08 337 else
mcm 2:18c159179b08 338 return SI7021_FAILURE;
mcm 2:18c159179b08 339 }
mcm 2:18c159179b08 340
mcm 2:18c159179b08 341
mcm 2:18c159179b08 342
mcm 2:18c159179b08 343 /**
mcm 2:18c159179b08 344 * @brief SI7021_ReadTemperature ( SI7021_vector_data_t* )
mcm 2:18c159179b08 345 *
mcm 2:18c159179b08 346 * @details It reads the temperature.
mcm 2:18c159179b08 347 *
mcm 2:18c159179b08 348 * @param[in] myMode: HOLD/NO HOLD mode.
mcm 2:18c159179b08 349 *
mcm 2:18c159179b08 350 * @param[out] myTemperature: The current temperature
mcm 2:18c159179b08 351 *
mcm 2:18c159179b08 352 *
mcm 2:18c159179b08 353 * @return Status of SI7021_ReadTemperature.
mcm 2:18c159179b08 354 *
mcm 2:18c159179b08 355 *
mcm 2:18c159179b08 356 * @author Manuel Caballero
mcm 2:18c159179b08 357 * @date 5/February/2018
mcm 2:18c159179b08 358 * @version 5/February/2018 The ORIGIN
mcm 2:18c159179b08 359 * @pre SI7021_TriggerTemperature MUST be called first. This function does NOT
mcm 2:18c159179b08 360 * read CRC byte.
mcm 2:18c159179b08 361 * @warning N/A.
mcm 2:18c159179b08 362 */
mcm 2:18c159179b08 363 SI7021::SI7021_status_t SI7021::SI7021_ReadTemperature ( SI7021_vector_data_t* myTemperature )
mcm 2:18c159179b08 364 {
mcm 2:18c159179b08 365 char cmd[] = { 0, 0 };
mcm 2:18c159179b08 366 uint32_t aux = 0;
mcm 2:18c159179b08 367
mcm 2:18c159179b08 368
mcm 2:18c159179b08 369
mcm 2:18c159179b08 370
mcm 2:18c159179b08 371 aux = _i2c.read ( _SI7021_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 2:18c159179b08 372
mcm 2:18c159179b08 373
mcm 2:18c159179b08 374 // Check if the is a valid data
mcm 2:18c159179b08 375 if ( ( cmd[1] & 0x02 ) == 0x00 ) {
mcm 2:18c159179b08 376 // Parse the data
mcm 2:18c159179b08 377 myTemperature->Temperature = ( ( cmd[0] << 8 ) | cmd[1] );
mcm 2:18c159179b08 378 myTemperature->Temperature *= 175.72;
mcm 2:18c159179b08 379 myTemperature->Temperature /= 65536.0;
mcm 2:18c159179b08 380 myTemperature->Temperature -= 46.85;
mcm 2:18c159179b08 381 } else
mcm 2:18c159179b08 382 return SI7021_FAILURE;
mcm 2:18c159179b08 383
mcm 2:18c159179b08 384
mcm 2:18c159179b08 385
mcm 2:18c159179b08 386
mcm 2:18c159179b08 387
mcm 2:18c159179b08 388 if ( aux == I2C_SUCCESS )
mcm 2:18c159179b08 389 return SI7021_SUCCESS;
mcm 2:18c159179b08 390 else
mcm 2:18c159179b08 391 return SI7021_FAILURE;
mcm 2:18c159179b08 392 }
mcm 2:18c159179b08 393
mcm 2:18c159179b08 394
mcm 2:18c159179b08 395
mcm 2:18c159179b08 396 /**
mcm 2:18c159179b08 397 * @brief SI7021_ReadRawTemperatureFromRH ( SI7021_vector_data_t* )
mcm 2:18c159179b08 398 *
mcm 2:18c159179b08 399 * @details It reads the raw temperature.
mcm 2:18c159179b08 400 *
mcm 2:18c159179b08 401 * @param[in] N/A.
mcm 2:18c159179b08 402 *
mcm 2:18c159179b08 403 * @param[out] myTemperature: The current temperature
mcm 2:18c159179b08 404 *
mcm 2:18c159179b08 405 *
mcm 2:18c159179b08 406 * @return Status of SI7021_ReadRawTemperatureFromRH.
mcm 2:18c159179b08 407 *
mcm 2:18c159179b08 408 *
mcm 2:18c159179b08 409 * @author Manuel Caballero
mcm 2:18c159179b08 410 * @date 5/February/2018
mcm 2:18c159179b08 411 * @version 5/February/2018 The ORIGIN
mcm 2:18c159179b08 412 * @pre SI7021_TriggerHumidity MUST be called first.
mcm 2:18c159179b08 413 * @warning N/A.
mcm 2:18c159179b08 414 */
mcm 2:18c159179b08 415 SI7021::SI7021_status_t SI7021::SI7021_ReadRawTemperatureFromRH ( SI7021_vector_data_t* myTemperature )
mcm 2:18c159179b08 416 {
mcm 2:18c159179b08 417 char cmd[] = { SI7021_READ_TEMPERATURE_VALUE_FROM_PREVIOUS_RH_MEASUREMENT, 0 };
mcm 2:18c159179b08 418 uint32_t aux = 0;
mcm 2:18c159179b08 419
mcm 2:18c159179b08 420
mcm 2:18c159179b08 421
mcm 2:18c159179b08 422 aux = _i2c.write ( _SI7021_Addr, &cmd[0], 1, true );
mcm 2:18c159179b08 423 aux = _i2c.read ( _SI7021_Addr, &cmd[0], 2 );
mcm 2:18c159179b08 424
mcm 2:18c159179b08 425
mcm 2:18c159179b08 426 // Check if the is a valid data
mcm 2:18c159179b08 427 if ( ( cmd[1] & 0x02 ) == 0x00 ) {
mcm 2:18c159179b08 428 // Parse the data
mcm 2:18c159179b08 429 myTemperature->Temperature = ( ( cmd[0] << 8 ) | cmd[1] );
mcm 2:18c159179b08 430 } else
mcm 2:18c159179b08 431 return SI7021_FAILURE;
mcm 2:18c159179b08 432
mcm 2:18c159179b08 433
mcm 2:18c159179b08 434
mcm 2:18c159179b08 435
mcm 2:18c159179b08 436 if ( aux == I2C_SUCCESS )
mcm 2:18c159179b08 437 return SI7021_SUCCESS;
mcm 2:18c159179b08 438 else
mcm 2:18c159179b08 439 return SI7021_FAILURE;
mcm 2:18c159179b08 440 }
mcm 2:18c159179b08 441
mcm 2:18c159179b08 442
mcm 2:18c159179b08 443
mcm 2:18c159179b08 444 /**
mcm 2:18c159179b08 445 * @brief SI7021_ReadTemperatureFromRH ( SI7021_vector_data_t* )
mcm 2:18c159179b08 446 *
mcm 2:18c159179b08 447 * @details It reads the temperature.
mcm 2:18c159179b08 448 *
mcm 2:18c159179b08 449 * @param[in] N/A.
mcm 2:18c159179b08 450 *
mcm 2:18c159179b08 451 * @param[out] myTemperature: The current temperature
mcm 2:18c159179b08 452 *
mcm 2:18c159179b08 453 *
mcm 2:18c159179b08 454 * @return Status of SI7021_ReadTemperatureFromRH.
mcm 2:18c159179b08 455 *
mcm 2:18c159179b08 456 *
mcm 2:18c159179b08 457 * @author Manuel Caballero
mcm 2:18c159179b08 458 * @date 5/February/2018
mcm 2:18c159179b08 459 * @version 5/February/2018 The ORIGIN
mcm 2:18c159179b08 460 * @pre SI7021_TriggerHumidity MUST be called first.
mcm 2:18c159179b08 461 * @warning N/A.
mcm 2:18c159179b08 462 */
mcm 2:18c159179b08 463 SI7021::SI7021_status_t SI7021::SI7021_ReadTemperatureFromRH ( SI7021_vector_data_t* myTemperature )
mcm 2:18c159179b08 464 {
mcm 2:18c159179b08 465 char cmd[] = { SI7021_READ_TEMPERATURE_VALUE_FROM_PREVIOUS_RH_MEASUREMENT, 0 };
mcm 2:18c159179b08 466 uint32_t aux = 0;
mcm 2:18c159179b08 467
mcm 2:18c159179b08 468
mcm 2:18c159179b08 469
mcm 2:18c159179b08 470 aux = _i2c.write ( _SI7021_Addr, &cmd[0], 1, true );
mcm 2:18c159179b08 471 aux = _i2c.read ( _SI7021_Addr, &cmd[0], 2 );
mcm 2:18c159179b08 472
mcm 2:18c159179b08 473
mcm 2:18c159179b08 474 // Check if the is a valid data
mcm 2:18c159179b08 475 if ( ( cmd[1] & 0x02 ) == 0x00 ) {
mcm 2:18c159179b08 476 // Parse the data
mcm 2:18c159179b08 477 myTemperature->Temperature = ( ( cmd[0] << 8 ) | cmd[1] );
mcm 2:18c159179b08 478 myTemperature->Temperature *= 175.72;
mcm 2:18c159179b08 479 myTemperature->Temperature /= 65536.0;
mcm 2:18c159179b08 480 myTemperature->Temperature -= 46.85;
mcm 2:18c159179b08 481 } else
mcm 2:18c159179b08 482 return SI7021_FAILURE;
mcm 2:18c159179b08 483
mcm 2:18c159179b08 484
mcm 2:18c159179b08 485
mcm 2:18c159179b08 486
mcm 2:18c159179b08 487 if ( aux == I2C_SUCCESS )
mcm 2:18c159179b08 488 return SI7021_SUCCESS;
mcm 2:18c159179b08 489 else
mcm 2:18c159179b08 490 return SI7021_FAILURE;
mcm 2:18c159179b08 491 }
mcm 2:18c159179b08 492
mcm 2:18c159179b08 493
mcm 2:18c159179b08 494
mcm 2:18c159179b08 495 /**
mcm 2:18c159179b08 496 * @brief SI7021_TriggerHumidity ( SI7021_master_mode_t )
mcm 2:18c159179b08 497 *
mcm 2:18c159179b08 498 * @details It performs a new relative humidity measurement.
mcm 2:18c159179b08 499 *
mcm 2:18c159179b08 500 * @param[in] myMode: HOLD/NO HOLD MASTER mode.
mcm 2:18c159179b08 501 *
mcm 2:18c159179b08 502 * @param[out] N/A
mcm 2:18c159179b08 503 *
mcm 2:18c159179b08 504 *
mcm 2:18c159179b08 505 * @return Status of SI7021_TriggerHumidity.
mcm 2:18c159179b08 506 *
mcm 2:18c159179b08 507 *
mcm 2:18c159179b08 508 * @author Manuel Caballero
mcm 2:18c159179b08 509 * @date 5/February/2018
mcm 2:18c159179b08 510 * @version 5/February/2018 The ORIGIN
mcm 2:18c159179b08 511 * @pre Initiating a RH measurement will also automatically initiate a temperature measurement.
mcm 2:18c159179b08 512 * The total conversion time will be tCONV(RH) + tCONV(T).
mcm 2:18c159179b08 513 * @warning The user MUST respect the total conversion time.
mcm 2:18c159179b08 514 * 12-bit RH: 10ms ( 12ms max )
mcm 2:18c159179b08 515 * 11-bit RH: 5.8ms ( 7ms max )
mcm 2:18c159179b08 516 * 10-bit RH: 3.7ms ( 4.5ms max )
mcm 2:18c159179b08 517 * 8-bit RH: 2.6ms ( 3.1ms max )
mcm 2:18c159179b08 518 */
mcm 2:18c159179b08 519 SI7021::SI7021_status_t SI7021::SI7021_TriggerHumidity ( SI7021_master_mode_t myMode )
mcm 2:18c159179b08 520 {
mcm 2:18c159179b08 521 char cmd = myMode;
mcm 2:18c159179b08 522 uint32_t aux = 0;
mcm 2:18c159179b08 523 bool myI2C_stop = false;
mcm 2:18c159179b08 524
mcm 2:18c159179b08 525
mcm 2:18c159179b08 526
mcm 2:18c159179b08 527 // Check the mode if it is HOLD MASTER MODE, then not generate a stop bit
mcm 2:18c159179b08 528 if ( myMode == SI7021_HOLD_MASTER_MODE ) {
mcm 2:18c159179b08 529 cmd = SI7021_MEASURE_RELATIVE_HUMIDITY_HOLD_MASTER_MODE;
mcm 2:18c159179b08 530 myI2C_stop = true;
mcm 2:18c159179b08 531 } else {
mcm 2:18c159179b08 532 cmd = SI7021_MEASURE_RELATIVE_HUMIDITY_NO_HOLD_MASTER_MODE;
mcm 2:18c159179b08 533 myI2C_stop = false;
mcm 2:18c159179b08 534 }
mcm 2:18c159179b08 535
mcm 2:18c159179b08 536
mcm 2:18c159179b08 537 aux = _i2c.write ( _SI7021_Addr, &cmd, 1, myI2C_stop );
mcm 2:18c159179b08 538
mcm 2:18c159179b08 539
mcm 2:18c159179b08 540 // NOTE: The user has to respect the total conversion time!
mcm 2:18c159179b08 541
mcm 2:18c159179b08 542
mcm 2:18c159179b08 543 if ( aux == I2C_SUCCESS )
mcm 2:18c159179b08 544 return SI7021_SUCCESS;
mcm 2:18c159179b08 545 else
mcm 2:18c159179b08 546 return SI7021_FAILURE;
mcm 2:18c159179b08 547 }
mcm 2:18c159179b08 548
mcm 2:18c159179b08 549
mcm 2:18c159179b08 550
mcm 2:18c159179b08 551 /**
mcm 2:18c159179b08 552 * @brief SI7021_ReadHumidity ( SI7021_vector_data_t* )
mcm 2:18c159179b08 553 *
mcm 2:18c159179b08 554 * @details It reads the relative humidity.
mcm 2:18c159179b08 555 *
mcm 2:18c159179b08 556 * @param[in] N/A.
mcm 2:18c159179b08 557 *
mcm 2:18c159179b08 558 * @param[out] myHumidity: The current HUMIDITY
mcm 2:18c159179b08 559 *
mcm 2:18c159179b08 560 *
mcm 2:18c159179b08 561 * @return Status of SI7021_ReadHumidity.
mcm 2:18c159179b08 562 *
mcm 2:18c159179b08 563 *
mcm 2:18c159179b08 564 * @author Manuel Caballero
mcm 2:18c159179b08 565 * @date 5/February/2018
mcm 2:18c159179b08 566 * @version 5/February/2018 The ORIGIN
mcm 2:18c159179b08 567 * @pre SI7021_TriggerHumidity MUST be called first. This function does NOT
mcm 2:18c159179b08 568 * read CRC byte.
mcm 2:18c159179b08 569 * @warning N/A.
mcm 2:18c159179b08 570 */
mcm 2:18c159179b08 571 SI7021::SI7021_status_t SI7021::SI7021_ReadHumidity ( SI7021_vector_data_t* myHumidity )
mcm 2:18c159179b08 572 {
mcm 2:18c159179b08 573 char cmd[] = { 0, 0 };
mcm 2:18c159179b08 574 uint32_t aux = 0;
mcm 2:18c159179b08 575
mcm 2:18c159179b08 576
mcm 2:18c159179b08 577
mcm 2:18c159179b08 578 aux = _i2c.read ( _SI7021_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 2:18c159179b08 579
mcm 2:18c159179b08 580
mcm 2:18c159179b08 581 // Check if the is a valid data
mcm 2:18c159179b08 582 if ( ( cmd[1] & 0x03 ) == 0x02 ) {
mcm 2:18c159179b08 583 // Parse the data
mcm 2:18c159179b08 584 myHumidity->RelativeHumidity = ( ( cmd[0] << 8 ) | cmd[1] );
mcm 2:18c159179b08 585 myHumidity->RelativeHumidity *= 125.0;
mcm 2:18c159179b08 586 myHumidity->RelativeHumidity /= 65536.0;
mcm 2:18c159179b08 587 myHumidity->RelativeHumidity -= 6.0;
mcm 2:18c159179b08 588 } else
mcm 2:18c159179b08 589 return SI7021_FAILURE;
mcm 2:18c159179b08 590
mcm 2:18c159179b08 591
mcm 2:18c159179b08 592
mcm 2:18c159179b08 593
mcm 2:18c159179b08 594 if ( aux == I2C_SUCCESS )
mcm 2:18c159179b08 595 return SI7021_SUCCESS;
mcm 2:18c159179b08 596 else
mcm 2:18c159179b08 597 return SI7021_FAILURE;
mcm 2:18c159179b08 598 }
mcm 2:18c159179b08 599
mcm 2:18c159179b08 600
mcm 2:18c159179b08 601
mcm 2:18c159179b08 602 /**
mcm 2:18c159179b08 603 * @brief SI7021_ReadRawHumidity ( SI7021_vector_data_t* )
mcm 2:18c159179b08 604 *
mcm 2:18c159179b08 605 * @details It reads the raw relative humidity.
mcm 2:18c159179b08 606 *
mcm 2:18c159179b08 607 * @param[in] N/A.
mcm 2:18c159179b08 608 *
mcm 2:18c159179b08 609 * @param[out] myHumidity: The current HUMIDITY
mcm 2:18c159179b08 610 *
mcm 2:18c159179b08 611 *
mcm 2:18c159179b08 612 * @return Status of SI7021_ReadRawHumidity.
mcm 2:18c159179b08 613 *
mcm 2:18c159179b08 614 *
mcm 2:18c159179b08 615 * @author Manuel Caballero
mcm 2:18c159179b08 616 * @date 5/February/2018
mcm 2:18c159179b08 617 * @version 5/February/2018 The ORIGIN
mcm 2:18c159179b08 618 * @pre SI7021_TriggerHumidity MUST be called first. This function does NOT
mcm 2:18c159179b08 619 * read CRC byte.
mcm 2:18c159179b08 620 * @warning N/A.
mcm 2:18c159179b08 621 */
mcm 2:18c159179b08 622 SI7021::SI7021_status_t SI7021::SI7021_ReadRawHumidity ( SI7021_vector_data_t* myHumidity )
mcm 2:18c159179b08 623 {
mcm 2:18c159179b08 624 char cmd[] = { 0, 0 };
mcm 2:18c159179b08 625 uint32_t aux = 0;
mcm 2:18c159179b08 626
mcm 2:18c159179b08 627
mcm 2:18c159179b08 628
mcm 2:18c159179b08 629 aux = _i2c.read ( _SI7021_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 2:18c159179b08 630
mcm 2:18c159179b08 631
mcm 2:18c159179b08 632 // Check if the is a valid data
mcm 2:18c159179b08 633 if ( ( cmd[1] & 0x03 ) == 0x02 ) {
mcm 2:18c159179b08 634 // Parse the data
mcm 2:18c159179b08 635 myHumidity->RelativeHumidity = ( ( cmd[0] << 8 ) | cmd[1] );
mcm 2:18c159179b08 636 } else
mcm 2:18c159179b08 637 return SI7021_FAILURE;
mcm 2:18c159179b08 638
mcm 2:18c159179b08 639
mcm 2:18c159179b08 640
mcm 2:18c159179b08 641
mcm 2:18c159179b08 642 if ( aux == I2C_SUCCESS )
mcm 2:18c159179b08 643 return SI7021_SUCCESS;
mcm 2:18c159179b08 644 else
mcm 2:18c159179b08 645 return SI7021_FAILURE;
mcm 2:18c159179b08 646 }
mcm 2:18c159179b08 647
mcm 2:18c159179b08 648
mcm 2:18c159179b08 649
mcm 2:18c159179b08 650 /**
mcm 2:18c159179b08 651 * @brief SI7021_GetBatteryStatus ( SI7021_vector_data_t* )
mcm 2:18c159179b08 652 *
mcm 2:18c159179b08 653 * @details It reads the raw relative humidity.
mcm 2:18c159179b08 654 *
mcm 2:18c159179b08 655 * @param[in] N/A.
mcm 2:18c159179b08 656 *
mcm 2:18c159179b08 657 * @param[out] myBatteryStatus: The current battery status
mcm 2:18c159179b08 658 *
mcm 2:18c159179b08 659 *
mcm 2:18c159179b08 660 * @return Status of SI7021_GetBatteryStatus.
mcm 2:18c159179b08 661 *
mcm 2:18c159179b08 662 *
mcm 2:18c159179b08 663 * @author Manuel Caballero
mcm 2:18c159179b08 664 * @date 5/February/2018
mcm 2:18c159179b08 665 * @version 5/February/2018 The ORIGIN
mcm 2:18c159179b08 666 * @pre N/A.
mcm 2:18c159179b08 667 * @warning N/A.
mcm 2:18c159179b08 668 */
mcm 2:18c159179b08 669 SI7021::SI7021_status_t SI7021::SI7021_GetBatteryStatus ( SI7021_vector_data_t* myBatteryStatus )
mcm 2:18c159179b08 670 {
mcm 2:18c159179b08 671 char cmd = SI7021_READ_RH_T_USER_REGISTER_1;
mcm 2:18c159179b08 672 uint32_t aux = 0;
mcm 2:18c159179b08 673
mcm 2:18c159179b08 674
mcm 2:18c159179b08 675 aux = _i2c.write ( _SI7021_Addr, &cmd, 1, true );
mcm 2:18c159179b08 676 aux = _i2c.read ( _SI7021_Addr, &cmd, 1 );
mcm 2:18c159179b08 677
mcm 2:18c159179b08 678
mcm 2:18c159179b08 679 myBatteryStatus->BatteryStatus = ( SI7021_vdds_status_t )( cmd & SI7021_VDDS_STATUS_MASK );
mcm 2:18c159179b08 680
mcm 2:18c159179b08 681
mcm 2:18c159179b08 682
mcm 2:18c159179b08 683
mcm 2:18c159179b08 684
mcm 2:18c159179b08 685 if ( aux == I2C_SUCCESS )
mcm 2:18c159179b08 686 return SI7021_SUCCESS;
mcm 2:18c159179b08 687 else
mcm 2:18c159179b08 688 return SI7021_FAILURE;
mcm 2:18c159179b08 689 }