Committer:
mcm
Date:
Mon Feb 05 12:55:05 2018 +0000
Revision:
5:492df2322044
Parent:
4:57ca557b109d
All temperature functions were fixed, now it works as expected.

Who changed what in which revision?

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