I2C HUMIDITY AND TEMPERATURE SENSOR

Dependents:   dashboard_f1

SI7021.h

Committer:
mcm
Date:
2018-02-05
Revision:
1:54da1ce19764
Parent:
0:3d466d4c2cd2
Child:
3:75cece7f7329

File content as of revision 1:54da1ce19764:

/**
 * @brief       SI7021.h
 * @details     I2C HUMIDITY AND TEMPERATURE SENSOR.
 *              Header file.
 *
 *
 * @return      NA
 *
 * @author      Manuel Caballero
 * @date        5/February/2018
 * @version     5/February/2018    The ORIGIN
 * @pre         NaN.
 * @warning     NaN
 * @pre         This code belongs to AqueronteBlog ( http://unbarquero.blogspot.com ).
 */
#ifndef SI7021_H
#define SI7021_H

#include "mbed.h"


/**
    Example:

[todo]

*/


/*!
 Library for the SI7021 I2C Humidity and Temperature sensor.
*/
class SI7021
{
public:
    /**
    * @brief   DEFAULT ADDRESSES
    */
    typedef enum {
        SI7021_ADDRESS     =   ( 0x40 << 1 )                                                /*!<   SI7021 I2C Address                                   */
    } SI7021_address_t;


// REGISTERS
    /**
      * @brief   COMMAND CODE
      */
    typedef enum {
        SI7021_MEASURE_RELATIVE_HUMIDITY_HOLD_MASTER_MODE           =   0xE5,               /*!<  Measure Relative Humidity, Hold Master Mode           */
        SI7021_MEASURE_RELATIVE_HUMIDITY_NO_HOLD_MASTER_MODE        =   0xF5,               /*!<  Measure Relative Humidity, No Hold Master Mode        */
        SI7021_MEASURE_TEMPERATURE_HOLD_MASTER_MODE                 =   0xE3,               /*!<  Measure Temperature, Hold Master Mode                 */
        SI7021_MEASURE_TEMPERATURE_NO_HOLD_MASTER_MODE              =   0xF3,               /*!<  Measure Temperature, No Hold Master Mode              */
        SI7021_READ_TEMPERATURE_VALUE_FROM_PREVIOUS_RH_MEASUREMENT  =   0xE0,               /*!<  Read Temperature Value from Previous RH Measurement   */
        SI7021_RESET                                                =   0xFE,               /*!<  Reset                                                 */
        SI7021_WRITE_RH_T_USER_REGISTER_1                           =   0xE6,               /*!<  Write RH/T User Register 1                            */
        SI7021_READ_RH_T_USER_REGISTER_1                            =   0xE7,               /*!<  Read RH/T User Register 1                             */
        SI7021_WRITE_HEATER_CONTROL_REGISTER                        =   0x51,               /*!<  Write Heater Control Register                         */
        SI7021_READ_HEATER_CONTROL_REGISTER                         =   0x11,               /*!<  Read Heater Control Register                          */
        SI7021_READ_ELECTRONIC_ID_FIRST_BYTE_CMD1                   =   0xFA,               /*!<  Read Electronic ID 1st Byte                           */
        SI7021_READ_ELECTRONIC_ID_FIRST_BYTE_CMD2                   =   0x0F,               /*!<  Read Electronic ID 1st Byte                           */
        SI7021_READ_ELECTRONIC_ID_SECOND_BYTE_CMD1                  =   0xFC,               /*!<  Read Electronic ID 2nd Byte                           */
        SI7021_READ_ELECTRONIC_ID_SECOND_BYTE_CMD2                  =   0xC9,               /*!<  Read Electronic ID 2nd Byte                           */
        SI7021_READ_FIRMWARE_VERSION_CMD1                           =   0x84,               /*!<  Read Firmware Revision                                */
        SI7021_READ_FIRMWARE_VERSION_CMD2                           =   0xB8                /*!<  Read Firmware Revision                                */
    } SI7021_command_code_t;



// MASTER MODE
    /**
      * @brief   MEASUREMENT RESOLUTION
      */
    typedef enum {
        SI7021_HOLD_MASTER_MODE                 =   0x01,           /*!<  SI7021 HOLD MASTER MODE enabled                       */
        SI7021_NO_HOLD_MASTER_MODE              =   0x00            /*!<  SI7021 NO HOLD MASTER MODE enabled                    */
    } SI7021_master_mode_t;



// USER REGISTER 1
    /*
        NOTE:   Reset Settings = 0011_1010.
                Except where noted, reserved register bits will always read back as “1,” and are not affected by write operations. For
                future compatibility, it is recommended that prior to a write operation, registers should be read. Then the values read
                from the RSVD bits should be written back unchanged during the write operation.
    */
    /**
      * @brief   MEASUREMENT RESOLUTION
      */
    typedef enum {
        SI7021_RESOLUTION_MASK                  =   0x81,           /*!<  SI7021 Measurement Resolution                         */
        SI7021_RESOLUTION_RH_12_TEMP_14         =   0x00,           /*!<  SI7021 12b RH 14b Temp.                               */
        SI7021_RESOLUTION_RH_8_TEMP_12          =   0x01,           /*!<  SI7021 9b  RH 12b Temp.                               */
        SI7021_RESOLUTION_RH_10_TEMP_13         =   0x80,           /*!<  SI7021 10b RH 13b Temp.                               */
        SI7021_RESOLUTION_RH_11_TEMP_11         =   0x81            /*!<  SI7021 11b RH 11b Temp.                               */
    } SI7021_measurement_resolution_t;



    /**
      * @brief   VDDS
      */
    /*
        NOTE:   The minimum recommended operating voltage is 1.9 V. A transition
                of the VDD status bit from 0 to 1 indicates that VDD is
                between 1.8 V and 1.9 V. If the VDD drops below 1.8 V, the
                device will no longer operate correctly.
    */
    typedef enum {
        SI7021_VDDS_STATUS_MASK                 =   0x40,           /*!<  SI7021 VDD mask.                                      */
        SI7021_VDDS_STATUS_VDD_OK               =   ( 0 << 6 ),     /*!<  VDD OK.                                               */
        SI7021_VDDS_STATUS_VDD_LOW              =   ( 1 << 6 )      /*!<  VDD Low.                                              */
    } SI7021_vdds_status_t;



    /**
      * @brief   HTRE
      */
    typedef enum {
        SI7021_HTRE_MASK                        =   0x03,           /*!<  SI7021 HTRE Mask                                      */
        SI7021_HTRE_ENABLED                     =   ( 1 << 2 ),     /*!<  SI7021 On-chip Heater Enable                          */
        SI7021_HTRE_DISABLED                    =   ( 0 << 2 )      /*!<  SI7021 On-chip Heater Disable                         */
    } SI7021_heater_t;






#ifndef SI7021_VECTOR_STRUCT_H
#define SI7021_VECTOR_STRUCT_H
    typedef struct {
        float                 RelativeHumidity;
        float                 Temperature;

        uint32_t              ElectronicSerialNumber_LSB;
        uint32_t              ElectronicSerialNumber_MSB;

        uint8_t               FirmwareRevision;
        SI7021_vdds_status_t  BatteryStatus;
    } SI7021_vector_data_t;
#endif



    /**
      * @brief   INTERNAL CONSTANTS
      */
    typedef enum {
        SI7021_SUCCESS     =       0,
        SI7021_FAILURE     =       1,
        I2C_SUCCESS        =       0                                            /*!<   I2C communication was fine        */
    } SI7021_status_t;




    /** Create an SI7021 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.
      */
    SI7021 ( PinName sda, PinName scl, uint32_t addr, uint32_t freq );

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

    /** It configures the device: resolution and heater.
    */
    SI7021_status_t  SI7021_Conf                        ( SI7021_measurement_resolution_t myResolution, SI7021_heater_t myHeater );

    /** It performs a software reset.
      */
    SI7021_status_t  SI7021_SoftReset                   ( void );

    /** It gets the electronic serial number.
      */
    SI7021_status_t  SI7021_GetElectronicSerialNumber   ( SI7021_vector_data_t* mySerialNumber );

    /** It gets the firmware revision.
      */
    SI7021_status_t  SI7021_GetFirmwareRevision         ( SI7021_vector_data_t* myFirmwareRevision );

    /** It sets the heater current.
      */
    SI7021_status_t  SI7021_SetHeaterCurrent            ( char myHeaterCurrent );

    /** It performs a new temperature measurement.
      */
    SI7021_status_t  SI7021_TriggerTemperature          ( SI7021_master_mode_t myMode );

    /** It read the temperature.
      */
    SI7021_status_t  SI7021_ReadTemperature             ( SI7021_vector_data_t* myTemperature );

    /** It reads the raw data from temperature.
      */
    SI7021_status_t  SI7021_ReadRawTemperature          ( SI7021_vector_data_t* myTemperature );

    /** It reads the raw temperature data after a relative humidity measurement was done.
      */
    SI7021_status_t  SI7021_ReadRawTemperatureFromRH    ( SI7021_vector_data_t* myTemperature );

    /** It reads the temperature after a relative humidity measurement was done.
      */
    SI7021_status_t  SI7021_ReadTemperatureFromRH       ( SI7021_vector_data_t* myTemperature );

    /** It performs a new relative humidity measurement.
      */
    SI7021_status_t  SI7021_TriggerHumidity             ( SI7021_master_mode_t myMode );

    /** It reads the relative humidity.
      */
    SI7021_status_t  SI7021_ReadHumidity                ( SI7021_vector_data_t* myHumidity );

    /** It reads the raw data from relative humidity.
      */
    SI7021_status_t  SI7021_ReadRawHumidity             ( SI7021_vector_data_t* myHumidity );

    /** It gets the battery status.
      */
    SI7021_status_t  SI7021_GetBatteryStatus            ( SI7021_vector_data_t* myBatteryStatus );




private:
    I2C         _i2c;
    uint32_t    _SI7021_Addr;
};

#endif