Digital humidity sensor with temperature output

HTU21D.h

Committer:
mcm
Date:
2017-09-05
Revision:
2:ad5e3555c7ef
Parent:
1:da1f21719567

File content as of revision 2:ad5e3555c7ef:

/**
 * @brief       HTU21D.h
 * @details     Digital humidity sensor with temperature output.
 *              Header file.
 *
 *
 * @return      NA
 *
 * @author      Manuel Caballero
 * @date        31/August/2017
 * @version     31/August/2017    The ORIGIN
 * @pre         NaN.
 * @warning     NaN
 * @pre         This code belongs to AqueronteBlog ( http://unbarquero.blogspot.com ).
 */
#ifndef HTU21D_H
#define HTU21D_H

#include "mbed.h"


/**
    Example:

#include "mbed.h"
#include "HTU21D.h"

HTU21D myTempRXSensor      ( I2C_SDA, I2C_SCL, HTU21D::HTU21D_ADDRESS, 400000 );
Serial pc                  ( USBTX, USBRX );                                                 // tx, rx


Ticker serial;

DigitalOut myled(LED1);

HTU21D::Vector_temperature_f    myTemperature;
HTU21D::Vector_humidity_f       myHumidity;



void sendDATA ( void )
{
    HTU21D::HTU21D_user_register_status_t myBatteryStatus;
    
    myled = 1;
    
    // Get Temperature
    myTempRXSensor.HTU21D_TriggerTemperature ();
    myTempRXSensor.HTU21D_ReadTemperature    ( &myTemperature );
    
    // Get Humidity
    myTempRXSensor.HTU21D_TriggerHumidity ();
    myTempRXSensor.HTU21D_ReadHumidity    ( &myHumidity );
    
    // Get Battery Status
    myTempRXSensor.HTU21D_BatteryStatus   ( &myBatteryStatus );
    
    // Send data through the UART
    pc.printf( "\nTemperature: %0.01f\nHumidity: %0.01f\n", myTemperature.Temperature, myHumidity.Humidity );
    
    if ( myBatteryStatus == HTU21D::STATUS_END_BATTERY_HIGH_2V25 )
        pc.printf( "Battery status higher than 2.25V\r\n" );
    else
        pc.printf( "Battery status lower than 2.25V\r\n" );
        
    myled = 0;
}


int main()
{
    pc.baud ( 115200 );

    myTempRXSensor.HTU21D_SoftReset ();
    myTempRXSensor.HTU21D_Init      ( HTU21D::MODE_NO_HOLD_MASTER, HTU21D::RESOLUTION_12RH_14TEMP, HTU21D::HEATER_DISABLED );


    serial.attach( &sendDATA, 1 );                      // the address of the function to be attached ( sendDATA ) and the interval ( 1s )

    // Let the callbacks take care of everything
    while(1)  sleep();
}
*/


/*!
 Library for the HTU21D Digital humidity sensor with temperature output.
*/
class HTU21D
{
public:
    /**
      * @brief   DEFAULT ADDRESSES
      */
    typedef enum {
        HTU21D_ADDRESS     =   ( 0x40 << 1 )
    } HTU21D_address_t;


    /**
     * @brief   COMMAND REGISTERS
     */
#define HTU21D_TRIGGER_TEMPERATURE_MEASUREMENT_HOLD_MASTER          0xE3
#define HTU21D_TRIGGER_HUMIDITY_MEASUREMENT_HOLD_MASTER             0xE5
#define HTU21D_TRIGGER_TEMPERATURE_MEASUREMENT_NO_HOLD_MASTER       0xF3
#define HTU21D_TRIGGER_HUMIDITY_MEASUREMENT_NO_HOLD_MASTER          0xF5
#define HTU21D_WRITE_REGISTER                                       0xE6
#define HTU21D_READ_REGISTER                                        0xE7
#define HTU21D_SOFT_RESET                                           0xFE


    /* User Register */
    /**
      * @brief   RESOLUTION
      */
    typedef enum {
        RESOLUTION_12RH_14TEMP          =   0,          /*!<  Resolution: RH 12-bits, T 14-bits                 */
        RESOLUTION_8RH_12TEMP           =   1,          /*!<  Resolution: RH 8-bits, T 12-bits                  */
        RESOLUTION_10RH_13TEMP          =   2,          /*!<  Resolution: RH 10-bits, T 13-bits                 */
        RESOLUTION_11RH_11TEMP          =   3           /*!<  Resolution: RH 11-bits, T 11-bits                 */
    } HTU21D_user_register_resolution_t;
    
    /**
      * @brief   STATUS: END OF BATTERY
      */
    typedef enum {
        STATUS_END_BATTERY_HIGH_2V25     =   0,         /*!<  Status: RH 12-bits, T 14-bits                      */
        STATUS_END_BATTERY_LOW_2V25      =   1          /*!<  Status: RH 8-bits, T 12-bits                       */
    } HTU21D_user_register_status_t;
    
    /**
      * @brief   ON-CHIP HEATER
      */
    typedef enum {
        HEATER_ENABLED                  =   0,          /*!<  Heater enabled                                    */
        HEATER_DISABLED                 =   1           /*!<  Heater disabled                                   */
    } HTU21D_user_register_heater_t;
    
    /**
      * @brief   OTP RELOAD
      */
    typedef enum {
        OTP_ENABLED                     =   0,          /*!<  OTP enabled                                       */
        OTP_DISABLED                    =   1           /*!<  OTP disabled                                      */
    } HTU21D_user_register_otp_t;


    
    /* Mode of working */
    /**
      * @brief   MODE
      */
    typedef enum {
        MODE_HOLD_MASTER                =   0,          /*!<  Mode Hold master                                 */
        MODE_NO_HOLD_MASTER             =   1           /*!<  Mode No hold master                              */
    } HTU21D_master_mode_t;





#ifndef VECTOR_STRUCT_H
#define VECTOR_STRUCT_H
    typedef struct {
        char RawTemperature[3];
    } Vector_raw_temperature_t;

    typedef struct {
        char RawHumidity[3];
    } Vector_raw_humidity_t;
    
    typedef struct {
        float Temperature;
    } Vector_temperature_f;

    typedef struct {
        float Humidity;
    } Vector_humidity_f;
#endif


    /**
      * @brief   INTERNAL CONSTANTS
      */
    typedef enum {
        HTU21D_SUCCESS     =       0,
        HTU21D_FAILURE     =       1,
        I2C_SUCCESS        =       0                                           /*!<   I2C communication was fine     */
    } HTU21D_status_t;




    /** Create an HTU21D object connected to the specified I2C pins.
      *
      * @param sda     I2C data pin
      * @param scl     I2C clock pin
      * @param addr    I2C slave address
      * @param freq    I2C frequency in Hz.
      */
    HTU21D ( PinName sda, PinName scl, uint32_t addr, uint32_t freq );

    /** Delete HTU21D object.
     */
    ~HTU21D();

    /** It configures the device.
     */
    HTU21D_status_t  HTU21D_Init                          ( HTU21D_master_mode_t myMode, HTU21D_user_register_resolution_t myResolution, HTU21D_user_register_heater_t myHeater );

    /** It resets the device by software.
     */
    HTU21D_status_t  HTU21D_SoftReset                     ( void );

    /** It triggers a new temperature measurement.
     */
    HTU21D_status_t  HTU21D_TriggerTemperature            ( void );

    /** It reads the raw temperature.
     */
    HTU21D_status_t  HTU21D_ReadRawTemperature            ( Vector_raw_temperature_t* myRawTemperature );
    
    /** It reads the temperature.
     */
    HTU21D_status_t  HTU21D_ReadTemperature               ( Vector_temperature_f* myTemperature );

    /** It triggers a new humidity measurement.
     */
    HTU21D_status_t  HTU21D_TriggerHumidity               ( void );

    /** It reads the raw humidity.
     */
    HTU21D_status_t  HTU21D_ReadRawHumidity               ( Vector_raw_humidity_t* myRawHumidity );
    
    /** It reads the humidity.
     */
    HTU21D_status_t  HTU21D_ReadHumidity                  ( Vector_humidity_f* myHumidity );

    /** It gets the battery status.
     */
    HTU21D_status_t  HTU21D_BatteryStatus                 ( HTU21D_user_register_status_t* myBattStatus );

private:
    I2C      i2c;
    uint32_t HTU21D_Addr;
    uint32_t HTU21D_Mode;
    uint32_t HTU21D_Resolution;
};

#endif