Manuel Caballero / SHT3X
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers SHT3X.h Source File

SHT3X.h

00001 /**
00002  * @brief       SHT3X.h
00003  * @details     Humidity and Temperature Sensor.
00004  *              Header file.
00005  *
00006  *
00007  * @return      N/A
00008  *
00009  * @author      Manuel Caballero
00010  * @date        25/March/2021
00011  * @version     25/March/2021    The ORIGIN
00012  * @pre         N/A
00013  * @warning     N/A
00014  * @pre         This code belongs to Nimbus Centre ( http://www.nimbus.cit.ie ).
00015  */
00016 #ifndef SHT3X_H_
00017 #define SHT3X_H_
00018 
00019 #include "mbed.h"
00020 
00021 
00022 /**
00023     Example:
00024 
00025 @code
00026 #include "mbed.h"
00027 #include "SHT3X.h"
00028 
00029 SHT3X mySHT3X ( I2C_SDA, I2C_SCL, SHT3X::SHT3X_ADDRESS_B, 400000 );             // I2C_SDA | I2C_SCL
00030 Serial pc     ( USBTX, USBRX );                                                 // tx, rx
00031 
00032 DigitalOut  myled   ( LED1 );
00033 Ticker      newAction;
00034 
00035 
00036 //@brief Constants.
00037 
00038 
00039 //@brief Variables.
00040 volatile uint32_t myState;                                                      // State that indicates when to perform a new sample
00041 
00042 
00043 //@brief   FUNCTION PROTOTYPES
00044 void    changeDATA     ( void );
00045 
00046 
00047 //@brief FUNCTION FOR APPLICATION MAIN ENTRY.
00048 int main()
00049 {
00050     SHT3X::SHT3X_status_t aux;
00051     SHT3X::SHT3X_data_t   mySHT3X_Data;
00052 
00053     pc.baud ( 115200 );
00054 
00055     myled   =   1;
00056     wait(3);
00057     myled   =   0;
00058 
00059     // Set a software reset
00060     aux  =   mySHT3X.SHT3X_SetSoftReset ();
00061     wait_ms(2U);
00062 
00063     // Clear the STATUS register
00064     aux  =   mySHT3X.SHT3X_ClearStatus ();
00065 
00066     // Disable the Heater
00067     aux  =   mySHT3X.SHT3X_SetHeater ( SHT3X::SHT3X_HEATER_DISABLE );
00068 
00069     // Do not perform periodic measurement
00070     aux  =   mySHT3X.SHT3X_SetBreakCommand ();
00071 
00072     myState  =   0UL;                                                           // Reset the variable
00073     newAction.attach( &changeDATA, 1U );                                        // the address of the function to be attached ( changeDATA ) and the interval ( 1s )
00074 
00075     // Let the callbacks take care of everything
00076     while(1) {
00077         sleep();
00078 
00079         if ( myState == 1UL ) {
00080             myled = 1U;
00081 
00082             // Trigger to get a new data set, no clock stretching and repeatibility high
00083             aux  =   mySHT3X.SHT3X_OneShotTriggerAllData ( SHT3X::SHT3X_CLOCK_STRETCHING_DISABLED_REPEATABILITY_HIGH );
00084             wait_ms(15U);
00085 
00086             // Get all the data
00087             aux  =   mySHT3X.SHT3X_OneShotGetAllRawData ( &mySHT3X_Data.rawData );
00088 
00089 
00090             // Process all the data
00091             mySHT3X.SHT3X_ProccessData ( mySHT3X_Data.rawData, &mySHT3X_Data.data );
00092 
00093             // Send data through the UART
00094             pc.printf ( "T: %0.2f C, RH: %0.2f %%\r\n", mySHT3X_Data.data.temperature, mySHT3X_Data.data.relativeHumidity );
00095 
00096 
00097             // Reset the variables
00098             myState  =   0UL;
00099             myled    =   0U;
00100         }
00101     }
00102 }
00103 
00104 
00105 // @brief       changeDATA ( void  )
00106 //
00107 // @details     It changes myState variable
00108 //
00109 // @param[in]    N/A
00110 //
00111 // @param[out]   N/A.
00112 //
00113 // @return       N/A.
00114 //
00115 // @author      Manuel Caballero
00116 // @date        25/March/2021
00117 // @version     25/March/2021   The ORIGIN
00118 // @pre         N/A
00119 // @warning     N/A.
00120 void changeDATA ( void )
00121 {
00122     myState  =   1UL;
00123 }
00124 @endcode
00125 */
00126 
00127 
00128 /*!
00129  Library for the SHT3X Humidity and Temperature Sensor.
00130 */
00131 class SHT3X
00132 {
00133 public:
00134     /**
00135     * @brief   DEFAULT ADDRESSES
00136     */
00137     typedef enum {
00138         SHT3X_ADDRESS_A      =   ( 0x44 << 1U ),             /*!<   SHT3X ADDR pin connected to logic low   */
00139         SHT3X_ADDRESS_B      =   ( 0x45 << 1U )              /*!<   SHT3X ADDR pin connected to logic high  */
00140     } SHT3X_address_t;
00141 
00142 
00143 
00144     /**
00145       * @brief   COMMAND REGISTERS
00146       */
00147     typedef enum {
00148         SHT3X_CLOCK_STRETCHING_ENABLED_REPEATABILITY_HIGH      = 0x2C06,   /*!<  High repeatability measurement with clock stretching enabled    */
00149         SHT3X_CLOCK_STRETCHING_ENABLED_REPEATABILITY_MEDIUM    = 0x2C0D,   /*!<  Medium repeatability measurement with clock stretching enabled  */
00150         SHT3X_CLOCK_STRETCHING_ENABLED_REPEATABILITY_LOW       = 0x2C10,   /*!<  Low repeatability measurement with clock stretching enabled     */
00151 
00152         SHT3X_CLOCK_STRETCHING_DISABLED_REPEATABILITY_HIGH     = 0x2400,   /*!<  High repeatability measurement with clock stretching disabled   */
00153         SHT3X_CLOCK_STRETCHING_DISABLED_REPEATABILITY_MEDIUM   = 0x240B,   /*!<  Medium repeatability measurement with clock stretching disabled */
00154         SHT3X_CLOCK_STRETCHING_DISABLED_REPEATABILITY_LOW      = 0x2416,   /*!<  Low repeatability measurement with clock stretching disabled    */
00155     } SHT3X_command_registers_single_shot_mode_t;
00156 
00157 
00158     typedef enum {
00159         SHT3X_HEATER_ENABLE                                    = 0x306D,   /*!<  Heater enable command                                           */
00160         SHT3X_HEATER_DISABLE                                   = 0x3066,   /*!<  Heater disable command                                          */
00161     } SHT3X_command_registers_heater_t ;
00162 
00163 
00164     typedef enum {
00165         SHT3X_MPS_0_5_REPEATABILITY_HIGH                       = 0x2032,   /*!<  High repeatability 0.5 measurement per second                   */
00166         SHT3X_MPS_0_5_REPEATABILITY_MEDIUM                     = 0x2024,   /*!<  Medium repeatability 0.5 measurement per second                 */
00167         SHT3X_MPS_0_5_REPEATABILITY_LOW                        = 0x202F,   /*!<  Low repeatability 0.5 measurement per second                    */
00168 
00169         SHT3X_MPS_1_REPEATABILITY_HIGH                         = 0x2130,   /*!<  High repeatability 1 measurement per second                     */
00170         SHT3X_MPS_1_REPEATABILITY_MEDIUM                       = 0x2126,   /*!<  Medium repeatability 1 measurement per second                   */
00171         SHT3X_MPS_1_REPEATABILITY_LOW                          = 0x212D,   /*!<  Low repeatability 1 measurement per second                      */
00172 
00173         SHT3X_MPS_2_REPEATABILITY_HIGH                         = 0x2236,   /*!<  High repeatability 2 measurement per second                     */
00174         SHT3X_MPS_2_REPEATABILITY_MEDIUM                       = 0x2220,   /*!<  Medium repeatability 2 measurement per second                   */
00175         SHT3X_MPS_2_REPEATABILITY_LOW                          = 0x222B,   /*!<  Low repeatability 2 measurement per second                      */
00176 
00177         SHT3X_MPS_4_REPEATABILITY_HIGH                         = 0x2334,   /*!<  High repeatability 4 measurement per second                     */
00178         SHT3X_MPS_4_REPEATABILITY_MEDIUM                       = 0x2322,   /*!<  Medium repeatability 4 measurement per second                   */
00179         SHT3X_MPS_4_REPEATABILITY_LOW                          = 0x2329,   /*!<  Low repeatability 4 measurement per second                      */
00180 
00181         SHT3X_MPS_10_REPEATABILITY_HIGH                        = 0x2737,   /*!<  High repeatability 10 measurement per second                    */
00182         SHT3X_MPS_10_REPEATABILITY_MEDIUM                      = 0x2721,   /*!<  Medium repeatability 10 measurement per second                  */
00183         SHT3X_MPS_10_REPEATABILITY_LOW                         = 0x272A,   /*!<  Low repeatability 10 measurement per second                     */
00184     } SHT3X_command_registers_periodic_data_mode_t ;
00185 
00186 
00187     typedef enum {
00188         SHT3X_FETCH_DATA                                       = 0xE000,   /*!<  Fetch data command                                              */
00189         SHT3X_PERIODIC_MESUREMENT_WITH_ART                     = 0x2B32,   /*!<  ART command                                                     */
00190         SHT3X_BREAK                                            = 0x3093,   /*!<  Break command                                                   */
00191         SHT3X_SOFT_RESET                                       = 0x30A2,   /*!<  Software reset command                                          */
00192         SHT3X_STATUS_REGISTER                                  = 0xF32D,   /*!<  Status command                                                  */
00193         SHT3X_CLEAR_STATUS_REGISTER                            = 0x3041    /*!<  Clear Status register command                                   */
00194     } SHT3X_command_registers_t ;
00195 
00196 
00197 
00198 // GENERAL CALL
00199     /**
00200       * @brief   RESET
00201       */
00202     typedef enum {
00203         SHT3X_GENERAL_CALL_RESET_ADDRESS_BYTE  = 0x00,     /*!<  Reset. Address byte                                   */
00204         SHT3X_GENERAL_CALL_RESET_SECOND_BYTE   = 0x06      /*!<  Reset. Second byte                                    */
00205     } SHT3X_general_call_t;
00206 
00207 
00208 
00209     /**
00210      * @brief   STATUS REGISTER.
00211      *           NOTE: N/A.
00212      */
00213     /* ALERT_PENDING_STATUS <15>
00214      *    NOTE: N/A.
00215      */
00216     typedef enum {
00217         STATUS_ALERT_PENDING_STATUS_MASK                         =   ( 1U << 15U ),    /*!<  ALERT_PENDING_STATUS mask                            */
00218         STATUS_ALERT_PENDING_STATUS_NO_PENDING_ALERTS            =   ( 0U << 15U ),    /*!<  No pending alerts                                    */
00219         STATUS_ALERT_PENDING_STATUS_AT_LEAST_ONE_PENDING_ALERT   =   ( 1U << 15U )     /*!<  At least one pending alert                 [Default] */
00220     } SHT3X_status_alert_pending_status_t;
00221 
00222 
00223     /* HEATER_STATUS <13>
00224      *    NOTE: N/A.
00225      */
00226     typedef enum {
00227         STATUS_HEATER_STATUS_MASK                                =   ( 1U << 13U ),    /*!<  HEATER_STATUS mask                                   */
00228         STATUS_HEATER_OFF                                        =   ( 0U << 13U ),    /*!<  Heater off                                 [Default] */
00229         STATUS_HEATER_ON                                         =   ( 1U << 13U )     /*!<  Heater on                                            */
00230     } SHT3X_status_heater_status_t ;
00231 
00232 
00233     /* RH_TRACKING_ALERT <11>
00234      *    NOTE: N/A.
00235      */
00236     typedef enum {
00237         STATUS_RH_TRACKING_ALERT_MASK                            =   ( 1U << 11U ),    /*!<  RH_TRACKING_ALERT mask                               */
00238         STATUS_RH_TRACKING_ALERT_NO_ALERT                        =   ( 0U << 11U ),    /*!<  No alert                                   [Default] */
00239         STATUS_RH_TRACKING_ALERT_ALERT                           =   ( 1U << 11U )     /*!<  Alert                                                */
00240     } SHT3X_status_rh_tracking_alert_t ;
00241 
00242 
00243     /* T_TRACKING_ALERT <10>
00244      *    NOTE: N/A.
00245      */
00246     typedef enum {
00247         STATUS_T_TRACKING_ALERT_MASK                             =   ( 1U << 10U ),    /*!<  T_TRACKING_ALERT mask                                */
00248         STATUS_T_TRACKING_ALERT_NO_ALERT                         =   ( 0U << 10U ),    /*!<  No alert                                   [Default] */
00249         STATUS_T_TRACKING_ALERT_ALERT                            =   ( 1U << 10U )     /*!<  Alert                                                */
00250     } SHT3X_status_t_tracking_alert_t ;
00251 
00252 
00253     /* SYSTEM_RESET_DETECTED <4>
00254      *    NOTE: N/A.
00255      */
00256     typedef enum {
00257         STATUS_SYSTEM_RESET_DETECTED_MASK                        =   ( 1U << 4U ),     /*!<  SYSTEM_RESET_DETECTED mask                                              */
00258         STATUS_SYSTEM_RESET_DETECTED_NO_RESET_DETECTED           =   ( 0U << 4U ),     /*!<  No reset detected since last 'clear status register' command            */
00259         STATUS_SYSTEM_RESET_DETECTED_RESET_DETECTED              =   ( 1U << 4U )      /*!<  Reset detected (hard reset, soft reset command or supply fail)[Default] */
00260     } SHT3X_status_system_reset_detected_t ;
00261 
00262 
00263     /* COMMAND_STATUS <1>
00264      *    NOTE: N/A.
00265      */
00266     typedef enum {
00267         STATUS_COMMAND_STATUS_MASK                               =   ( 1U << 10U ),    /*!<  COMMAND_STATUS mask                                  */
00268         STATUS_COMMAND_STATUS_COMMAND_EXECUTED_SUCCESSFULLY      =   ( 0U << 10U ),    /*!<  Last command executed successfully         [Default] */
00269         STATUS_COMMAND_STATUS_LAST_COMMAND_NOT_PROCESSED         =   ( 1U << 10U )     /*!<  Last command not processed                           */
00270     } SHT3X_status_command_status_t ;
00271 
00272 
00273     /* WRITE_DATA_CHECKSUM_STATUS <0>
00274      *    NOTE: N/A.
00275      */
00276     typedef enum {
00277         STATUS_WRITE_DATA_CHECKSUM_STATUS_MASK                   =   ( 1U << 0U ),     /*!<  COMMAND_STATUS mask                                  */
00278         STATUS_WRITE_DATA_CHECKSUM_STATUS_CHECKSUM_CORRECT       =   ( 0U << 0U ),     /*!<  Checksum of last write transfer was correct[Default] */
00279         STATUS_WRITE_DATA_CHECKSUM_STATUS_CHECKSUM_FAILED        =   ( 1U << 0U )      /*!<  Checksum of last write transfer failed               */
00280     } SHT3X_status_write_data_checksum_status_t ;
00281 
00282 
00283 
00284 
00285 
00286 #ifndef SHT3X_VECTOR_STRUCT_H
00287 #define SHT3X_VECTOR_STRUCT_H
00288     /* RAW DATA  */
00289     typedef struct {
00290         uint16_t rawRelativeHumidity;
00291         uint16_t rawTemperature;
00292 
00293         uint8_t  temperatureCRC;
00294         uint8_t  relativeHumidityCRC;
00295     } SHT3X_raw_data_t;
00296 
00297 
00298     /* DATA: Temperature and Relative Humidity  */
00299     typedef struct {
00300         float relativeHumidity;
00301         float temperature;
00302 
00303         uint8_t  temperatureCRC;
00304         uint8_t  relativeHumidityCRC;
00305     } SHT3X_final_data_t;
00306 
00307 
00308     /* STATUS REGISTER  */
00309     typedef struct {
00310         uint16_t status;
00311         uint8_t  statusCRC;
00312     } SHT3X_status_data_t;
00313 
00314 
00315 
00316     /* USER: User's variables  */
00317     typedef struct {
00318         /* Output data   */
00319         SHT3X_raw_data_t    rawData;
00320         SHT3X_final_data_t  data;
00321 
00322         /* Status register  */
00323         SHT3X_status_data_t status;
00324     } SHT3X_data_t;
00325 #endif
00326 
00327 
00328 
00329 
00330 
00331     /**
00332       * @brief   INTERNAL CONSTANTS
00333       */
00334     typedef enum {
00335         SHT3X_SUCCESS     =       0,
00336         SHT3X_FAILURE     =       1,
00337         I2C_SUCCESS       =       0
00338     } SHT3X_status_t;
00339 
00340 
00341 
00342     /**
00343       * @brief   FUNCTION PROTOTYPES
00344       */
00345     /** Create an SHT3X object connected to the specified I2C pins.
00346       *
00347       * @param sda     I2C data pin
00348       * @param scl     I2C clock pin
00349       * @param addr    I2C slave address
00350       * @param freq    I2C frequency in Hz.
00351       */
00352     SHT3X ( PinName sda, PinName scl, uint32_t addr, uint32_t freq );
00353 
00354     /** Delete SHT3X object.
00355      */
00356     ~SHT3X();
00357 
00358     /** It triggers all the raw data in single shot mode.
00359       */
00360     SHT3X_status_t  SHT3X_OneShotTriggerAllData     ( SHT3X_command_registers_single_shot_mode_t mode       );
00361 
00362     /** It gets all the raw data in single shot mode.
00363       */
00364     SHT3X_status_t  SHT3X_OneShotGetAllRawData      ( SHT3X_raw_data_t* rawData                             );
00365 
00366     /** It sets periodic measurement with ART (accelerated response time).
00367       */
00368     SHT3X_status_t  SHT3X_SetPeriodicMeasurementART ( void                                                  );
00369 
00370     /** It sets the break command (stop periodic data acquisition mode).
00371       */
00372     SHT3X_status_t  SHT3X_SetBreakCommand           ( void                                                  );
00373 
00374     /** It perfoms a software reset.
00375       */
00376     SHT3X_status_t  SHT3X_SetSoftReset              ( void                                                  );
00377 
00378     /** It perfoms a reset through a general call address.
00379       */
00380     SHT3X_status_t  SHT3X_SetGeneralCallReset       ( void                                                  );
00381 
00382     /** It sets the heater.
00383       */
00384     SHT3X_status_t  SHT3X_SetHeater                 ( SHT3X_command_registers_heater_t  heater               );
00385 
00386     /** It gets the status register.
00387       */
00388     SHT3X_status_t  SHT3X_GetStatus                 ( SHT3X_status_data_t* status                           );
00389 
00390     /** It clears the status register.
00391       */
00392     SHT3X_status_t  SHT3X_ClearStatus               ( void                                                  );
00393 
00394     /** It sets the periodic data aquisition mode.
00395       */
00396     SHT3X_status_t  SHT3X_SetPeriodicAquisitionMode ( SHT3X_command_registers_periodic_data_mode_t  mo       );
00397 
00398     /** It gets the all raw data (in periodic aquisition mode).
00399       */
00400     SHT3X_status_t  SHT3X_GetAllRawDataFetchData    ( SHT3X_raw_data_t* rawData                             );
00401 
00402     /** It processes all data: Temperature and Relative Humidity.
00403       */
00404     void            SHT3X_ProccessData              ( SHT3X_raw_data_t rawData, SHT3X_final_data_t* data    );
00405 
00406 private:
00407     I2C      _i2c;
00408     uint32_t _SHT3X_Addr;
00409 };
00410 
00411 #endif /* SHT3X_H */