/*
* 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;
};
}