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:
mapellil
Date:
Wed Sep 27 16:36:58 2017 +0200
Revision:
1:c4391f20553e
Parent:
0:7917d6d00a6e
Child:
2:312ee2694a77
Fixed NonCopyable

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 */
mapellil 1:c4391f20553e 51 HTS221Sensor::HTS221Sensor(DevI2C *i2c, uint8_t address, PinName drdy_pin) :
mapellil 1:c4391f20553e 52 _dev_i2c(i2c), _address(address), _cs_pin(NC), _drdy_pin(drdy_pin)
nikapov 0:7917d6d00a6e 53 {
mapellil 1:c4391f20553e 54 assert (i2c);
nikapov 0:7917d6d00a6e 55 };
nikapov 0:7917d6d00a6e 56
nikapov 0:7917d6d00a6e 57 /**
nikapov 0:7917d6d00a6e 58 * @brief Initializing the component.
nikapov 0:7917d6d00a6e 59 * @param[in] init pointer to device specific initalization structure.
nikapov 0:7917d6d00a6e 60 * @retval "0" in case of success, an error code otherwise.
nikapov 0:7917d6d00a6e 61 */
nikapov 0:7917d6d00a6e 62 int HTS221Sensor::init(void *init)
nikapov 0:7917d6d00a6e 63 {
nikapov 0:7917d6d00a6e 64 /* Power down the device */
nikapov 0:7917d6d00a6e 65 if ( HTS221_DeActivate( (void *)this ) == HTS221_ERROR )
nikapov 0:7917d6d00a6e 66 {
nikapov 0:7917d6d00a6e 67 return 1;
nikapov 0:7917d6d00a6e 68 }
nikapov 0:7917d6d00a6e 69
nikapov 0:7917d6d00a6e 70 /* Enable BDU */
nikapov 0:7917d6d00a6e 71 if ( HTS221_Set_BduMode( (void *)this, HTS221_ENABLE ) == HTS221_ERROR )
nikapov 0:7917d6d00a6e 72 {
nikapov 0:7917d6d00a6e 73 return 1;
nikapov 0:7917d6d00a6e 74 }
nikapov 0:7917d6d00a6e 75
nikapov 0:7917d6d00a6e 76 if(set_odr(1.0f) == 1)
nikapov 0:7917d6d00a6e 77 {
nikapov 0:7917d6d00a6e 78 return 1;
nikapov 0:7917d6d00a6e 79 }
nikapov 0:7917d6d00a6e 80
nikapov 0:7917d6d00a6e 81 return 0;
nikapov 0:7917d6d00a6e 82 }
nikapov 0:7917d6d00a6e 83
nikapov 0:7917d6d00a6e 84 /**
nikapov 0:7917d6d00a6e 85 * @brief Enable HTS221
nikapov 0:7917d6d00a6e 86 * @retval 0 in case of success, an error code otherwise
nikapov 0:7917d6d00a6e 87 */
nikapov 0:7917d6d00a6e 88 int HTS221Sensor::enable(void)
nikapov 0:7917d6d00a6e 89 {
nikapov 0:7917d6d00a6e 90 /* Power up the device */
nikapov 0:7917d6d00a6e 91 if ( HTS221_Activate( (void *)this ) == HTS221_ERROR )
nikapov 0:7917d6d00a6e 92 {
nikapov 0:7917d6d00a6e 93 return 1;
nikapov 0:7917d6d00a6e 94 }
nikapov 0:7917d6d00a6e 95
nikapov 0:7917d6d00a6e 96 return 0;
nikapov 0:7917d6d00a6e 97 }
nikapov 0:7917d6d00a6e 98
nikapov 0:7917d6d00a6e 99 /**
nikapov 0:7917d6d00a6e 100 * @brief Disable HTS221
nikapov 0:7917d6d00a6e 101 * @retval 0 in case of success, an error code otherwise
nikapov 0:7917d6d00a6e 102 */
nikapov 0:7917d6d00a6e 103 int HTS221Sensor::disable(void)
nikapov 0:7917d6d00a6e 104 {
nikapov 0:7917d6d00a6e 105 /* Power up the device */
nikapov 0:7917d6d00a6e 106 if ( HTS221_DeActivate( (void *)this ) == HTS221_ERROR )
nikapov 0:7917d6d00a6e 107 {
nikapov 0:7917d6d00a6e 108 return 1;
nikapov 0:7917d6d00a6e 109 }
nikapov 0:7917d6d00a6e 110
nikapov 0:7917d6d00a6e 111 return 0;
nikapov 0:7917d6d00a6e 112 }
nikapov 0:7917d6d00a6e 113
nikapov 0:7917d6d00a6e 114 /**
nikapov 0:7917d6d00a6e 115 * @brief Read ID address of HTS221
nikapov 0:7917d6d00a6e 116 * @param id the pointer where the ID of the device is stored
nikapov 0:7917d6d00a6e 117 * @retval 0 in case of success, an error code otherwise
nikapov 0:7917d6d00a6e 118 */
nikapov 0:7917d6d00a6e 119 int HTS221Sensor::read_id(uint8_t *id)
nikapov 0:7917d6d00a6e 120 {
nikapov 0:7917d6d00a6e 121 if(!id)
nikapov 0:7917d6d00a6e 122 {
nikapov 0:7917d6d00a6e 123 return 1;
nikapov 0:7917d6d00a6e 124 }
nikapov 0:7917d6d00a6e 125
nikapov 0:7917d6d00a6e 126 /* Read WHO AM I register */
nikapov 0:7917d6d00a6e 127 if ( HTS221_Get_DeviceID( (void *)this, id ) == HTS221_ERROR )
nikapov 0:7917d6d00a6e 128 {
nikapov 0:7917d6d00a6e 129 return 1;
nikapov 0:7917d6d00a6e 130 }
nikapov 0:7917d6d00a6e 131
nikapov 0:7917d6d00a6e 132 return 0;
nikapov 0:7917d6d00a6e 133 }
nikapov 0:7917d6d00a6e 134
nikapov 0:7917d6d00a6e 135 /**
nikapov 0:7917d6d00a6e 136 * @brief Reboot memory content of HTS221
nikapov 0:7917d6d00a6e 137 * @param None
nikapov 0:7917d6d00a6e 138 * @retval 0 in case of success, an error code otherwise
nikapov 0:7917d6d00a6e 139 */
nikapov 0:7917d6d00a6e 140 int HTS221Sensor::reset(void)
nikapov 0:7917d6d00a6e 141 {
nikapov 0:7917d6d00a6e 142 uint8_t tmpreg;
nikapov 0:7917d6d00a6e 143
nikapov 0:7917d6d00a6e 144 /* Read CTRL_REG2 register */
nikapov 0:7917d6d00a6e 145 if (read_reg(HTS221_CTRL_REG2, &tmpreg) != 0)
nikapov 0:7917d6d00a6e 146 {
nikapov 0:7917d6d00a6e 147 return 1;
nikapov 0:7917d6d00a6e 148 }
nikapov 0:7917d6d00a6e 149
nikapov 0:7917d6d00a6e 150 /* Enable or Disable the reboot memory */
nikapov 0:7917d6d00a6e 151 tmpreg |= (0x01 << HTS221_BOOT_BIT);
nikapov 0:7917d6d00a6e 152
nikapov 0:7917d6d00a6e 153 /* Write value to MEMS CTRL_REG2 regsister */
nikapov 0:7917d6d00a6e 154 if (write_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 return 0;
nikapov 0:7917d6d00a6e 160 }
nikapov 0:7917d6d00a6e 161
nikapov 0:7917d6d00a6e 162 /**
nikapov 0:7917d6d00a6e 163 * @brief Read HTS221 output register, and calculate the humidity
nikapov 0:7917d6d00a6e 164 * @param pfData the pointer to data output
nikapov 0:7917d6d00a6e 165 * @retval 0 in case of success, an error code otherwise
nikapov 0:7917d6d00a6e 166 */
nikapov 0:7917d6d00a6e 167 int HTS221Sensor::get_humidity(float* pfData)
nikapov 0:7917d6d00a6e 168 {
nikapov 0:7917d6d00a6e 169 uint16_t uint16data = 0;
nikapov 0:7917d6d00a6e 170
nikapov 0:7917d6d00a6e 171 /* Read data from HTS221. */
nikapov 0:7917d6d00a6e 172 if ( HTS221_Get_Humidity( (void *)this, &uint16data ) == HTS221_ERROR )
nikapov 0:7917d6d00a6e 173 {
nikapov 0:7917d6d00a6e 174 return 1;
nikapov 0:7917d6d00a6e 175 }
nikapov 0:7917d6d00a6e 176
nikapov 0:7917d6d00a6e 177 *pfData = ( float )uint16data / 10.0f;
nikapov 0:7917d6d00a6e 178
nikapov 0:7917d6d00a6e 179 return 0;
nikapov 0:7917d6d00a6e 180 }
nikapov 0:7917d6d00a6e 181
nikapov 0:7917d6d00a6e 182 /**
nikapov 0:7917d6d00a6e 183 * @brief Read HTS221 output register, and calculate the temperature
nikapov 0:7917d6d00a6e 184 * @param pfData the pointer to data output
nikapov 0:7917d6d00a6e 185 * @retval 0 in case of success, an error code otherwise
nikapov 0:7917d6d00a6e 186 */
nikapov 0:7917d6d00a6e 187 int HTS221Sensor::get_temperature(float* pfData)
nikapov 0:7917d6d00a6e 188 {
nikapov 0:7917d6d00a6e 189 int16_t int16data = 0;
nikapov 0:7917d6d00a6e 190
nikapov 0:7917d6d00a6e 191 /* Read data from HTS221. */
nikapov 0:7917d6d00a6e 192 if ( HTS221_Get_Temperature( (void *)this, &int16data ) == HTS221_ERROR )
nikapov 0:7917d6d00a6e 193 {
nikapov 0:7917d6d00a6e 194 return 1;
nikapov 0:7917d6d00a6e 195 }
nikapov 0:7917d6d00a6e 196
nikapov 0:7917d6d00a6e 197 *pfData = ( float )int16data / 10.0f;
nikapov 0:7917d6d00a6e 198
nikapov 0:7917d6d00a6e 199 return 0;
nikapov 0:7917d6d00a6e 200 }
nikapov 0:7917d6d00a6e 201
nikapov 0:7917d6d00a6e 202 /**
nikapov 0:7917d6d00a6e 203 * @brief Read HTS221 output register, and calculate the humidity
nikapov 0:7917d6d00a6e 204 * @param odr the pointer to the output data rate
nikapov 0:7917d6d00a6e 205 * @retval 0 in case of success, an error code otherwise
nikapov 0:7917d6d00a6e 206 */
nikapov 0:7917d6d00a6e 207 int HTS221Sensor::get_odr(float* odr)
nikapov 0:7917d6d00a6e 208 {
nikapov 0:7917d6d00a6e 209 HTS221_Odr_et odr_low_level;
nikapov 0:7917d6d00a6e 210
nikapov 0:7917d6d00a6e 211 if ( HTS221_Get_Odr( (void *)this, &odr_low_level ) == HTS221_ERROR )
nikapov 0:7917d6d00a6e 212 {
nikapov 0:7917d6d00a6e 213 return 1;
nikapov 0:7917d6d00a6e 214 }
nikapov 0:7917d6d00a6e 215
nikapov 0:7917d6d00a6e 216 switch( odr_low_level )
nikapov 0:7917d6d00a6e 217 {
nikapov 0:7917d6d00a6e 218 case HTS221_ODR_ONE_SHOT:
nikapov 0:7917d6d00a6e 219 *odr = 0.0f;
nikapov 0:7917d6d00a6e 220 break;
nikapov 0:7917d6d00a6e 221 case HTS221_ODR_1HZ :
nikapov 0:7917d6d00a6e 222 *odr = 1.0f;
nikapov 0:7917d6d00a6e 223 break;
nikapov 0:7917d6d00a6e 224 case HTS221_ODR_7HZ :
nikapov 0:7917d6d00a6e 225 *odr = 7.0f;
nikapov 0:7917d6d00a6e 226 break;
nikapov 0:7917d6d00a6e 227 case HTS221_ODR_12_5HZ :
nikapov 0:7917d6d00a6e 228 *odr = 12.5f;
nikapov 0:7917d6d00a6e 229 break;
nikapov 0:7917d6d00a6e 230 default :
nikapov 0:7917d6d00a6e 231 *odr = -1.0f;
nikapov 0:7917d6d00a6e 232 return 1;
nikapov 0:7917d6d00a6e 233 }
nikapov 0:7917d6d00a6e 234
nikapov 0:7917d6d00a6e 235 return 0;
nikapov 0:7917d6d00a6e 236 }
nikapov 0:7917d6d00a6e 237
nikapov 0:7917d6d00a6e 238 /**
nikapov 0:7917d6d00a6e 239 * @brief Set ODR
nikapov 0:7917d6d00a6e 240 * @param odr the output data rate to be set
nikapov 0:7917d6d00a6e 241 * @retval 0 in case of success, an error code otherwise
nikapov 0:7917d6d00a6e 242 */
nikapov 0:7917d6d00a6e 243 int HTS221Sensor::set_odr(float odr)
nikapov 0:7917d6d00a6e 244 {
nikapov 0:7917d6d00a6e 245 HTS221_Odr_et new_odr;
nikapov 0:7917d6d00a6e 246
nikapov 0:7917d6d00a6e 247 new_odr = ( odr <= 1.0f ) ? HTS221_ODR_1HZ
nikapov 0:7917d6d00a6e 248 : ( odr <= 7.0f ) ? HTS221_ODR_7HZ
nikapov 0:7917d6d00a6e 249 : HTS221_ODR_12_5HZ;
nikapov 0:7917d6d00a6e 250
nikapov 0:7917d6d00a6e 251 if ( HTS221_Set_Odr( (void *)this, new_odr ) == HTS221_ERROR )
nikapov 0:7917d6d00a6e 252 {
nikapov 0:7917d6d00a6e 253 return 1;
nikapov 0:7917d6d00a6e 254 }
nikapov 0:7917d6d00a6e 255
nikapov 0:7917d6d00a6e 256 return 0;
nikapov 0:7917d6d00a6e 257 }
nikapov 0:7917d6d00a6e 258
nikapov 0:7917d6d00a6e 259
nikapov 0:7917d6d00a6e 260 /**
nikapov 0:7917d6d00a6e 261 * @brief Read the data from register
nikapov 0:7917d6d00a6e 262 * @param reg register address
nikapov 0:7917d6d00a6e 263 * @param data register data
nikapov 0:7917d6d00a6e 264 * @retval 0 in case of success
nikapov 0:7917d6d00a6e 265 * @retval 1 in case of failure
nikapov 0:7917d6d00a6e 266 */
nikapov 0:7917d6d00a6e 267 int HTS221Sensor::read_reg( uint8_t reg, uint8_t *data )
nikapov 0:7917d6d00a6e 268 {
nikapov 0:7917d6d00a6e 269
nikapov 0:7917d6d00a6e 270 if ( HTS221_read_reg( (void *)this, reg, 1, data ) == HTS221_ERROR )
nikapov 0:7917d6d00a6e 271 {
nikapov 0:7917d6d00a6e 272 return 1;
nikapov 0:7917d6d00a6e 273 }
nikapov 0:7917d6d00a6e 274
nikapov 0:7917d6d00a6e 275 return 0;
nikapov 0:7917d6d00a6e 276 }
nikapov 0:7917d6d00a6e 277
nikapov 0:7917d6d00a6e 278 /**
nikapov 0:7917d6d00a6e 279 * @brief Write the data to register
nikapov 0:7917d6d00a6e 280 * @param reg register address
nikapov 0:7917d6d00a6e 281 * @param data register data
nikapov 0:7917d6d00a6e 282 * @retval 0 in case of success
nikapov 0:7917d6d00a6e 283 * @retval 1 in case of failure
nikapov 0:7917d6d00a6e 284 */
nikapov 0:7917d6d00a6e 285 int HTS221Sensor::write_reg( uint8_t reg, uint8_t data )
nikapov 0:7917d6d00a6e 286 {
nikapov 0:7917d6d00a6e 287
nikapov 0:7917d6d00a6e 288 if ( HTS221_write_reg( (void *)this, reg, 1, &data ) == HTS221_ERROR )
nikapov 0:7917d6d00a6e 289 {
nikapov 0:7917d6d00a6e 290 return 1;
nikapov 0:7917d6d00a6e 291 }
nikapov 0:7917d6d00a6e 292
nikapov 0:7917d6d00a6e 293 return 0;
nikapov 0:7917d6d00a6e 294 }
nikapov 0:7917d6d00a6e 295
nikapov 0:7917d6d00a6e 296 uint8_t HTS221_io_write( void *handle, uint8_t WriteAddr, uint8_t *pBuffer, uint16_t nBytesToWrite )
nikapov 0:7917d6d00a6e 297 {
nikapov 0:7917d6d00a6e 298 return ((HTS221Sensor *)handle)->io_write(pBuffer, WriteAddr, nBytesToWrite);
nikapov 0:7917d6d00a6e 299 }
nikapov 0:7917d6d00a6e 300
nikapov 0:7917d6d00a6e 301 uint8_t HTS221_io_read( void *handle, uint8_t ReadAddr, uint8_t *pBuffer, uint16_t nBytesToRead )
nikapov 0:7917d6d00a6e 302 {
nikapov 0:7917d6d00a6e 303 return ((HTS221Sensor *)handle)->io_read(pBuffer, ReadAddr, nBytesToRead);
nikapov 0:7917d6d00a6e 304 }