Capacitive digital sensor for relative humidity and temperature.

Dependencies:   X_NUCLEO_COMMON ST_INTERFACES

Dependents:   HelloWorld_ST_Sensors MOTENV_Mbed mbed-os-mqtt-client HTS221_JS ... more

Committer:
nikapov
Date:
Mon Sep 04 16:06:23 2017 +0000
Revision:
0:7917d6d00a6e
Child:
1:c4391f20553e
First version.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nikapov 0:7917d6d00a6e 1 /**
nikapov 0:7917d6d00a6e 2 ******************************************************************************
nikapov 0:7917d6d00a6e 3 * @file HTS221Sensor.cpp
nikapov 0:7917d6d00a6e 4 * @author CLab
nikapov 0:7917d6d00a6e 5 * @version V1.0.0
nikapov 0:7917d6d00a6e 6 * @date 5 August 2016
nikapov 0:7917d6d00a6e 7 * @brief Implementation of an HTS221 Humidity and Temperature sensor.
nikapov 0:7917d6d00a6e 8 ******************************************************************************
nikapov 0:7917d6d00a6e 9 * @attention
nikapov 0:7917d6d00a6e 10 *
nikapov 0:7917d6d00a6e 11 * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
nikapov 0:7917d6d00a6e 12 *
nikapov 0:7917d6d00a6e 13 * Redistribution and use in source and binary forms, with or without modification,
nikapov 0:7917d6d00a6e 14 * are permitted provided that the following conditions are met:
nikapov 0:7917d6d00a6e 15 * 1. Redistributions of source code must retain the above copyright notice,
nikapov 0:7917d6d00a6e 16 * this list of conditions and the following disclaimer.
nikapov 0:7917d6d00a6e 17 * 2. Redistributions in binary form must reproduce the above copyright notice,
nikapov 0:7917d6d00a6e 18 * this list of conditions and the following disclaimer in the documentation
nikapov 0:7917d6d00a6e 19 * and/or other materials provided with the distribution.
nikapov 0:7917d6d00a6e 20 * 3. Neither the name of STMicroelectronics nor the names of its contributors
nikapov 0:7917d6d00a6e 21 * may be used to endorse or promote products derived from this software
nikapov 0:7917d6d00a6e 22 * without specific prior written permission.
nikapov 0:7917d6d00a6e 23 *
nikapov 0:7917d6d00a6e 24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
nikapov 0:7917d6d00a6e 25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
nikapov 0:7917d6d00a6e 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
nikapov 0:7917d6d00a6e 27 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
nikapov 0:7917d6d00a6e 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
nikapov 0:7917d6d00a6e 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
nikapov 0:7917d6d00a6e 30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
nikapov 0:7917d6d00a6e 31 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
nikapov 0:7917d6d00a6e 32 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
nikapov 0:7917d6d00a6e 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
nikapov 0:7917d6d00a6e 34 *
nikapov 0:7917d6d00a6e 35 ******************************************************************************
nikapov 0:7917d6d00a6e 36 */
nikapov 0:7917d6d00a6e 37
nikapov 0:7917d6d00a6e 38
nikapov 0:7917d6d00a6e 39 /* Includes ------------------------------------------------------------------*/
nikapov 0:7917d6d00a6e 40
nikapov 0:7917d6d00a6e 41
nikapov 0:7917d6d00a6e 42 #include "HTS221Sensor.h"
nikapov 0:7917d6d00a6e 43
nikapov 0:7917d6d00a6e 44
nikapov 0:7917d6d00a6e 45 /* Class Implementation ------------------------------------------------------*/
nikapov 0:7917d6d00a6e 46
nikapov 0:7917d6d00a6e 47 /** Constructor
nikapov 0:7917d6d00a6e 48 * @param i2c object of an helper class which handles the I2C peripheral
nikapov 0:7917d6d00a6e 49 * @param address the address of the component's instance
nikapov 0:7917d6d00a6e 50 */
nikapov 0:7917d6d00a6e 51 HTS221Sensor::HTS221Sensor(DevI2C &i2c) : _dev_i2c(i2c)
nikapov 0:7917d6d00a6e 52 {
nikapov 0:7917d6d00a6e 53 _address = HTS221_I2C_ADDRESS;
nikapov 0:7917d6d00a6e 54 };
nikapov 0:7917d6d00a6e 55
nikapov 0:7917d6d00a6e 56
nikapov 0:7917d6d00a6e 57 /** Constructor
nikapov 0:7917d6d00a6e 58 * @param i2c object of an helper class which handles the I2C peripheral
nikapov 0:7917d6d00a6e 59 * @param address the address of the component's instance
nikapov 0:7917d6d00a6e 60 */
nikapov 0:7917d6d00a6e 61 HTS221Sensor::HTS221Sensor(DevI2C &i2c, uint8_t address) : _dev_i2c(i2c), _address(address)
nikapov 0:7917d6d00a6e 62 {
nikapov 0:7917d6d00a6e 63
nikapov 0:7917d6d00a6e 64 };
nikapov 0:7917d6d00a6e 65
nikapov 0:7917d6d00a6e 66 /**
nikapov 0:7917d6d00a6e 67 * @brief Initializing the component.
nikapov 0:7917d6d00a6e 68 * @param[in] init pointer to device specific initalization structure.
nikapov 0:7917d6d00a6e 69 * @retval "0" in case of success, an error code otherwise.
nikapov 0:7917d6d00a6e 70 */
nikapov 0:7917d6d00a6e 71 int HTS221Sensor::init(void *init)
nikapov 0:7917d6d00a6e 72 {
nikapov 0:7917d6d00a6e 73 /* Power down the device */
nikapov 0:7917d6d00a6e 74 if ( HTS221_DeActivate( (void *)this ) == HTS221_ERROR )
nikapov 0:7917d6d00a6e 75 {
nikapov 0:7917d6d00a6e 76 return 1;
nikapov 0:7917d6d00a6e 77 }
nikapov 0:7917d6d00a6e 78
nikapov 0:7917d6d00a6e 79 /* Enable BDU */
nikapov 0:7917d6d00a6e 80 if ( HTS221_Set_BduMode( (void *)this, HTS221_ENABLE ) == HTS221_ERROR )
nikapov 0:7917d6d00a6e 81 {
nikapov 0:7917d6d00a6e 82 return 1;
nikapov 0:7917d6d00a6e 83 }
nikapov 0:7917d6d00a6e 84
nikapov 0:7917d6d00a6e 85 if(set_odr(1.0f) == 1)
nikapov 0:7917d6d00a6e 86 {
nikapov 0:7917d6d00a6e 87 return 1;
nikapov 0:7917d6d00a6e 88 }
nikapov 0:7917d6d00a6e 89
nikapov 0:7917d6d00a6e 90 return 0;
nikapov 0:7917d6d00a6e 91 }
nikapov 0:7917d6d00a6e 92
nikapov 0:7917d6d00a6e 93 /**
nikapov 0:7917d6d00a6e 94 * @brief Enable HTS221
nikapov 0:7917d6d00a6e 95 * @retval 0 in case of success, an error code otherwise
nikapov 0:7917d6d00a6e 96 */
nikapov 0:7917d6d00a6e 97 int HTS221Sensor::enable(void)
nikapov 0:7917d6d00a6e 98 {
nikapov 0:7917d6d00a6e 99 /* Power up the device */
nikapov 0:7917d6d00a6e 100 if ( HTS221_Activate( (void *)this ) == HTS221_ERROR )
nikapov 0:7917d6d00a6e 101 {
nikapov 0:7917d6d00a6e 102 return 1;
nikapov 0:7917d6d00a6e 103 }
nikapov 0:7917d6d00a6e 104
nikapov 0:7917d6d00a6e 105 return 0;
nikapov 0:7917d6d00a6e 106 }
nikapov 0:7917d6d00a6e 107
nikapov 0:7917d6d00a6e 108 /**
nikapov 0:7917d6d00a6e 109 * @brief Disable HTS221
nikapov 0:7917d6d00a6e 110 * @retval 0 in case of success, an error code otherwise
nikapov 0:7917d6d00a6e 111 */
nikapov 0:7917d6d00a6e 112 int HTS221Sensor::disable(void)
nikapov 0:7917d6d00a6e 113 {
nikapov 0:7917d6d00a6e 114 /* Power up the device */
nikapov 0:7917d6d00a6e 115 if ( HTS221_DeActivate( (void *)this ) == HTS221_ERROR )
nikapov 0:7917d6d00a6e 116 {
nikapov 0:7917d6d00a6e 117 return 1;
nikapov 0:7917d6d00a6e 118 }
nikapov 0:7917d6d00a6e 119
nikapov 0:7917d6d00a6e 120 return 0;
nikapov 0:7917d6d00a6e 121 }
nikapov 0:7917d6d00a6e 122
nikapov 0:7917d6d00a6e 123 /**
nikapov 0:7917d6d00a6e 124 * @brief Read ID address of HTS221
nikapov 0:7917d6d00a6e 125 * @param id the pointer where the ID of the device is stored
nikapov 0:7917d6d00a6e 126 * @retval 0 in case of success, an error code otherwise
nikapov 0:7917d6d00a6e 127 */
nikapov 0:7917d6d00a6e 128 int HTS221Sensor::read_id(uint8_t *id)
nikapov 0:7917d6d00a6e 129 {
nikapov 0:7917d6d00a6e 130 if(!id)
nikapov 0:7917d6d00a6e 131 {
nikapov 0:7917d6d00a6e 132 return 1;
nikapov 0:7917d6d00a6e 133 }
nikapov 0:7917d6d00a6e 134
nikapov 0:7917d6d00a6e 135 /* Read WHO AM I register */
nikapov 0:7917d6d00a6e 136 if ( HTS221_Get_DeviceID( (void *)this, id ) == HTS221_ERROR )
nikapov 0:7917d6d00a6e 137 {
nikapov 0:7917d6d00a6e 138 return 1;
nikapov 0:7917d6d00a6e 139 }
nikapov 0:7917d6d00a6e 140
nikapov 0:7917d6d00a6e 141 return 0;
nikapov 0:7917d6d00a6e 142 }
nikapov 0:7917d6d00a6e 143
nikapov 0:7917d6d00a6e 144 /**
nikapov 0:7917d6d00a6e 145 * @brief Reboot memory content of HTS221
nikapov 0:7917d6d00a6e 146 * @param None
nikapov 0:7917d6d00a6e 147 * @retval 0 in case of success, an error code otherwise
nikapov 0:7917d6d00a6e 148 */
nikapov 0:7917d6d00a6e 149 int HTS221Sensor::reset(void)
nikapov 0:7917d6d00a6e 150 {
nikapov 0:7917d6d00a6e 151 uint8_t tmpreg;
nikapov 0:7917d6d00a6e 152
nikapov 0:7917d6d00a6e 153 /* Read CTRL_REG2 register */
nikapov 0:7917d6d00a6e 154 if (read_reg(HTS221_CTRL_REG2, &tmpreg) != 0)
nikapov 0:7917d6d00a6e 155 {
nikapov 0:7917d6d00a6e 156 return 1;
nikapov 0:7917d6d00a6e 157 }
nikapov 0:7917d6d00a6e 158
nikapov 0:7917d6d00a6e 159 /* Enable or Disable the reboot memory */
nikapov 0:7917d6d00a6e 160 tmpreg |= (0x01 << HTS221_BOOT_BIT);
nikapov 0:7917d6d00a6e 161
nikapov 0:7917d6d00a6e 162 /* Write value to MEMS CTRL_REG2 regsister */
nikapov 0:7917d6d00a6e 163 if (write_reg(HTS221_CTRL_REG2, tmpreg) != 0)
nikapov 0:7917d6d00a6e 164 {
nikapov 0:7917d6d00a6e 165 return 1;
nikapov 0:7917d6d00a6e 166 }
nikapov 0:7917d6d00a6e 167
nikapov 0:7917d6d00a6e 168 return 0;
nikapov 0:7917d6d00a6e 169 }
nikapov 0:7917d6d00a6e 170
nikapov 0:7917d6d00a6e 171 /**
nikapov 0:7917d6d00a6e 172 * @brief Read HTS221 output register, and calculate the humidity
nikapov 0:7917d6d00a6e 173 * @param pfData the pointer to data output
nikapov 0:7917d6d00a6e 174 * @retval 0 in case of success, an error code otherwise
nikapov 0:7917d6d00a6e 175 */
nikapov 0:7917d6d00a6e 176 int HTS221Sensor::get_humidity(float* pfData)
nikapov 0:7917d6d00a6e 177 {
nikapov 0:7917d6d00a6e 178 uint16_t uint16data = 0;
nikapov 0:7917d6d00a6e 179
nikapov 0:7917d6d00a6e 180 /* Read data from HTS221. */
nikapov 0:7917d6d00a6e 181 if ( HTS221_Get_Humidity( (void *)this, &uint16data ) == HTS221_ERROR )
nikapov 0:7917d6d00a6e 182 {
nikapov 0:7917d6d00a6e 183 return 1;
nikapov 0:7917d6d00a6e 184 }
nikapov 0:7917d6d00a6e 185
nikapov 0:7917d6d00a6e 186 *pfData = ( float )uint16data / 10.0f;
nikapov 0:7917d6d00a6e 187
nikapov 0:7917d6d00a6e 188 return 0;
nikapov 0:7917d6d00a6e 189 }
nikapov 0:7917d6d00a6e 190
nikapov 0:7917d6d00a6e 191 /**
nikapov 0:7917d6d00a6e 192 * @brief Read HTS221 output register, and calculate the temperature
nikapov 0:7917d6d00a6e 193 * @param pfData the pointer to data output
nikapov 0:7917d6d00a6e 194 * @retval 0 in case of success, an error code otherwise
nikapov 0:7917d6d00a6e 195 */
nikapov 0:7917d6d00a6e 196 int HTS221Sensor::get_temperature(float* pfData)
nikapov 0:7917d6d00a6e 197 {
nikapov 0:7917d6d00a6e 198 int16_t int16data = 0;
nikapov 0:7917d6d00a6e 199
nikapov 0:7917d6d00a6e 200 /* Read data from HTS221. */
nikapov 0:7917d6d00a6e 201 if ( HTS221_Get_Temperature( (void *)this, &int16data ) == HTS221_ERROR )
nikapov 0:7917d6d00a6e 202 {
nikapov 0:7917d6d00a6e 203 return 1;
nikapov 0:7917d6d00a6e 204 }
nikapov 0:7917d6d00a6e 205
nikapov 0:7917d6d00a6e 206 *pfData = ( float )int16data / 10.0f;
nikapov 0:7917d6d00a6e 207
nikapov 0:7917d6d00a6e 208 return 0;
nikapov 0:7917d6d00a6e 209 }
nikapov 0:7917d6d00a6e 210
nikapov 0:7917d6d00a6e 211 /**
nikapov 0:7917d6d00a6e 212 * @brief Read HTS221 output register, and calculate the humidity
nikapov 0:7917d6d00a6e 213 * @param odr the pointer to the output data rate
nikapov 0:7917d6d00a6e 214 * @retval 0 in case of success, an error code otherwise
nikapov 0:7917d6d00a6e 215 */
nikapov 0:7917d6d00a6e 216 int HTS221Sensor::get_odr(float* odr)
nikapov 0:7917d6d00a6e 217 {
nikapov 0:7917d6d00a6e 218 HTS221_Odr_et odr_low_level;
nikapov 0:7917d6d00a6e 219
nikapov 0:7917d6d00a6e 220 if ( HTS221_Get_Odr( (void *)this, &odr_low_level ) == HTS221_ERROR )
nikapov 0:7917d6d00a6e 221 {
nikapov 0:7917d6d00a6e 222 return 1;
nikapov 0:7917d6d00a6e 223 }
nikapov 0:7917d6d00a6e 224
nikapov 0:7917d6d00a6e 225 switch( odr_low_level )
nikapov 0:7917d6d00a6e 226 {
nikapov 0:7917d6d00a6e 227 case HTS221_ODR_ONE_SHOT:
nikapov 0:7917d6d00a6e 228 *odr = 0.0f;
nikapov 0:7917d6d00a6e 229 break;
nikapov 0:7917d6d00a6e 230 case HTS221_ODR_1HZ :
nikapov 0:7917d6d00a6e 231 *odr = 1.0f;
nikapov 0:7917d6d00a6e 232 break;
nikapov 0:7917d6d00a6e 233 case HTS221_ODR_7HZ :
nikapov 0:7917d6d00a6e 234 *odr = 7.0f;
nikapov 0:7917d6d00a6e 235 break;
nikapov 0:7917d6d00a6e 236 case HTS221_ODR_12_5HZ :
nikapov 0:7917d6d00a6e 237 *odr = 12.5f;
nikapov 0:7917d6d00a6e 238 break;
nikapov 0:7917d6d00a6e 239 default :
nikapov 0:7917d6d00a6e 240 *odr = -1.0f;
nikapov 0:7917d6d00a6e 241 return 1;
nikapov 0:7917d6d00a6e 242 }
nikapov 0:7917d6d00a6e 243
nikapov 0:7917d6d00a6e 244 return 0;
nikapov 0:7917d6d00a6e 245 }
nikapov 0:7917d6d00a6e 246
nikapov 0:7917d6d00a6e 247 /**
nikapov 0:7917d6d00a6e 248 * @brief Set ODR
nikapov 0:7917d6d00a6e 249 * @param odr the output data rate to be set
nikapov 0:7917d6d00a6e 250 * @retval 0 in case of success, an error code otherwise
nikapov 0:7917d6d00a6e 251 */
nikapov 0:7917d6d00a6e 252 int HTS221Sensor::set_odr(float odr)
nikapov 0:7917d6d00a6e 253 {
nikapov 0:7917d6d00a6e 254 HTS221_Odr_et new_odr;
nikapov 0:7917d6d00a6e 255
nikapov 0:7917d6d00a6e 256 new_odr = ( odr <= 1.0f ) ? HTS221_ODR_1HZ
nikapov 0:7917d6d00a6e 257 : ( odr <= 7.0f ) ? HTS221_ODR_7HZ
nikapov 0:7917d6d00a6e 258 : HTS221_ODR_12_5HZ;
nikapov 0:7917d6d00a6e 259
nikapov 0:7917d6d00a6e 260 if ( HTS221_Set_Odr( (void *)this, new_odr ) == HTS221_ERROR )
nikapov 0:7917d6d00a6e 261 {
nikapov 0:7917d6d00a6e 262 return 1;
nikapov 0:7917d6d00a6e 263 }
nikapov 0:7917d6d00a6e 264
nikapov 0:7917d6d00a6e 265 return 0;
nikapov 0:7917d6d00a6e 266 }
nikapov 0:7917d6d00a6e 267
nikapov 0:7917d6d00a6e 268
nikapov 0:7917d6d00a6e 269 /**
nikapov 0:7917d6d00a6e 270 * @brief Read the data from register
nikapov 0:7917d6d00a6e 271 * @param reg register address
nikapov 0:7917d6d00a6e 272 * @param data register data
nikapov 0:7917d6d00a6e 273 * @retval 0 in case of success
nikapov 0:7917d6d00a6e 274 * @retval 1 in case of failure
nikapov 0:7917d6d00a6e 275 */
nikapov 0:7917d6d00a6e 276 int HTS221Sensor::read_reg( uint8_t reg, uint8_t *data )
nikapov 0:7917d6d00a6e 277 {
nikapov 0:7917d6d00a6e 278
nikapov 0:7917d6d00a6e 279 if ( HTS221_read_reg( (void *)this, reg, 1, data ) == HTS221_ERROR )
nikapov 0:7917d6d00a6e 280 {
nikapov 0:7917d6d00a6e 281 return 1;
nikapov 0:7917d6d00a6e 282 }
nikapov 0:7917d6d00a6e 283
nikapov 0:7917d6d00a6e 284 return 0;
nikapov 0:7917d6d00a6e 285 }
nikapov 0:7917d6d00a6e 286
nikapov 0:7917d6d00a6e 287 /**
nikapov 0:7917d6d00a6e 288 * @brief Write the data to register
nikapov 0:7917d6d00a6e 289 * @param reg register address
nikapov 0:7917d6d00a6e 290 * @param data register data
nikapov 0:7917d6d00a6e 291 * @retval 0 in case of success
nikapov 0:7917d6d00a6e 292 * @retval 1 in case of failure
nikapov 0:7917d6d00a6e 293 */
nikapov 0:7917d6d00a6e 294 int HTS221Sensor::write_reg( uint8_t reg, uint8_t data )
nikapov 0:7917d6d00a6e 295 {
nikapov 0:7917d6d00a6e 296
nikapov 0:7917d6d00a6e 297 if ( HTS221_write_reg( (void *)this, reg, 1, &data ) == HTS221_ERROR )
nikapov 0:7917d6d00a6e 298 {
nikapov 0:7917d6d00a6e 299 return 1;
nikapov 0:7917d6d00a6e 300 }
nikapov 0:7917d6d00a6e 301
nikapov 0:7917d6d00a6e 302 return 0;
nikapov 0:7917d6d00a6e 303 }
nikapov 0:7917d6d00a6e 304
nikapov 0:7917d6d00a6e 305 uint8_t HTS221_io_write( void *handle, uint8_t WriteAddr, uint8_t *pBuffer, uint16_t nBytesToWrite )
nikapov 0:7917d6d00a6e 306 {
nikapov 0:7917d6d00a6e 307 return ((HTS221Sensor *)handle)->io_write(pBuffer, WriteAddr, nBytesToWrite);
nikapov 0:7917d6d00a6e 308 }
nikapov 0:7917d6d00a6e 309
nikapov 0:7917d6d00a6e 310 uint8_t HTS221_io_read( void *handle, uint8_t ReadAddr, uint8_t *pBuffer, uint16_t nBytesToRead )
nikapov 0:7917d6d00a6e 311 {
nikapov 0:7917d6d00a6e 312 return ((HTS221Sensor *)handle)->io_read(pBuffer, ReadAddr, nBytesToRead);
nikapov 0:7917d6d00a6e 313 }