1 /*
2  * Author: William Penner <william.penner@intel.com>
3  * Copyright (c) 2014 Intel Corporation.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a copy
6  * of this software and associated documentation files (the "Software"), to deal
7  * in the Software without restriction, including without limitation the rights
8  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9  * copies of the Software, and to permit persons to whom the Software is
10  * furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included in
13  * all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21  * THE SOFTWARE.
22  */
23 
24 #pragma once
25 
26 #include <string>
27 #include <mraa/i2c.hpp>
28 #include <math.h>
29 
30 #define HTU21D_NAME "htu21d"
31 #define HTU21D_I2C_ADDRESS 0x40
32 
33 /* HTU21D Commands */
34 #define HTU21D_READ_TEMP_HOLD     0xE3
35 #define HTU21D_READ_HUMIDITY_HOLD 0xE5
36 #define HTU21D_WRITE_USER_REG     0xE6
37 #define HTU21D_READ_USER_REG      0xE7
38 #define HTU21D_SOFT_RESET         0xFE
39 
40 /* User Register Bit Definition */
41 #define HTU21D_DISABLE_OTP        0x02
42 #define HTU21D_HEATER_ENABLE      0x04
43 #define HTU21D_END_OF_BATTERY     0x40
44 #define HTU21D_RESO_RH12_T14      0x00
45 #define HTU21D_RESO_RH8_T12       0x01
46 #define HTU21D_RESO_RH10_T13      0x80
47 #define HTU21D_RESO_RH11_T11      0x81
48 
49 namespace upm {
50 
51 /**
52  * @brief HTU21D Humidity Sensor library
53  * @defgroup htu21d libupm-htu21d
54  * @ingroup seeed adafruit sparkfun i2c temp
55  */
56 
57 /**
58  * @library htu21d
59  * @sensor htu21d
60  * @comname HTU21D Temperature & Humidity Sensor
61  * @type temp
62  * @man seeed adafruit sparkfun
63  * @web http://www.meas-spec.com/downloads/HTU21D.pdf
64  * @con i2c
65  *
66  * @brief API for the HTU21D Temperature & Humidity Sensor
67  *
68  * HTU21D by Measurement Specialties is a digital humidity sensor with
69  * temperature output.
70  * RH reports between 0 and 100%, and the temperature range is
71  * -40 to +125 degC. Note: getCompRH is the preferred
72  * function below (passing true to cause a measurement cycle). If
73  * actual values used for the compensated ready are necessary, use
74  * the getHumidity(false) and getTemperature(false) functions following
75  * the getCompRH call.
76  * Also note the sensor should not perform more than a couple of
77  * measurements per second to limit the heating of the sensor.
78  *
79  * @image html htu21d.jpeg
80  * @snippet htu21d.cxx Interesting
81  */
82 class HTU21D {
83     public:
84         /**
85          * Instantiates an HTU21D object
86          *
87          * @param bus Number of the used bus
88          * @param devAddr Address of the used I2C device
89          * @param mode HTU21D oversampling
90          */
91         HTU21D (int bus, int devAddr=HTU21D_I2C_ADDRESS);
92 
93         /**
94          * Initiates a temperature/pressure mesasurement and waits for the function
95          * to complete. The humidity and temperature registers can be read
96          * after this call.
97          */
98         int sampleData(void);
99 
100         /**
101          * Gets the current measured humidity [RH]
102          */
103         float getHumidity(int bSampleData = false);
104 
105         /**
106          * Gets the humidity cell temperature [degC]
107          */
108         float getTemperature(int bSampleData = false);
109 
110         /**
111          * Using the current humidity and temperature, the function
112          * calculates the compensated RH using the equation from
113          * the datasheet.
114          */
115         float getCompRH(int bSampleData = true);
116 
117         /**
118          * Sets the heater state. The heater is used to test
119          * the sensor functionality since the temperature should increase
120          * 0.5 to 1.5 degC, and the humidity should decrease. The
121          * testSensor() function below uses the heater.
122          *
123          * @param bEnable Sets to non-zero to turn the heater on
124          */
125          int setHeater(int bEnable = false);
126 
127         /**
128          * Performs a soft reset of the MPL3115A2 device to ensure
129          * it is in a known state. This function can be used to reset
130          * the min/max temperature and pressure values.
131          */
132         void resetSensor(void);
133 
134         /**
135          * Tests the device and verifies it
136          * is operating correctly.
137          *
138          */
139         int testSensor(void);
140 
141         /**
142          * Writes to a one-byte register
143          *
144          * @param reg Address of the register
145          * @param value Byte to be written
146          */
147         mraa::Result i2cWriteReg (uint8_t reg, uint8_t value);
148 
149         /**
150          * Reads a two-byte register
151          *
152          * @param reg Address of the register
153          */
154         uint16_t i2cReadReg_16 (int reg);
155 
156         /**
157          * Reads a one-byte register
158          *
159          * @param reg Address of the register
160          */
161         uint8_t i2cReadReg_8 (int reg);
162 
163     private:
164 
165         /**
166          * Converts the temperature register to degC * 1000
167          */
168         int32_t convertTemp(int32_t regval);
169 
170         /**
171          * Converts the RH register to %RH * 1000
172          */
173         int32_t convertRH(int32_t regval);
174 
175         std::string m_name;
176 
177         int m_controlAddr;
178         int m_bus;
179         mraa::I2c m_i2ControlCtx;
180 
181         int32_t m_temperature;
182         int32_t m_humidity;
183 };
184 
185 }
186