/* * Author: William Penner <william.penner@intel.com> * Copyright (c) 2014 Intel Corporation. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ #pragma once #include <string> #include <mraa/i2c.hpp> #include <math.h> #define HTU21D_NAME "htu21d" #define HTU21D_I2C_ADDRESS 0x40 /* HTU21D Commands */ #define HTU21D_READ_TEMP_HOLD 0xE3 #define HTU21D_READ_HUMIDITY_HOLD 0xE5 #define HTU21D_WRITE_USER_REG 0xE6 #define HTU21D_READ_USER_REG 0xE7 #define HTU21D_SOFT_RESET 0xFE /* User Register Bit Definition */ #define HTU21D_DISABLE_OTP 0x02 #define HTU21D_HEATER_ENABLE 0x04 #define HTU21D_END_OF_BATTERY 0x40 #define HTU21D_RESO_RH12_T14 0x00 #define HTU21D_RESO_RH8_T12 0x01 #define HTU21D_RESO_RH10_T13 0x80 #define HTU21D_RESO_RH11_T11 0x81 namespace upm { /** * @brief HTU21D Humidity Sensor library * @defgroup htu21d libupm-htu21d * @ingroup seeed adafruit sparkfun i2c temp */ /** * @library htu21d * @sensor htu21d * @comname HTU21D Temperature & Humidity Sensor * @type temp * @man seeed adafruit sparkfun * @web http://www.meas-spec.com/downloads/HTU21D.pdf * @con i2c * * @brief API for the HTU21D Temperature & Humidity Sensor * * HTU21D by Measurement Specialties is a digital humidity sensor with * temperature output. * RH reports between 0 and 100%, and the temperature range is * -40 to +125 degC. Note: getCompRH is the preferred * function below (passing true to cause a measurement cycle). If * actual values used for the compensated ready are necessary, use * the getHumidity(false) and getTemperature(false) functions following * the getCompRH call. * Also note the sensor should not perform more than a couple of * measurements per second to limit the heating of the sensor. * * @image html htu21d.jpeg * @snippet htu21d.cxx Interesting */ class HTU21D { public: /** * Instantiates an HTU21D object * * @param bus Number of the used bus * @param devAddr Address of the used I2C device * @param mode HTU21D oversampling */ HTU21D (int bus, int devAddr=HTU21D_I2C_ADDRESS); /** * Initiates a temperature/pressure mesasurement and waits for the function * to complete. The humidity and temperature registers can be read * after this call. */ int sampleData(void); /** * Gets the current measured humidity [RH] */ float getHumidity(int bSampleData = false); /** * Gets the humidity cell temperature [degC] */ float getTemperature(int bSampleData = false); /** * Using the current humidity and temperature, the function * calculates the compensated RH using the equation from * the datasheet. */ float getCompRH(int bSampleData = true); /** * Sets the heater state. The heater is used to test * the sensor functionality since the temperature should increase * 0.5 to 1.5 degC, and the humidity should decrease. The * testSensor() function below uses the heater. * * @param bEnable Sets to non-zero to turn the heater on */ int setHeater(int bEnable = false); /** * Performs a soft reset of the MPL3115A2 device to ensure * it is in a known state. This function can be used to reset * the min/max temperature and pressure values. */ void resetSensor(void); /** * Tests the device and verifies it * is operating correctly. * */ int testSensor(void); /** * Writes to a one-byte register * * @param reg Address of the register * @param value Byte to be written */ mraa::Result i2cWriteReg (uint8_t reg, uint8_t value); /** * Reads a two-byte register * * @param reg Address of the register */ uint16_t i2cReadReg_16 (int reg); /** * Reads a one-byte register * * @param reg Address of the register */ uint8_t i2cReadReg_8 (int reg); private: /** * Converts the temperature register to degC * 1000 */ int32_t convertTemp(int32_t regval); /** * Converts the RH register to %RH * 1000 */ int32_t convertRH(int32_t regval); std::string m_name; int m_controlAddr; int m_bus; mraa::I2c m_i2ControlCtx; int32_t m_temperature; int32_t m_humidity; }; }