Device driver for Si7020 Digital humidity and temperature sensor.

Dependents:   Si7020_example MAXWSNENV_sensors MAXWSNENV_sensors Hello-Uzuki-sensor-shield ... more

Si7020 Device Driver

This is a device driver for the Si7020 Humidity and temperature sensor. It uses I2C to communicate humidity and temperature data.

Si7020 Product Page

180

Committer:
kgills
Date:
Fri Apr 17 09:53:45 2015 -0500
Revision:
0:9a1febb56203
Adding files for Si7020 device driver.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kgills 0:9a1febb56203 1 /*******************************************************************************
kgills 0:9a1febb56203 2 * Copyright (C) 2015 Maxim Integrated Products, Inc., All Rights Reserved.
kgills 0:9a1febb56203 3 *
kgills 0:9a1febb56203 4 * Permission is hereby granted, free of charge, to any person obtaining a
kgills 0:9a1febb56203 5 * copy of this software and associated documentation files (the "Software"),
kgills 0:9a1febb56203 6 * to deal in the Software without restriction, including without limitation
kgills 0:9a1febb56203 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
kgills 0:9a1febb56203 8 * and/or sell copies of the Software, and to permit persons to whom the
kgills 0:9a1febb56203 9 * Software is furnished to do so, subject to the following conditions:
kgills 0:9a1febb56203 10 *
kgills 0:9a1febb56203 11 * The above copyright notice and this permission notice shall be included
kgills 0:9a1febb56203 12 * in all copies or substantial portions of the Software.
kgills 0:9a1febb56203 13 *
kgills 0:9a1febb56203 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
kgills 0:9a1febb56203 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
kgills 0:9a1febb56203 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
kgills 0:9a1febb56203 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
kgills 0:9a1febb56203 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
kgills 0:9a1febb56203 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
kgills 0:9a1febb56203 20 * OTHER DEALINGS IN THE SOFTWARE.
kgills 0:9a1febb56203 21 *
kgills 0:9a1febb56203 22 * Except as contained in this notice, the name of Maxim Integrated
kgills 0:9a1febb56203 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
kgills 0:9a1febb56203 24 * Products, Inc. Branding Policy.
kgills 0:9a1febb56203 25 *
kgills 0:9a1febb56203 26 * The mere transfer of this software does not imply any licenses
kgills 0:9a1febb56203 27 * of trade secrets, proprietary technology, copyrights, patents,
kgills 0:9a1febb56203 28 * trademarks, maskwork rights, or any other form of intellectual
kgills 0:9a1febb56203 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
kgills 0:9a1febb56203 30 * ownership rights.
kgills 0:9a1febb56203 31 *******************************************************************************
kgills 0:9a1febb56203 32 */
kgills 0:9a1febb56203 33
kgills 0:9a1febb56203 34 #ifndef _SI7020_H_
kgills 0:9a1febb56203 35 #define _SI7020_H_
kgills 0:9a1febb56203 36
kgills 0:9a1febb56203 37 #include "mbed.h"
kgills 0:9a1febb56203 38
kgills 0:9a1febb56203 39 /**
kgills 0:9a1febb56203 40 * Silicon Labs Si7020 Humidity and Temperature Sensor
kgills 0:9a1febb56203 41 *
kgills 0:9a1febb56203 42 * @code
kgills 0:9a1febb56203 43 * #include <stdio.h>
kgills 0:9a1febb56203 44 * #include "mbed.h"
kgills 0:9a1febb56203 45 * #include "Si7020.h"
kgills 0:9a1febb56203 46 *
kgills 0:9a1febb56203 47 * I2C i2c(I2C_SDA, I2C_SCL);
kgills 0:9a1febb56203 48 * Si7020 si(&i2c);
kgills 0:9a1febb56203 49 *
kgills 0:9a1febb56203 50 * int main()
kgills 0:9a1febb56203 51 * {
kgills 0:9a1febb56203 52 * while(1) {
kgills 0:9a1febb56203 53 *
kgills 0:9a1febb56203 54 * float humid;
kgills 0:9a1febb56203 55 * if(si.getHumidity(&humid) != 0) {
kgills 0:9a1febb56203 56 * printf("Error getting humidity\n");
kgills 0:9a1febb56203 57 * humid = -1;
kgills 0:9a1febb56203 58 * }
kgills 0:9a1febb56203 59 *
kgills 0:9a1febb56203 60 * float temp;
kgills 0:9a1febb56203 61 * if(si.getTemperature(&temp) != 0) {
kgills 0:9a1febb56203 62 * printf("Error getting temperature");
kgills 0:9a1febb56203 63 * temp = -1;
kgills 0:9a1febb56203 64 * }
kgills 0:9a1febb56203 65 * printf("Humidity = %f%% Temperature = %fC\n", humid, temp);
kgills 0:9a1febb56203 66 *
kgills 0:9a1febb56203 67 * wait(1);
kgills 0:9a1febb56203 68 * }
kgills 0:9a1febb56203 69 * }
kgills 0:9a1febb56203 70 * @endcode
kgills 0:9a1febb56203 71 */
kgills 0:9a1febb56203 72 class Si7020
kgills 0:9a1febb56203 73 {
kgills 0:9a1febb56203 74
kgills 0:9a1febb56203 75 public:
kgills 0:9a1febb56203 76
kgills 0:9a1febb56203 77 /**
kgills 0:9a1febb56203 78 * @brief Measurement resolution.
kgills 0:9a1febb56203 79 * @details Controls the resolution of the humidity and temperarure readings.
kgills 0:9a1febb56203 80 */
kgills 0:9a1febb56203 81 typedef enum {
kgills 0:9a1febb56203 82 RH_12b_TEMP_14b = 0x0, ///< 12 bits for RH, 14 bits for Temp
kgills 0:9a1febb56203 83 RH_8b_TEMP_12b = 0x1, ///< 8 bits for RH, 12 bits for Temp
kgills 0:9a1febb56203 84 RH_10b_TEMP_13b = 0x2, ///< 10 bits for RH, 13 bits for Temp
kgills 0:9a1febb56203 85 RH_11b_TEMP_11b = 0x3, ///< 11 bits for RH, 11 bits for Temp
kgills 0:9a1febb56203 86 } resolution_t;
kgills 0:9a1febb56203 87
kgills 0:9a1febb56203 88 /**
kgills 0:9a1febb56203 89 * Si7020 constructor.
kgills 0:9a1febb56203 90 *
kgills 0:9a1febb56203 91 * @param sda mbed pin to use for SDA line of I2C interface.
kgills 0:9a1febb56203 92 * @param scl mbed pin to use for SCL line of I2C interface.
kgills 0:9a1febb56203 93 */
kgills 0:9a1febb56203 94 Si7020(PinName sda, PinName scl);
kgills 0:9a1febb56203 95
kgills 0:9a1febb56203 96 /**
kgills 0:9a1febb56203 97 * Si7020 constructor.
kgills 0:9a1febb56203 98 *
kgills 0:9a1febb56203 99 * @param i2c I2C object to use
kgills 0:9a1febb56203 100 */
kgills 0:9a1febb56203 101 Si7020(I2C *i2c);
kgills 0:9a1febb56203 102
kgills 0:9a1febb56203 103 /**
kgills 0:9a1febb56203 104 * Si7020 destructor.
kgills 0:9a1febb56203 105 */
kgills 0:9a1febb56203 106 ~Si7020();
kgills 0:9a1febb56203 107
kgills 0:9a1febb56203 108 /**
kgills 0:9a1febb56203 109 * @brief Reset.
kgills 0:9a1febb56203 110 * @details Sends the rest command.
kgills 0:9a1febb56203 111 * @returns 0 if no errors, -1 if error.
kgills 0:9a1febb56203 112 */
kgills 0:9a1febb56203 113 int reset(void);
kgills 0:9a1febb56203 114
kgills 0:9a1febb56203 115 /**
kgills 0:9a1febb56203 116 * @brief Get Electronic ID.
kgills 0:9a1febb56203 117 * @details Gets the Electronic ID of the connected device. Verifies the
kgills 0:9a1febb56203 118 * ID with an 8-bit CRC.
kgills 0:9a1febb56203 119 *
kgills 0:9a1febb56203 120 * @param Character buffer to store the id. Needs to be at least 8 bytes.
kgills 0:9a1febb56203 121 * @returns 0 if no errors, -1 if error.
kgills 0:9a1febb56203 122 */
kgills 0:9a1febb56203 123 int getElectronicId(char *id);
kgills 0:9a1febb56203 124
kgills 0:9a1febb56203 125 /**
kgills 0:9a1febb56203 126 * @brief Configure sample resolution.
kgills 0:9a1febb56203 127 * @details Sets the number of bits used for humidity and temperature readings.
kgills 0:9a1febb56203 128 * @param resolution Enum for the resolution setting.
kgills 0:9a1febb56203 129 * @returns 0 if no errors, -1 if error.
kgills 0:9a1febb56203 130 */
kgills 0:9a1febb56203 131 int configResolution(Si7020::resolution_t resolution);
kgills 0:9a1febb56203 132
kgills 0:9a1febb56203 133 /**
kgills 0:9a1febb56203 134 * @brief Get temperature reading.
kgills 0:9a1febb56203 135 * @details Initiates a temperature reading and blocks until reading has
kgills 0:9a1febb56203 136 * been calculated.
kgills 0:9a1febb56203 137 *
kgills 0:9a1febb56203 138 * @note Will hold the I2C bus until reading is complete. Refer to datasheet
kgills 0:9a1febb56203 139 * for timing specifications.
kgills 0:9a1febb56203 140 *
kgills 0:9a1febb56203 141 * @param tempCx10 Pointer for temperature reading. Unit is 1/10th degree Celcius.
kgills 0:9a1febb56203 142 * @returns 0 if no errors, -1 if error.
kgills 0:9a1febb56203 143 */
kgills 0:9a1febb56203 144 int getTemperature(int16_t *tempCx10);
kgills 0:9a1febb56203 145
kgills 0:9a1febb56203 146 /**
kgills 0:9a1febb56203 147 * @brief Get temperature reading.
kgills 0:9a1febb56203 148 * @details Initiates a temperature reading and blocks until reading has
kgills 0:9a1febb56203 149 * been calculated.
kgills 0:9a1febb56203 150 *
kgills 0:9a1febb56203 151 * @note Will hold the I2C bus until reading is complete. Refer to datasheet
kgills 0:9a1febb56203 152 * for timing specifications.
kgills 0:9a1febb56203 153 *
kgills 0:9a1febb56203 154 * @param tempC Pointer for temperature reading. Unit is degree Celcius.
kgills 0:9a1febb56203 155 * @returns 0 if no errors, -1 if error.
kgills 0:9a1febb56203 156 */
kgills 0:9a1febb56203 157 int getTemperature(float *tempC);
kgills 0:9a1febb56203 158
kgills 0:9a1febb56203 159 /**
kgills 0:9a1febb56203 160 * @brief Start temperature reading.
kgills 0:9a1febb56203 161 * @details Initiates a temperature reading. Will not hold the bus or block.
kgills 0:9a1febb56203 162 * @returns 0 if no errors, -1 if error.
kgills 0:9a1febb56203 163 */
kgills 0:9a1febb56203 164 int startTemperature(void);
kgills 0:9a1febb56203 165
kgills 0:9a1febb56203 166 /**
kgills 0:9a1febb56203 167 * @brief Check temperature reading.
kgills 0:9a1febb56203 168 * @details Checks to see if the temperature reading has been completed.
kgills 0:9a1febb56203 169 Returns temperature if reading complete.
kgills 0:9a1febb56203 170 * @note Must call startTemperature() prior to calling this function.
kgills 0:9a1febb56203 171 * @param tempCx10 Pointer for temperature reading. Unit is 1/10th degree Celcius.
kgills 0:9a1febb56203 172 * @returns 0 if reading taken, -1 if reading pending.
kgills 0:9a1febb56203 173 */
kgills 0:9a1febb56203 174 int checkTemperature(int16_t *tempCx10);
kgills 0:9a1febb56203 175
kgills 0:9a1febb56203 176 /**
kgills 0:9a1febb56203 177 * @brief Check temperature reading.
kgills 0:9a1febb56203 178 * @details Checks to see if the temperature reading has been completed.
kgills 0:9a1febb56203 179 Returns temperature if reading complete.
kgills 0:9a1febb56203 180 * @note Must call startTemperature() prior to calling this function.
kgills 0:9a1febb56203 181 * @param tempC Pointer for temperature reading. Unit is degree Celcius.
kgills 0:9a1febb56203 182 * @returns 0 if reading taken, -1 if reading pending.
kgills 0:9a1febb56203 183 */
kgills 0:9a1febb56203 184 int checkTemperature(float *tempC);
kgills 0:9a1febb56203 185
kgills 0:9a1febb56203 186 /**
kgills 0:9a1febb56203 187 * @brief Get humidity reading.
kgills 0:9a1febb56203 188 * @details Initiates a humidity reading and blocks until reading has
kgills 0:9a1febb56203 189 * been calculated.
kgills 0:9a1febb56203 190 *
kgills 0:9a1febb56203 191 * @note Will hold the I2C bus until reading is complete. Refer to datasheet
kgills 0:9a1febb56203 192 * for timing specifications.
kgills 0:9a1febb56203 193 *
kgills 0:9a1febb56203 194 * @param humidx10 Pointer for humidity reading. Unit is 1/10th percent.
kgills 0:9a1febb56203 195 * @returns 0 if no errors, -1 if error.
kgills 0:9a1febb56203 196 */
kgills 0:9a1febb56203 197 int getHumidity(int16_t *humidx10);
kgills 0:9a1febb56203 198
kgills 0:9a1febb56203 199 /**
kgills 0:9a1febb56203 200 * @brief Get humidity reading.
kgills 0:9a1febb56203 201 * @details Initiates a humidity reading and blocks until reading has
kgills 0:9a1febb56203 202 * been calculated.
kgills 0:9a1febb56203 203 *
kgills 0:9a1febb56203 204 * @note Will hold the I2C bus until reading is complete. Refer to datasheet
kgills 0:9a1febb56203 205 * for timing specifications.
kgills 0:9a1febb56203 206 *
kgills 0:9a1febb56203 207 * @param humid Pointer for humidity reading. Unit is percent.
kgills 0:9a1febb56203 208 * @returns 0 if no errors, -1 if error.
kgills 0:9a1febb56203 209 */
kgills 0:9a1febb56203 210 int getHumidity(float *humid);
kgills 0:9a1febb56203 211
kgills 0:9a1febb56203 212 /**
kgills 0:9a1febb56203 213 * @brief Start humidity reading.
kgills 0:9a1febb56203 214 * @details Initiates a humidity reading. Will not hold the bus or block.
kgills 0:9a1febb56203 215 * @returns 0 if no errors, -1 if error.
kgills 0:9a1febb56203 216 */
kgills 0:9a1febb56203 217 int startHumidity(void);
kgills 0:9a1febb56203 218
kgills 0:9a1febb56203 219 /**
kgills 0:9a1febb56203 220 * @brief Check humidity reading.
kgills 0:9a1febb56203 221 * @details Checks to see if the humidity reading has been completed.
kgills 0:9a1febb56203 222 Returns humidity if reading complete.
kgills 0:9a1febb56203 223
kgills 0:9a1febb56203 224 * @note Must call startHumidity() prior to calling this function.
kgills 0:9a1febb56203 225 * @param humidCx10 Pointer for humidity reading. Unit is 1/10th percent.
kgills 0:9a1febb56203 226 * @returns 0 if reading taken, -1 if reading pending.
kgills 0:9a1febb56203 227 */
kgills 0:9a1febb56203 228 int checkHumidity(int16_t *humidx10);
kgills 0:9a1febb56203 229
kgills 0:9a1febb56203 230 /**
kgills 0:9a1febb56203 231 * @brief Check humidity reading.
kgills 0:9a1febb56203 232 * @details Checks to see if the humidity reading has been completed.
kgills 0:9a1febb56203 233 Returns humidity if reading complete.
kgills 0:9a1febb56203 234
kgills 0:9a1febb56203 235 * @note Must call startHumidity() prior to calling this function.
kgills 0:9a1febb56203 236 * @param humid Pointer for humidity reading. Unit is percent.
kgills 0:9a1febb56203 237 * @returns 0 if reading taken, -1 if reading pending.
kgills 0:9a1febb56203 238 */
kgills 0:9a1febb56203 239 int checkHumidity(float *humid);
kgills 0:9a1febb56203 240
kgills 0:9a1febb56203 241 /**
kgills 0:9a1febb56203 242 * @brief Get temperature from humidity reading.
kgills 0:9a1febb56203 243 * @details Gets temperature reading from previous humidity reading.
kgills 0:9a1febb56203 244 * @note Must call startHumidity() prior to calling this function.
kgills 0:9a1febb56203 245 * @param tempC Pointer for temperature reading. Unit is degree Celcius.
kgills 0:9a1febb56203 246 * @returns 0 if reading taken, -1 if reading pending.
kgills 0:9a1febb56203 247 */
kgills 0:9a1febb56203 248 int getPrevTemperature(float* tempC);
kgills 0:9a1febb56203 249
kgills 0:9a1febb56203 250 /**
kgills 0:9a1febb56203 251 * @brief Get temperature from humidity reading.
kgills 0:9a1febb56203 252 * @details Gets temperature reading from previous humidity reading.
kgills 0:9a1febb56203 253 * @note Must call startHumidity() prior to calling this function.
kgills 0:9a1febb56203 254 * @param tempCx10 Pointer for temperature reading. Unit is 1/10th degree Celcius.
kgills 0:9a1febb56203 255 * @returns 0 if reading taken, -1 if reading pending.
kgills 0:9a1febb56203 256 */
kgills 0:9a1febb56203 257 int getPrevTemperature(int16_t *tempCx10);
kgills 0:9a1febb56203 258
kgills 0:9a1febb56203 259 /**
kgills 0:9a1febb56203 260 * @brief Get firmware revision.
kgills 0:9a1febb56203 261 * @details Reads the firmware revision, refer to datasheet for codes.
kgills 0:9a1febb56203 262 * @param rev Pointer to store firmware revision.
kgills 0:9a1febb56203 263 * @returns 0 if no errors, -1 if error.
kgills 0:9a1febb56203 264 */
kgills 0:9a1febb56203 265 int getRev(char *rev);
kgills 0:9a1febb56203 266
kgills 0:9a1febb56203 267 /**
kgills 0:9a1febb56203 268 * @brief Control heater.
kgills 0:9a1febb56203 269 * @details Enable or disable the heater.
kgills 0:9a1febb56203 270 * @param enable True to enable heater, false to disable.
kgills 0:9a1febb56203 271 * @returns 0 if no errors, -1 if error.
kgills 0:9a1febb56203 272 */
kgills 0:9a1febb56203 273 int heater(bool enable);
kgills 0:9a1febb56203 274
kgills 0:9a1febb56203 275 private:
kgills 0:9a1febb56203 276
kgills 0:9a1febb56203 277 char crc8(char value, char seed);
kgills 0:9a1febb56203 278 I2C *i2c_;
kgills 0:9a1febb56203 279 bool i2c_owner;
kgills 0:9a1febb56203 280 };
kgills 0:9a1febb56203 281
kgills 0:9a1febb56203 282 #endif /* _SI7020_H_ */