Digital Humidity Sensor SHT2x (RH/T)
SHT2X.cpp@2:5893455b8c6c, 2018-09-04 (annotated)
- Committer:
- mcm
- Date:
- Tue Sep 04 11:07:22 2018 +0000
- Revision:
- 2:5893455b8c6c
- Parent:
- 1:9f1fcd1e4c9c
This driver was completed and tested ( NUCLEO-L152RE ), it works as expected.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mcm | 1:9f1fcd1e4c9c | 1 | /** |
mcm | 2:5893455b8c6c | 2 | * @brief SHT2X.cpp |
mcm | 1:9f1fcd1e4c9c | 3 | * @details Humidity and Temperature Sensor IC. |
mcm | 1:9f1fcd1e4c9c | 4 | * Functions file. |
mcm | 1:9f1fcd1e4c9c | 5 | * |
mcm | 1:9f1fcd1e4c9c | 6 | * |
mcm | 1:9f1fcd1e4c9c | 7 | * @return N/A |
mcm | 1:9f1fcd1e4c9c | 8 | * |
mcm | 1:9f1fcd1e4c9c | 9 | * @author Manuel Caballero |
mcm | 1:9f1fcd1e4c9c | 10 | * @date 3/September/2018 |
mcm | 1:9f1fcd1e4c9c | 11 | * @version 3/September/2018 The ORIGIN |
mcm | 1:9f1fcd1e4c9c | 12 | * @pre N/A |
mcm | 1:9f1fcd1e4c9c | 13 | * @warning N/A |
mcm | 1:9f1fcd1e4c9c | 14 | * @pre This code belongs to Nimbus Centre ( http://www.nimbus.cit.ie ). |
mcm | 1:9f1fcd1e4c9c | 15 | */ |
mcm | 1:9f1fcd1e4c9c | 16 | |
mcm | 1:9f1fcd1e4c9c | 17 | #include "SHT2X.h" |
mcm | 1:9f1fcd1e4c9c | 18 | |
mcm | 1:9f1fcd1e4c9c | 19 | |
mcm | 1:9f1fcd1e4c9c | 20 | SHT2X::SHT2X ( PinName sda, PinName scl, uint32_t addr, uint32_t freq ) |
mcm | 1:9f1fcd1e4c9c | 21 | : _i2c ( sda, scl ) |
mcm | 1:9f1fcd1e4c9c | 22 | , _SHT2X_Addr ( addr ) |
mcm | 1:9f1fcd1e4c9c | 23 | { |
mcm | 1:9f1fcd1e4c9c | 24 | _i2c.frequency( freq ); |
mcm | 1:9f1fcd1e4c9c | 25 | } |
mcm | 1:9f1fcd1e4c9c | 26 | |
mcm | 1:9f1fcd1e4c9c | 27 | |
mcm | 1:9f1fcd1e4c9c | 28 | SHT2X::~SHT2X() |
mcm | 1:9f1fcd1e4c9c | 29 | { |
mcm | 1:9f1fcd1e4c9c | 30 | } |
mcm | 1:9f1fcd1e4c9c | 31 | |
mcm | 1:9f1fcd1e4c9c | 32 | |
mcm | 1:9f1fcd1e4c9c | 33 | |
mcm | 1:9f1fcd1e4c9c | 34 | /** |
mcm | 1:9f1fcd1e4c9c | 35 | * @brief SHT2X_Conf ( SHT2X_measurement_resolution_t , SHT2X_on_chip_heater_t ) |
mcm | 1:9f1fcd1e4c9c | 36 | * @details It configures the SHT2X device. |
mcm | 1:9f1fcd1e4c9c | 37 | * |
mcm | 1:9f1fcd1e4c9c | 38 | * @param[in] myResolution: SHT2X Resolution. |
mcm | 1:9f1fcd1e4c9c | 39 | * @param[in] myHeater: SHT2X Heater EN/Abled or Disabled. |
mcm | 1:9f1fcd1e4c9c | 40 | * |
mcm | 1:9f1fcd1e4c9c | 41 | * @param[out] N/A |
mcm | 1:9f1fcd1e4c9c | 42 | * |
mcm | 1:9f1fcd1e4c9c | 43 | * |
mcm | 1:9f1fcd1e4c9c | 44 | * @return Status of SHT2X_Init. |
mcm | 1:9f1fcd1e4c9c | 45 | * |
mcm | 1:9f1fcd1e4c9c | 46 | * @author Manuel Caballero |
mcm | 1:9f1fcd1e4c9c | 47 | * @date 3/September/2018 |
mcm | 1:9f1fcd1e4c9c | 48 | * @version 3/September/2018 The ORIGIN |
mcm | 1:9f1fcd1e4c9c | 49 | * @pre N/A |
mcm | 1:9f1fcd1e4c9c | 50 | * @warning N/A. |
mcm | 1:9f1fcd1e4c9c | 51 | */ |
mcm | 1:9f1fcd1e4c9c | 52 | SHT2X::SHT2X_status_t SHT2X::SHT2X_Conf ( SHT2X_measurement_resolution_t myResolution, SHT2X_on_chip_heater_t myHeater ) |
mcm | 1:9f1fcd1e4c9c | 53 | { |
mcm | 1:9f1fcd1e4c9c | 54 | char cmd[] = { SHT2X_READ_USER_REGISTER, 0 }; |
mcm | 1:9f1fcd1e4c9c | 55 | uint32_t aux; |
mcm | 1:9f1fcd1e4c9c | 56 | |
mcm | 1:9f1fcd1e4c9c | 57 | |
mcm | 1:9f1fcd1e4c9c | 58 | /* |
mcm | 1:9f1fcd1e4c9c | 59 | Reserved bits must not be changed. Therefore, for any writing to user register, default values of reserved bits must be read first |
mcm | 1:9f1fcd1e4c9c | 60 | Datasheet: 5.6. User register p.19/14. |
mcm | 1:9f1fcd1e4c9c | 61 | */ |
mcm | 1:9f1fcd1e4c9c | 62 | aux = _i2c.write ( _SHT2X_Addr, &cmd[0], 1U, true ); |
mcm | 1:9f1fcd1e4c9c | 63 | aux = _i2c.read ( _SHT2X_Addr, &cmd[1], 1U ); |
mcm | 1:9f1fcd1e4c9c | 64 | |
mcm | 1:9f1fcd1e4c9c | 65 | cmd[1] &= ~( USER_REGISTER_RESOLUTION_MASK | USER_REGISTER_STATUS_END_BATTERY_MASK | USER_REGISTER_HEATER_MASK | USER_REGISTER_OTP_MASK ); |
mcm | 1:9f1fcd1e4c9c | 66 | cmd[1] |= ( myResolution | myHeater | USER_REGISTER_OTP_DISABLED ); |
mcm | 1:9f1fcd1e4c9c | 67 | cmd[0] = SHT2X_WRITE_USER_REGISTER; |
mcm | 1:9f1fcd1e4c9c | 68 | |
mcm | 1:9f1fcd1e4c9c | 69 | aux = _i2c.write ( _SHT2X_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false ); |
mcm | 1:9f1fcd1e4c9c | 70 | |
mcm | 1:9f1fcd1e4c9c | 71 | |
mcm | 1:9f1fcd1e4c9c | 72 | |
mcm | 1:9f1fcd1e4c9c | 73 | |
mcm | 1:9f1fcd1e4c9c | 74 | if ( aux == I2C_SUCCESS ) { |
mcm | 1:9f1fcd1e4c9c | 75 | return SHT2X_SUCCESS; |
mcm | 1:9f1fcd1e4c9c | 76 | } else { |
mcm | 1:9f1fcd1e4c9c | 77 | return SHT2X_FAILURE; |
mcm | 1:9f1fcd1e4c9c | 78 | } |
mcm | 1:9f1fcd1e4c9c | 79 | } |
mcm | 1:9f1fcd1e4c9c | 80 | |
mcm | 1:9f1fcd1e4c9c | 81 | |
mcm | 1:9f1fcd1e4c9c | 82 | |
mcm | 1:9f1fcd1e4c9c | 83 | /** |
mcm | 1:9f1fcd1e4c9c | 84 | * @brief SHT2X_SoftReset ( void ) |
mcm | 1:9f1fcd1e4c9c | 85 | * @details Rebooting the SHT2X sensor switching the power off and on again. |
mcm | 1:9f1fcd1e4c9c | 86 | * |
mcm | 1:9f1fcd1e4c9c | 87 | * @param[in] N/A. |
mcm | 1:9f1fcd1e4c9c | 88 | * |
mcm | 1:9f1fcd1e4c9c | 89 | * @param[out] N/A |
mcm | 1:9f1fcd1e4c9c | 90 | * |
mcm | 1:9f1fcd1e4c9c | 91 | * |
mcm | 1:9f1fcd1e4c9c | 92 | * @return Status of SHT2X_SoftReset. |
mcm | 1:9f1fcd1e4c9c | 93 | * |
mcm | 1:9f1fcd1e4c9c | 94 | * @author Manuel Caballero |
mcm | 1:9f1fcd1e4c9c | 95 | * @date 3/September/2018 |
mcm | 1:9f1fcd1e4c9c | 96 | * @version 3/September/2018 The ORIGIN |
mcm | 1:9f1fcd1e4c9c | 97 | * @pre N/A |
mcm | 1:9f1fcd1e4c9c | 98 | * @warning The soft reset takes less than 15ms. The user MUST take this into account. |
mcm | 1:9f1fcd1e4c9c | 99 | */ |
mcm | 1:9f1fcd1e4c9c | 100 | SHT2X::SHT2X_status_t SHT2X::SHT2X_SoftReset ( void ) |
mcm | 1:9f1fcd1e4c9c | 101 | { |
mcm | 1:9f1fcd1e4c9c | 102 | char cmd = SHT2X_SOFT_RESET; |
mcm | 1:9f1fcd1e4c9c | 103 | uint32_t aux; |
mcm | 1:9f1fcd1e4c9c | 104 | |
mcm | 1:9f1fcd1e4c9c | 105 | |
mcm | 1:9f1fcd1e4c9c | 106 | aux = _i2c.write ( _SHT2X_Addr, &cmd, 1U, false ); |
mcm | 1:9f1fcd1e4c9c | 107 | |
mcm | 1:9f1fcd1e4c9c | 108 | |
mcm | 1:9f1fcd1e4c9c | 109 | if ( aux == I2C_SUCCESS ) { |
mcm | 1:9f1fcd1e4c9c | 110 | return SHT2X_SUCCESS; |
mcm | 1:9f1fcd1e4c9c | 111 | } else { |
mcm | 1:9f1fcd1e4c9c | 112 | return SHT2X_FAILURE; |
mcm | 1:9f1fcd1e4c9c | 113 | } |
mcm | 1:9f1fcd1e4c9c | 114 | } |
mcm | 1:9f1fcd1e4c9c | 115 | |
mcm | 1:9f1fcd1e4c9c | 116 | |
mcm | 1:9f1fcd1e4c9c | 117 | /** |
mcm | 1:9f1fcd1e4c9c | 118 | * @brief SHT2X_TriggerTemperature ( SHT2X_master_mode_t ) |
mcm | 1:9f1fcd1e4c9c | 119 | * @details It triggers a new temperature measurement. |
mcm | 1:9f1fcd1e4c9c | 120 | * |
mcm | 1:9f1fcd1e4c9c | 121 | * @param[in] myMode: Hold/No Hold mode. |
mcm | 1:9f1fcd1e4c9c | 122 | * |
mcm | 1:9f1fcd1e4c9c | 123 | * @param[out] N/A |
mcm | 1:9f1fcd1e4c9c | 124 | * |
mcm | 1:9f1fcd1e4c9c | 125 | * |
mcm | 1:9f1fcd1e4c9c | 126 | * @return Status of SHT2X_TriggerTemperature. |
mcm | 1:9f1fcd1e4c9c | 127 | * |
mcm | 1:9f1fcd1e4c9c | 128 | * @author Manuel Caballero |
mcm | 1:9f1fcd1e4c9c | 129 | * @date 3/September/2018 |
mcm | 1:9f1fcd1e4c9c | 130 | * @version 3/September/2018 The ORIGIN |
mcm | 1:9f1fcd1e4c9c | 131 | * @pre N/A |
mcm | 1:9f1fcd1e4c9c | 132 | * @warning The user MUST respect the total conversion time. |
mcm | 1:9f1fcd1e4c9c | 133 | * 14-bit temperature: 66ms ( 85ms max ) |
mcm | 1:9f1fcd1e4c9c | 134 | * 13-bit temperature: 33ms ( 43ms max ) |
mcm | 1:9f1fcd1e4c9c | 135 | * 12-bit temperature: 17ms ( 22ms max ) |
mcm | 1:9f1fcd1e4c9c | 136 | * 11-bit temperature: 9ms ( 11ms max ) |
mcm | 1:9f1fcd1e4c9c | 137 | */ |
mcm | 1:9f1fcd1e4c9c | 138 | SHT2X::SHT2X_status_t SHT2X::SHT2X_TriggerTemperature ( SHT2X_master_mode_t myMode ) |
mcm | 1:9f1fcd1e4c9c | 139 | { |
mcm | 1:9f1fcd1e4c9c | 140 | char cmd = 0; |
mcm | 1:9f1fcd1e4c9c | 141 | bool myI2C_stop = false; |
mcm | 1:9f1fcd1e4c9c | 142 | uint32_t aux; |
mcm | 1:9f1fcd1e4c9c | 143 | |
mcm | 1:9f1fcd1e4c9c | 144 | |
mcm | 1:9f1fcd1e4c9c | 145 | /* Check the mode if it is HOLD MASTER MODE, if so, not to generate a stop bit */ |
mcm | 1:9f1fcd1e4c9c | 146 | if ( myMode == SHT2X_HOLD_MASTER_MODE ) { |
mcm | 1:9f1fcd1e4c9c | 147 | cmd = SHT2X_TRIGGER_TEMPERATURE_MEASUREMENT_HOLD_MASTER; |
mcm | 1:9f1fcd1e4c9c | 148 | myI2C_stop = true; |
mcm | 1:9f1fcd1e4c9c | 149 | } else { |
mcm | 1:9f1fcd1e4c9c | 150 | cmd = SHT2X_TRIGGER_TEMPERATURE_MEASUREMENT_NO_HOLD_MASTER; |
mcm | 1:9f1fcd1e4c9c | 151 | myI2C_stop = false; |
mcm | 1:9f1fcd1e4c9c | 152 | } |
mcm | 1:9f1fcd1e4c9c | 153 | |
mcm | 1:9f1fcd1e4c9c | 154 | |
mcm | 1:9f1fcd1e4c9c | 155 | aux = _i2c.write ( _SHT2X_Addr, &cmd, 1U, myI2C_stop ); |
mcm | 1:9f1fcd1e4c9c | 156 | |
mcm | 1:9f1fcd1e4c9c | 157 | |
mcm | 1:9f1fcd1e4c9c | 158 | /* NOTE: The user has to respect the total conversion time! */ |
mcm | 1:9f1fcd1e4c9c | 159 | |
mcm | 1:9f1fcd1e4c9c | 160 | |
mcm | 1:9f1fcd1e4c9c | 161 | |
mcm | 1:9f1fcd1e4c9c | 162 | |
mcm | 1:9f1fcd1e4c9c | 163 | if ( aux == I2C_SUCCESS ) { |
mcm | 1:9f1fcd1e4c9c | 164 | return SHT2X_SUCCESS; |
mcm | 1:9f1fcd1e4c9c | 165 | } else { |
mcm | 1:9f1fcd1e4c9c | 166 | return SHT2X_FAILURE; |
mcm | 1:9f1fcd1e4c9c | 167 | } |
mcm | 1:9f1fcd1e4c9c | 168 | } |
mcm | 1:9f1fcd1e4c9c | 169 | |
mcm | 1:9f1fcd1e4c9c | 170 | |
mcm | 1:9f1fcd1e4c9c | 171 | /** |
mcm | 1:9f1fcd1e4c9c | 172 | * @brief SHT2X_ReadTemperature ( SHT2X_vector_data_t* ) |
mcm | 1:9f1fcd1e4c9c | 173 | * @details It reads a new temperature measurement. |
mcm | 1:9f1fcd1e4c9c | 174 | * |
mcm | 1:9f1fcd1e4c9c | 175 | * @param[in] N/A |
mcm | 1:9f1fcd1e4c9c | 176 | * |
mcm | 1:9f1fcd1e4c9c | 177 | * @param[out] myTemperature: Variable to store the temperature. |
mcm | 1:9f1fcd1e4c9c | 178 | * |
mcm | 1:9f1fcd1e4c9c | 179 | * |
mcm | 1:9f1fcd1e4c9c | 180 | * @return Status of SHT2X_ReadTemperature. |
mcm | 1:9f1fcd1e4c9c | 181 | * |
mcm | 1:9f1fcd1e4c9c | 182 | * @author Manuel Caballero |
mcm | 1:9f1fcd1e4c9c | 183 | * @date 3/September/2018 |
mcm | 1:9f1fcd1e4c9c | 184 | * @version 3/September/2018 The ORIGIN |
mcm | 1:9f1fcd1e4c9c | 185 | * @pre CRC is NOT taken into account. |
mcm | 1:9f1fcd1e4c9c | 186 | * @warning The measuring time depends on the chosen resolution. The user MUST take this into account. |
mcm | 1:9f1fcd1e4c9c | 187 | * @warning SHT2X_TriggerTemperature MUST be call before. |
mcm | 1:9f1fcd1e4c9c | 188 | */ |
mcm | 1:9f1fcd1e4c9c | 189 | SHT2X::SHT2X_status_t SHT2X::SHT2X_ReadTemperature ( SHT2X_vector_data_t* myTemperature ) |
mcm | 1:9f1fcd1e4c9c | 190 | { |
mcm | 1:9f1fcd1e4c9c | 191 | char cmd[] = { 0, 0, 0 }; |
mcm | 1:9f1fcd1e4c9c | 192 | uint32_t aux; |
mcm | 1:9f1fcd1e4c9c | 193 | |
mcm | 1:9f1fcd1e4c9c | 194 | |
mcm | 1:9f1fcd1e4c9c | 195 | /* Read the temperature */ |
mcm | 1:9f1fcd1e4c9c | 196 | aux = _i2c.read ( _SHT2X_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) ); |
mcm | 1:9f1fcd1e4c9c | 197 | |
mcm | 1:9f1fcd1e4c9c | 198 | /* Parse the data */ |
mcm | 1:9f1fcd1e4c9c | 199 | myTemperature->Temperature = ( ( cmd[0] << 8U ) | cmd[1] ); |
mcm | 1:9f1fcd1e4c9c | 200 | myTemperature->Temperature /= 65536.0f; |
mcm | 1:9f1fcd1e4c9c | 201 | myTemperature->Temperature *= 175.72f; |
mcm | 1:9f1fcd1e4c9c | 202 | myTemperature->Temperature -= 46.85f; |
mcm | 1:9f1fcd1e4c9c | 203 | |
mcm | 1:9f1fcd1e4c9c | 204 | |
mcm | 1:9f1fcd1e4c9c | 205 | |
mcm | 1:9f1fcd1e4c9c | 206 | if ( aux == I2C_SUCCESS ) { |
mcm | 1:9f1fcd1e4c9c | 207 | return SHT2X_SUCCESS; |
mcm | 1:9f1fcd1e4c9c | 208 | } else { |
mcm | 1:9f1fcd1e4c9c | 209 | return SHT2X_FAILURE; |
mcm | 1:9f1fcd1e4c9c | 210 | } |
mcm | 1:9f1fcd1e4c9c | 211 | } |
mcm | 1:9f1fcd1e4c9c | 212 | |
mcm | 1:9f1fcd1e4c9c | 213 | |
mcm | 1:9f1fcd1e4c9c | 214 | |
mcm | 1:9f1fcd1e4c9c | 215 | /** |
mcm | 1:9f1fcd1e4c9c | 216 | * @brief SHT2X_ReadRawTemperature ( SHT2X_vector_data_t* ) |
mcm | 1:9f1fcd1e4c9c | 217 | * @details It reads a new raw temperature measurement. |
mcm | 1:9f1fcd1e4c9c | 218 | * |
mcm | 1:9f1fcd1e4c9c | 219 | * @param[in] N/A |
mcm | 1:9f1fcd1e4c9c | 220 | * |
mcm | 1:9f1fcd1e4c9c | 221 | * @param[out] myRawTemperature: Variable to store the temperature. |
mcm | 1:9f1fcd1e4c9c | 222 | * |
mcm | 1:9f1fcd1e4c9c | 223 | * |
mcm | 1:9f1fcd1e4c9c | 224 | * @return Status of SHT2X_ReadTemperature. |
mcm | 1:9f1fcd1e4c9c | 225 | * |
mcm | 1:9f1fcd1e4c9c | 226 | * @author Manuel Caballero |
mcm | 1:9f1fcd1e4c9c | 227 | * @date 3/September/2018 |
mcm | 1:9f1fcd1e4c9c | 228 | * @version 3/September/2018 The ORIGIN |
mcm | 1:9f1fcd1e4c9c | 229 | * @pre CRC is NOT taken into account. |
mcm | 1:9f1fcd1e4c9c | 230 | * @warning The measuring time depends on the chosen resolution. The user MUST take this into account. |
mcm | 1:9f1fcd1e4c9c | 231 | * @warning No Hold Master is ONLY implemented. |
mcm | 1:9f1fcd1e4c9c | 232 | * @warning SHT2X_TriggerTemperature MUST be call before. |
mcm | 1:9f1fcd1e4c9c | 233 | */ |
mcm | 1:9f1fcd1e4c9c | 234 | SHT2X::SHT2X_status_t SHT2X::SHT2X_ReadRawTemperature ( SHT2X_vector_data_t* myRawTemperature ) |
mcm | 1:9f1fcd1e4c9c | 235 | { |
mcm | 1:9f1fcd1e4c9c | 236 | char cmd[] = { 0, 0, 0 }; |
mcm | 1:9f1fcd1e4c9c | 237 | uint32_t aux; |
mcm | 1:9f1fcd1e4c9c | 238 | |
mcm | 1:9f1fcd1e4c9c | 239 | |
mcm | 1:9f1fcd1e4c9c | 240 | /* Read the temperature */ |
mcm | 1:9f1fcd1e4c9c | 241 | aux = _i2c.read ( _SHT2X_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) ); |
mcm | 1:9f1fcd1e4c9c | 242 | |
mcm | 1:9f1fcd1e4c9c | 243 | /* Parse the data */ |
mcm | 1:9f1fcd1e4c9c | 244 | myRawTemperature->RawTemperature = ( ( cmd[0] << 8U ) | cmd[1] ); |
mcm | 1:9f1fcd1e4c9c | 245 | |
mcm | 1:9f1fcd1e4c9c | 246 | |
mcm | 1:9f1fcd1e4c9c | 247 | |
mcm | 1:9f1fcd1e4c9c | 248 | |
mcm | 1:9f1fcd1e4c9c | 249 | if ( aux == I2C_SUCCESS ) { |
mcm | 1:9f1fcd1e4c9c | 250 | return SHT2X_SUCCESS; |
mcm | 1:9f1fcd1e4c9c | 251 | } else { |
mcm | 1:9f1fcd1e4c9c | 252 | return SHT2X_FAILURE; |
mcm | 1:9f1fcd1e4c9c | 253 | } |
mcm | 1:9f1fcd1e4c9c | 254 | } |
mcm | 1:9f1fcd1e4c9c | 255 | |
mcm | 1:9f1fcd1e4c9c | 256 | |
mcm | 1:9f1fcd1e4c9c | 257 | /** |
mcm | 1:9f1fcd1e4c9c | 258 | * @brief SHT2X_TriggerHumidity ( SHT2X_master_mode_t ) |
mcm | 1:9f1fcd1e4c9c | 259 | * @details It triggers a new humidity measurement. |
mcm | 1:9f1fcd1e4c9c | 260 | * |
mcm | 1:9f1fcd1e4c9c | 261 | * @param[in] myMode: Hold/No Hold mode. |
mcm | 1:9f1fcd1e4c9c | 262 | * |
mcm | 1:9f1fcd1e4c9c | 263 | * @param[out] N/A |
mcm | 1:9f1fcd1e4c9c | 264 | * |
mcm | 1:9f1fcd1e4c9c | 265 | * |
mcm | 1:9f1fcd1e4c9c | 266 | * @return Status of SHT2X_TriggerHumidity. |
mcm | 1:9f1fcd1e4c9c | 267 | * |
mcm | 1:9f1fcd1e4c9c | 268 | * @author Manuel Caballero |
mcm | 1:9f1fcd1e4c9c | 269 | * @date 3/September/2018 |
mcm | 1:9f1fcd1e4c9c | 270 | * @version 3/September/2018 The ORIGIN |
mcm | 1:9f1fcd1e4c9c | 271 | * @pre N/A |
mcm | 1:9f1fcd1e4c9c | 272 | * @warning The user MUST respect the total conversion time. |
mcm | 1:9f1fcd1e4c9c | 273 | * 12-bit RH: 22ms ( 29ms max ) |
mcm | 1:9f1fcd1e4c9c | 274 | * 11-bit RH: 12ms ( 15ms max ) |
mcm | 1:9f1fcd1e4c9c | 275 | * 10-bit RH: 7ms ( 9ms max ) |
mcm | 1:9f1fcd1e4c9c | 276 | * 8-bit RH: 3ms ( 4ms max ) |
mcm | 1:9f1fcd1e4c9c | 277 | */ |
mcm | 1:9f1fcd1e4c9c | 278 | SHT2X::SHT2X_status_t SHT2X::SHT2X_TriggerHumidity ( SHT2X_master_mode_t myMode ) |
mcm | 1:9f1fcd1e4c9c | 279 | { |
mcm | 1:9f1fcd1e4c9c | 280 | char cmd = 0; |
mcm | 1:9f1fcd1e4c9c | 281 | bool myI2C_stop = false; |
mcm | 1:9f1fcd1e4c9c | 282 | uint32_t aux; |
mcm | 1:9f1fcd1e4c9c | 283 | |
mcm | 1:9f1fcd1e4c9c | 284 | |
mcm | 1:9f1fcd1e4c9c | 285 | /* Check the mode if it is HOLD MASTER MODE, then not generate a stop bit */ |
mcm | 1:9f1fcd1e4c9c | 286 | if ( myMode == SHT2X_HOLD_MASTER_MODE ) { |
mcm | 1:9f1fcd1e4c9c | 287 | cmd = SHT2X_TRIGGER_HUMIDITY_MEASUREMENT_HOLD_MASTER; |
mcm | 1:9f1fcd1e4c9c | 288 | myI2C_stop = true; |
mcm | 1:9f1fcd1e4c9c | 289 | } else { |
mcm | 1:9f1fcd1e4c9c | 290 | cmd = SHT2X_TRIGGER_HUMIDITY_MEASUREMENT_NO_HOLD_MASTER; |
mcm | 1:9f1fcd1e4c9c | 291 | myI2C_stop = false; |
mcm | 1:9f1fcd1e4c9c | 292 | } |
mcm | 1:9f1fcd1e4c9c | 293 | |
mcm | 1:9f1fcd1e4c9c | 294 | |
mcm | 1:9f1fcd1e4c9c | 295 | aux = _i2c.write ( _SHT2X_Addr, &cmd, 1U, myI2C_stop ); |
mcm | 1:9f1fcd1e4c9c | 296 | |
mcm | 1:9f1fcd1e4c9c | 297 | |
mcm | 1:9f1fcd1e4c9c | 298 | /* NOTE: The user has to respect the total conversion time! */ |
mcm | 1:9f1fcd1e4c9c | 299 | |
mcm | 1:9f1fcd1e4c9c | 300 | |
mcm | 1:9f1fcd1e4c9c | 301 | if ( aux == I2C_SUCCESS ) { |
mcm | 1:9f1fcd1e4c9c | 302 | return SHT2X_SUCCESS; |
mcm | 1:9f1fcd1e4c9c | 303 | } else { |
mcm | 1:9f1fcd1e4c9c | 304 | return SHT2X_FAILURE; |
mcm | 1:9f1fcd1e4c9c | 305 | } |
mcm | 1:9f1fcd1e4c9c | 306 | } |
mcm | 1:9f1fcd1e4c9c | 307 | |
mcm | 1:9f1fcd1e4c9c | 308 | |
mcm | 1:9f1fcd1e4c9c | 309 | /** |
mcm | 1:9f1fcd1e4c9c | 310 | * @brief SHT2X_ReadHumidity ( SHT2X_vector_data_t* ) |
mcm | 1:9f1fcd1e4c9c | 311 | * @details It reads a new humidity measurement. |
mcm | 1:9f1fcd1e4c9c | 312 | * |
mcm | 1:9f1fcd1e4c9c | 313 | * @param[in] N/A |
mcm | 1:9f1fcd1e4c9c | 314 | * |
mcm | 1:9f1fcd1e4c9c | 315 | * @param[out] myHumidity: Variable to store the humidity. |
mcm | 1:9f1fcd1e4c9c | 316 | * |
mcm | 1:9f1fcd1e4c9c | 317 | * |
mcm | 1:9f1fcd1e4c9c | 318 | * @return Status of SHT2X_ReadHumidity. |
mcm | 1:9f1fcd1e4c9c | 319 | * |
mcm | 1:9f1fcd1e4c9c | 320 | * @author Manuel Caballero |
mcm | 1:9f1fcd1e4c9c | 321 | * @date 3/September/2018 |
mcm | 1:9f1fcd1e4c9c | 322 | * @version 3/September/2018 The ORIGIN |
mcm | 1:9f1fcd1e4c9c | 323 | * @pre CRC is NOT taken into account. |
mcm | 1:9f1fcd1e4c9c | 324 | * @warning The measuring time depends on the chosen resolution. The user MUST take this into account. |
mcm | 1:9f1fcd1e4c9c | 325 | * @warning SHT2X_TriggerHumidity MUST be call before. |
mcm | 1:9f1fcd1e4c9c | 326 | */ |
mcm | 1:9f1fcd1e4c9c | 327 | SHT2X::SHT2X_status_t SHT2X::SHT2X_ReadHumidity ( SHT2X_vector_data_t* myHumidity ) |
mcm | 1:9f1fcd1e4c9c | 328 | { |
mcm | 1:9f1fcd1e4c9c | 329 | char cmd[] = { 0, 0, 0 }; |
mcm | 1:9f1fcd1e4c9c | 330 | uint32_t aux; |
mcm | 1:9f1fcd1e4c9c | 331 | |
mcm | 1:9f1fcd1e4c9c | 332 | |
mcm | 1:9f1fcd1e4c9c | 333 | /* Read the relative humidity */ |
mcm | 1:9f1fcd1e4c9c | 334 | aux = _i2c.read ( _SHT2X_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) ); |
mcm | 1:9f1fcd1e4c9c | 335 | |
mcm | 1:9f1fcd1e4c9c | 336 | /* Parse the data */ |
mcm | 1:9f1fcd1e4c9c | 337 | myHumidity->RelativeHumidity = ( ( cmd[0] << 8U ) | cmd[1] ); |
mcm | 1:9f1fcd1e4c9c | 338 | myHumidity->RelativeHumidity /= 65536.0f; |
mcm | 1:9f1fcd1e4c9c | 339 | myHumidity->RelativeHumidity *= 125.0f; |
mcm | 1:9f1fcd1e4c9c | 340 | myHumidity->RelativeHumidity -= 6.0f; |
mcm | 1:9f1fcd1e4c9c | 341 | |
mcm | 1:9f1fcd1e4c9c | 342 | |
mcm | 1:9f1fcd1e4c9c | 343 | |
mcm | 1:9f1fcd1e4c9c | 344 | |
mcm | 1:9f1fcd1e4c9c | 345 | if ( aux == I2C_SUCCESS ) { |
mcm | 1:9f1fcd1e4c9c | 346 | return SHT2X_SUCCESS; |
mcm | 1:9f1fcd1e4c9c | 347 | } else { |
mcm | 1:9f1fcd1e4c9c | 348 | return SHT2X_FAILURE; |
mcm | 1:9f1fcd1e4c9c | 349 | } |
mcm | 1:9f1fcd1e4c9c | 350 | } |
mcm | 1:9f1fcd1e4c9c | 351 | |
mcm | 1:9f1fcd1e4c9c | 352 | |
mcm | 1:9f1fcd1e4c9c | 353 | |
mcm | 1:9f1fcd1e4c9c | 354 | /** |
mcm | 1:9f1fcd1e4c9c | 355 | * @brief SHT2X_ReadRawHumidity ( SHT2X_vector_data_t* ) |
mcm | 1:9f1fcd1e4c9c | 356 | * @details It reads a new raw humidity measurement. |
mcm | 1:9f1fcd1e4c9c | 357 | * |
mcm | 1:9f1fcd1e4c9c | 358 | * @param[in] mN/A |
mcm | 1:9f1fcd1e4c9c | 359 | * |
mcm | 1:9f1fcd1e4c9c | 360 | * @param[out] myHumidity: Variable to store the humidity. |
mcm | 1:9f1fcd1e4c9c | 361 | * |
mcm | 1:9f1fcd1e4c9c | 362 | * |
mcm | 1:9f1fcd1e4c9c | 363 | * @return Status of SHT2X_ReadHumidity. |
mcm | 1:9f1fcd1e4c9c | 364 | * |
mcm | 1:9f1fcd1e4c9c | 365 | * @author Manuel Caballero |
mcm | 1:9f1fcd1e4c9c | 366 | * @date 3/September/2018 |
mcm | 1:9f1fcd1e4c9c | 367 | * @version 3/September/2018 The ORIGIN |
mcm | 1:9f1fcd1e4c9c | 368 | * @pre CRC is NOT taken into account. |
mcm | 1:9f1fcd1e4c9c | 369 | * @warning The measuring time depends on the chosen resolution. The user MUST take this into account. |
mcm | 1:9f1fcd1e4c9c | 370 | * @warning No Hold Master is ONLY implemented. |
mcm | 1:9f1fcd1e4c9c | 371 | * @warning SHT2X_TriggerHumidity MUST be call before. |
mcm | 1:9f1fcd1e4c9c | 372 | */ |
mcm | 1:9f1fcd1e4c9c | 373 | SHT2X::SHT2X_status_t SHT2X::SHT2X_ReadRawHumidity ( SHT2X_vector_data_t* myHumidity ) |
mcm | 1:9f1fcd1e4c9c | 374 | { |
mcm | 1:9f1fcd1e4c9c | 375 | char cmd[] = { 0, 0, 0 }; |
mcm | 1:9f1fcd1e4c9c | 376 | uint32_t aux; |
mcm | 1:9f1fcd1e4c9c | 377 | |
mcm | 1:9f1fcd1e4c9c | 378 | |
mcm | 1:9f1fcd1e4c9c | 379 | /* Read the relative humidity */ |
mcm | 1:9f1fcd1e4c9c | 380 | aux = _i2c.read ( _SHT2X_Addr, &cmd[0], 3U ); |
mcm | 1:9f1fcd1e4c9c | 381 | |
mcm | 1:9f1fcd1e4c9c | 382 | /* Parse the data */ |
mcm | 1:9f1fcd1e4c9c | 383 | myHumidity->RawRelativeHumidity = ( ( cmd[0] << 8U ) | cmd[1] ); |
mcm | 1:9f1fcd1e4c9c | 384 | |
mcm | 1:9f1fcd1e4c9c | 385 | |
mcm | 1:9f1fcd1e4c9c | 386 | |
mcm | 1:9f1fcd1e4c9c | 387 | |
mcm | 1:9f1fcd1e4c9c | 388 | if ( aux == I2C_SUCCESS ) { |
mcm | 1:9f1fcd1e4c9c | 389 | return SHT2X_SUCCESS; |
mcm | 1:9f1fcd1e4c9c | 390 | } else { |
mcm | 1:9f1fcd1e4c9c | 391 | return SHT2X_FAILURE; |
mcm | 1:9f1fcd1e4c9c | 392 | } |
mcm | 1:9f1fcd1e4c9c | 393 | } |
mcm | 1:9f1fcd1e4c9c | 394 | |
mcm | 1:9f1fcd1e4c9c | 395 | |
mcm | 1:9f1fcd1e4c9c | 396 | /** |
mcm | 1:9f1fcd1e4c9c | 397 | * @brief SHT2X_BatteryStatus ( SHT2X_vector_data_t* ) |
mcm | 1:9f1fcd1e4c9c | 398 | * @details It reads the user register to check the battery status. |
mcm | 1:9f1fcd1e4c9c | 399 | * |
mcm | 1:9f1fcd1e4c9c | 400 | * @param[in] N/A |
mcm | 1:9f1fcd1e4c9c | 401 | * |
mcm | 1:9f1fcd1e4c9c | 402 | * @param[out] myBattStatus: Variable to store the battery status. |
mcm | 1:9f1fcd1e4c9c | 403 | * |
mcm | 1:9f1fcd1e4c9c | 404 | * |
mcm | 1:9f1fcd1e4c9c | 405 | * @return Status of SHT2X_BatteryStatus. |
mcm | 1:9f1fcd1e4c9c | 406 | * |
mcm | 1:9f1fcd1e4c9c | 407 | * @author Manuel Caballero |
mcm | 1:9f1fcd1e4c9c | 408 | * @date 3/September/2018 |
mcm | 1:9f1fcd1e4c9c | 409 | * @version 3/September/2018 The ORIGIN |
mcm | 1:9f1fcd1e4c9c | 410 | * @pre CRC is NOT taken into account. |
mcm | 1:9f1fcd1e4c9c | 411 | * @warning N/A. |
mcm | 1:9f1fcd1e4c9c | 412 | */ |
mcm | 1:9f1fcd1e4c9c | 413 | SHT2X::SHT2X_status_t SHT2X::SHT2X_BatteryStatus ( SHT2X_vector_data_t* myBattStatus ) |
mcm | 1:9f1fcd1e4c9c | 414 | { |
mcm | 1:9f1fcd1e4c9c | 415 | char cmd = SHT2X_READ_USER_REGISTER; |
mcm | 1:9f1fcd1e4c9c | 416 | uint32_t aux; |
mcm | 1:9f1fcd1e4c9c | 417 | |
mcm | 1:9f1fcd1e4c9c | 418 | |
mcm | 1:9f1fcd1e4c9c | 419 | /* Get the battery status */ |
mcm | 1:9f1fcd1e4c9c | 420 | aux = _i2c.write ( _SHT2X_Addr, &cmd, 1U, true ); |
mcm | 1:9f1fcd1e4c9c | 421 | aux = _i2c.read ( _SHT2X_Addr, &cmd, 1U ); |
mcm | 1:9f1fcd1e4c9c | 422 | |
mcm | 1:9f1fcd1e4c9c | 423 | /* Parse the data */ |
mcm | 1:9f1fcd1e4c9c | 424 | myBattStatus->BatteryStatus = ( cmd & USER_REGISTER_STATUS_END_BATTERY_MASK ); |
mcm | 1:9f1fcd1e4c9c | 425 | |
mcm | 1:9f1fcd1e4c9c | 426 | |
mcm | 1:9f1fcd1e4c9c | 427 | |
mcm | 1:9f1fcd1e4c9c | 428 | |
mcm | 1:9f1fcd1e4c9c | 429 | if ( aux == I2C_SUCCESS ) { |
mcm | 1:9f1fcd1e4c9c | 430 | return SHT2X_SUCCESS; |
mcm | 1:9f1fcd1e4c9c | 431 | } else { |
mcm | 1:9f1fcd1e4c9c | 432 | return SHT2X_FAILURE; |
mcm | 1:9f1fcd1e4c9c | 433 | } |
mcm | 1:9f1fcd1e4c9c | 434 | } |
mcm | 1:9f1fcd1e4c9c | 435 | |
mcm | 1:9f1fcd1e4c9c | 436 | |
mcm | 1:9f1fcd1e4c9c | 437 | |
mcm | 1:9f1fcd1e4c9c | 438 | /** |
mcm | 1:9f1fcd1e4c9c | 439 | * @brief SHT2X_GetSerialNumber ( SHT2X_vector_data_t* ) |
mcm | 1:9f1fcd1e4c9c | 440 | * @details It gets the serial number ( Electronic Identification Code ). |
mcm | 1:9f1fcd1e4c9c | 441 | * |
mcm | 1:9f1fcd1e4c9c | 442 | * @param[in] N/A |
mcm | 1:9f1fcd1e4c9c | 443 | * |
mcm | 1:9f1fcd1e4c9c | 444 | * @param[out] mySerialNumber: Device serial number. |
mcm | 1:9f1fcd1e4c9c | 445 | * |
mcm | 1:9f1fcd1e4c9c | 446 | * |
mcm | 1:9f1fcd1e4c9c | 447 | * @return Status of SHT2X_GetSerialNumber. |
mcm | 1:9f1fcd1e4c9c | 448 | * |
mcm | 1:9f1fcd1e4c9c | 449 | * @author Manuel Caballero |
mcm | 1:9f1fcd1e4c9c | 450 | * @date 3/September/2018 |
mcm | 1:9f1fcd1e4c9c | 451 | * @version 3/September/2018 The ORIGIN |
mcm | 1:9f1fcd1e4c9c | 452 | * @pre Composition of Serial Number: SNA_1 | SNA_0 | SNB_3 | SNB_2 | SNB_1 | SNB_0 | SNC_1 | SNC_0 |
mcm | 1:9f1fcd1e4c9c | 453 | * @pre CRC is NOT taken into account. |
mcm | 1:9f1fcd1e4c9c | 454 | * @warning N/A. |
mcm | 1:9f1fcd1e4c9c | 455 | */ |
mcm | 1:9f1fcd1e4c9c | 456 | SHT2X::SHT2X_status_t SHT2X::SHT2X_GetSerialNumber ( SHT2X_vector_data_t* mySerialNumber ) |
mcm | 1:9f1fcd1e4c9c | 457 | { |
mcm | 1:9f1fcd1e4c9c | 458 | char cmd[14] = { 0 }; |
mcm | 1:9f1fcd1e4c9c | 459 | uint32_t aux; |
mcm | 1:9f1fcd1e4c9c | 460 | |
mcm | 1:9f1fcd1e4c9c | 461 | |
mcm | 1:9f1fcd1e4c9c | 462 | /* Serial number: first memory access */ |
mcm | 1:9f1fcd1e4c9c | 463 | cmd[0] = SHT2X_SERIAL_NUMBER_FIRST_MEMORY_ACCESS_MSB; |
mcm | 1:9f1fcd1e4c9c | 464 | cmd[1] = SHT2X_SERIAL_NUMBER_FIRST_MEMORY_ACCESS_LSB; |
mcm | 1:9f1fcd1e4c9c | 465 | aux = _i2c.write ( _SHT2X_Addr, &cmd[0], 2U, true ); |
mcm | 1:9f1fcd1e4c9c | 466 | aux = _i2c.read ( _SHT2X_Addr, &cmd[0], 8U ); |
mcm | 1:9f1fcd1e4c9c | 467 | |
mcm | 1:9f1fcd1e4c9c | 468 | /* Serial number: second memory access */ |
mcm | 1:9f1fcd1e4c9c | 469 | cmd[8] = SHT2X_SERIAL_NUMBER_SECOND_MEMORY_ACCESS_MSB; |
mcm | 1:9f1fcd1e4c9c | 470 | cmd[9] = SHT2X_SERIAL_NUMBER_SECOND_MEMORY_ACCESS_LSB; |
mcm | 1:9f1fcd1e4c9c | 471 | aux = _i2c.write ( _SHT2X_Addr, &cmd[8], 2U, true ); |
mcm | 1:9f1fcd1e4c9c | 472 | aux = _i2c.read ( _SHT2X_Addr, &cmd[8], 6U ); |
mcm | 1:9f1fcd1e4c9c | 473 | |
mcm | 1:9f1fcd1e4c9c | 474 | |
mcm | 1:9f1fcd1e4c9c | 475 | /* Parse the data */ |
mcm | 1:9f1fcd1e4c9c | 476 | mySerialNumber->SerialNumber = cmd[11]; // SNA_1 |
mcm | 1:9f1fcd1e4c9c | 477 | mySerialNumber->SerialNumber <<= 8U; |
mcm | 1:9f1fcd1e4c9c | 478 | |
mcm | 1:9f1fcd1e4c9c | 479 | mySerialNumber->SerialNumber |= cmd[12]; // SNA_0 |
mcm | 1:9f1fcd1e4c9c | 480 | mySerialNumber->SerialNumber <<= 8U; |
mcm | 1:9f1fcd1e4c9c | 481 | |
mcm | 1:9f1fcd1e4c9c | 482 | mySerialNumber->SerialNumber |= cmd[0]; // SNB_3 |
mcm | 1:9f1fcd1e4c9c | 483 | mySerialNumber->SerialNumber <<= 8U; |
mcm | 1:9f1fcd1e4c9c | 484 | |
mcm | 1:9f1fcd1e4c9c | 485 | mySerialNumber->SerialNumber |= cmd[2]; // SNB_2 |
mcm | 1:9f1fcd1e4c9c | 486 | mySerialNumber->SerialNumber <<= 8U; |
mcm | 1:9f1fcd1e4c9c | 487 | |
mcm | 1:9f1fcd1e4c9c | 488 | mySerialNumber->SerialNumber |= cmd[4]; // SNB_1 |
mcm | 1:9f1fcd1e4c9c | 489 | mySerialNumber->SerialNumber <<= 8U; |
mcm | 1:9f1fcd1e4c9c | 490 | |
mcm | 1:9f1fcd1e4c9c | 491 | mySerialNumber->SerialNumber |= cmd[6]; // SNB_0 |
mcm | 1:9f1fcd1e4c9c | 492 | mySerialNumber->SerialNumber <<= 8U; |
mcm | 1:9f1fcd1e4c9c | 493 | |
mcm | 1:9f1fcd1e4c9c | 494 | mySerialNumber->SerialNumber |= cmd[8]; // SNC_1 |
mcm | 1:9f1fcd1e4c9c | 495 | mySerialNumber->SerialNumber <<= 8U; |
mcm | 1:9f1fcd1e4c9c | 496 | |
mcm | 1:9f1fcd1e4c9c | 497 | mySerialNumber->SerialNumber |= cmd[9]; // SNC_0 |
mcm | 1:9f1fcd1e4c9c | 498 | |
mcm | 1:9f1fcd1e4c9c | 499 | |
mcm | 1:9f1fcd1e4c9c | 500 | |
mcm | 1:9f1fcd1e4c9c | 501 | |
mcm | 1:9f1fcd1e4c9c | 502 | if ( aux == I2C_SUCCESS ) { |
mcm | 1:9f1fcd1e4c9c | 503 | return SHT2X_SUCCESS; |
mcm | 1:9f1fcd1e4c9c | 504 | } else { |
mcm | 1:9f1fcd1e4c9c | 505 | return SHT2X_FAILURE; |
mcm | 1:9f1fcd1e4c9c | 506 | } |
mcm | 1:9f1fcd1e4c9c | 507 | } |