Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: Arduino_Nano33BLESense_examples
HTS221.cpp
- Committer:
- mcm
- Date:
- 2019-05-31
- Revision:
- 2:a975c212f502
- Parent:
- 0:21b3c0c7b5f7
File content as of revision 2:a975c212f502:
/**
* @brief HTS221.cpp
* @details Capacitive digital sensor for relative humidity and temperature.
* Function file.
*
*
* @return N/A
*
* @author Manuel Caballero
* @date 31/May/2019
* @version 31/May/2019 The ORIGIN
* @pre N/A.
* @warning N/A
* @pre This code belongs to AqueronteBlog ( http://unbarquero.blogspot.com ). All rights reserved.
*/
#include "HTS221.h"
HTS221::HTS221 ( PinName sda, PinName scl, uint32_t addr, uint32_t freq )
: _i2c ( sda, scl )
, _HTS221_Addr ( addr )
{
_i2c.frequency( freq );
}
HTS221::~HTS221()
{
}
/**
* @brief HTS221_GetDeviceID ( HTS221_data_t* )
*
* @details It gets the device identification.
*
* @param[in] N/A.
*
* @param[out] myDeviceID: Device ID.
*
*
* @return Status of HTS221_GetDeviceID.
*
*
* @author Manuel Caballero
* @date 31/May/2019
* @version 31/May/2019 The ORIGIN
* @pre N/A
* @warning N/A.
*/
HTS221::HTS221_status_t HTS221::HTS221_GetDeviceID ( HTS221_data_t* myDeviceID )
{
char cmd = 0U;
uint32_t aux;
/* Read the register */
cmd = HTS221_WHO_AM_I;
aux = _i2c.write ( _HTS221_Addr, &cmd, 1U, true );
aux = _i2c.read ( _HTS221_Addr, &cmd, 1U );
/* Mask it and update it with the new value */
myDeviceID->deviceID = cmd;
if ( aux == I2C_SUCCESS ) {
return HTS221_SUCCESS;
} else {
return HTS221_FAILURE;
}
}
/**
* @brief HTS221_SetResolution ( HTS221_data_t )
*
* @details It set humidity and temperature resolution mode.
*
* @param[in] myTempHumResolution: Humidity and Temperature resolution mode.
*
* @param[out] N/A.
*
*
* @return Status of HTS221_SetResolution.
*
*
* @author Manuel Caballero
* @date 31/May/2019
* @version 31/May/2019 The ORIGIN
* @pre N/A
* @warning N/A.
*/
HTS221::HTS221_status_t HTS221::HTS221_SetResolution ( HTS221_data_t myTempHumResolution )
{
char cmd[2] = { 0U };
uint32_t aux;
/* Read the register */
cmd[0] = HTS221_AV_CONF;
aux = _i2c.write ( _HTS221_Addr, &cmd[0], 1U, true );
aux = _i2c.read ( _HTS221_Addr, &cmd[1], 1U );
/* Mask it and update it with the new value */
cmd[1] &= ~( AV_CONF_AVGT_MASK | AV_CONF_AVGH_MASK );
cmd[1] |= ( myTempHumResolution.temperatureResolution | myTempHumResolution.humidityResolution );
aux = _i2c.write ( _HTS221_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
if ( aux == I2C_SUCCESS ) {
return HTS221_SUCCESS;
} else {
return HTS221_FAILURE;
}
}
/**
* @brief HTS221_GetResolution ( HTS221_data_t* )
*
* @details It get humidity and temperature resolution mode.
*
* @param[in] N/A
*
* @param[out] myTempHumResolution: Humidity and Temperature resolution mode
*
*
* @return Status of HTS221_GetResolution.
*
*
* @author Manuel Caballero
* @date 31/May/2019
* @version 31/May/2019 The ORIGIN
* @pre N/A
* @warning N/A.
*/
HTS221::HTS221_status_t HTS221::HTS221_GetResolution ( HTS221_data_t* myTempHumResolution )
{
char cmd = 0U;
uint32_t aux;
/* Read the register */
cmd = HTS221_AV_CONF;
aux = _i2c.write ( _HTS221_Addr, &cmd, 1U, true );
aux = _i2c.read ( _HTS221_Addr, &cmd, 1U );
/* Parse the data */
myTempHumResolution->temperatureResolution = (HTS221_av_config_avgt_t)( cmd & AV_CONF_AVGT_MASK );
myTempHumResolution->humidityResolution = (HTS221_av_config_avgh_t)( cmd & AV_CONF_AVGH_MASK );
if ( aux == I2C_SUCCESS ) {
return HTS221_SUCCESS;
} else {
return HTS221_FAILURE;
}
}
/**
* @brief HTS221_SetPowerDown ( HTS221_ctrl_reg1_pd_t )
*
* @details It sets the device into power-down ( low-power mode ) or active mode.
*
* @param[in] myPowerMode: Power-Down/Active mode.
*
* @param[out] N/A
*
*
* @return Status of HTS221_SetPowerDown.
*
*
* @author Manuel Caballero
* @date 31/May/2019
* @version 31/May/2019 The ORIGIN
* @pre N/A
* @warning N/A.
*/
HTS221::HTS221_status_t HTS221::HTS221_SetPowerDown ( HTS221_ctrl_reg1_pd_t myPowerMode )
{
char cmd[2] = { 0U };
uint32_t aux;
/* Read the register */
cmd[0] = HTS221_CTRL_REG1;
aux = _i2c.write ( _HTS221_Addr, &cmd[0], 1U, true );
aux = _i2c.read ( _HTS221_Addr, &cmd[1], 1U );
/* Update the register */
cmd[1] = ( ( cmd[1] & ~CTRL_REG1_PD_MASK ) | myPowerMode );
aux = _i2c.write ( _HTS221_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
if ( aux == I2C_SUCCESS ) {
return HTS221_SUCCESS;
} else {
return HTS221_FAILURE;
}
}
/**
* @brief HTS221_SetBlockDataUpdate ( HTS221_data_t )
*
* @details It sets the block data update.
*
* @param[in] myBDU: Block data update mode.
*
* @param[out] N/A
*
*
* @return Status of HTS221_SetBlockDataUpdate.
*
*
* @author Manuel Caballero
* @date 31/May/2019
* @version 31/May/2019 The ORIGIN
* @pre N/A
* @warning N/A.
*/
HTS221::HTS221_status_t HTS221::HTS221_SetBlockDataUpdate ( HTS221_data_t myBDU )
{
char cmd[2] = { 0U };
uint32_t aux;
/* Read the register */
cmd[0] = HTS221_CTRL_REG1;
aux = _i2c.write ( _HTS221_Addr, &cmd[0], 1U, true );
aux = _i2c.read ( _HTS221_Addr, &cmd[1], 1U );
/* Update the register */
cmd[1] = ( ( cmd[1] & ~CTRL_REG1_BDU_MASK ) | myBDU.bdu );
aux = _i2c.write ( _HTS221_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
if ( aux == I2C_SUCCESS ) {
return HTS221_SUCCESS;
} else {
return HTS221_FAILURE;
}
}
/**
* @brief HTS221_GetBlockDataUpdate ( HTS221_data_t* )
*
* @details It gets the block data update.
*
* @param[in] N/A.
*
* @param[out] myBDU: Block data update mode
*
*
* @return Status of HTS221_GetBlockDataUpdate.
*
*
* @author Manuel Caballero
* @date 31/May/2019
* @version 31/May/2019 The ORIGIN
* @pre N/A
* @warning N/A.
*/
HTS221::HTS221_status_t HTS221::HTS221_GetBlockDataUpdate ( HTS221_data_t* myBDU )
{
char cmd = 0U;
uint32_t aux;
/* Read the register */
cmd = HTS221_CTRL_REG1;
aux = _i2c.write ( _HTS221_Addr, &cmd, 1U, true );
aux = _i2c.read ( _HTS221_Addr, &cmd, 1U );
/* Parse the data */
myBDU->bdu = (HTS221_ctrl_reg1_bdu_t)( cmd & CTRL_REG1_BDU_MASK );
if ( aux == I2C_SUCCESS ) {
return HTS221_SUCCESS;
} else {
return HTS221_FAILURE;
}
}
/**
* @brief HTS221_SetOutputDataRate ( HTS221_data_t )
*
* @details It sets the output data rate ( ODR ).
*
* @param[in] N/A.
* @param[in] myODR: Output data rate.
*
* @param[out] N/A
*
*
* @return Status of HTS221_SetOutputDataRate.
*
*
* @author Manuel Caballero
* @date 31/May/2019
* @version 31/May/2019 The ORIGIN
* @pre N/A
* @warning N/A.
*/
HTS221::HTS221_status_t HTS221::HTS221_SetOutputDataRate ( HTS221_data_t myODR )
{
char cmd[2] = { 0U };
uint32_t aux;
/* Read the register */
cmd[0] = HTS221_CTRL_REG1;
aux = _i2c.write ( _HTS221_Addr, &cmd[0], 1U, true );
aux = _i2c.read ( _HTS221_Addr, &cmd[1], 1U );
/* Update the register */
cmd[1] = ( ( cmd[1] & ~CTRL_REG1_ODR_MASK ) | myODR.odr );
aux = _i2c.write ( _HTS221_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
if ( aux == I2C_SUCCESS ) {
return HTS221_SUCCESS;
} else {
return HTS221_FAILURE;
}
}
/**
* @brief HTS221_GetOutputDataRate ( HTS221_data_t* )
*
* @details It gets the output data rate ( ODR ).
*
* @param[in] N/A.
*
* @param[out] myODR: Output data rate
*
*
* @return Status of HTS221_GetOutputDataRate.
*
*
* @author Manuel Caballero
* @date 31/May/2019
* @version 31/May/2019 The ORIGIN
* @pre N/A
* @warning N/A.
*/
HTS221::HTS221_status_t HTS221::HTS221_GetOutputDataRate ( HTS221_data_t* myODR )
{
char cmd = 0U;
uint32_t aux;
/* Read the register */
cmd = HTS221_CTRL_REG1;
aux = _i2c.write ( _HTS221_Addr, &cmd, 1U, true );
aux = _i2c.read ( _HTS221_Addr, &cmd, 1U );
/* Parse the data */
myODR->odr = (HTS221_ctrl_reg1_odr_t)( cmd & CTRL_REG1_ODR_MASK );
if ( aux == I2C_SUCCESS ) {
return HTS221_SUCCESS;
} else {
return HTS221_FAILURE;
}
}
/**
* @brief HTS221_SetBoot ( void )
*
* @details It sets reboot memory content.
*
* @param[in] N/A.
*
* @param[out] N/A
*
*
* @return Status of HTS221_SetBoot.
*
*
* @author Manuel Caballero
* @date 31/May/2019
* @version 31/May/2019 The ORIGIN
* @pre At the end of the boot process, the BOOT bit is set again to '0'.
* @warning N/A.
*/
HTS221::HTS221_status_t HTS221::HTS221_SetBoot ( void )
{
char cmd[2] = { 0U };
uint32_t aux;
/* Read the register */
cmd[0] = HTS221_CTRL_REG2;
aux = _i2c.write ( _HTS221_Addr, &cmd[0], 1U, true );
aux = _i2c.read ( _HTS221_Addr, &cmd[1], 1U );
/* Update the register */
cmd[1] = ( ( cmd[1] & ~CTRL_REG2_BOOT_MASK ) | CTRL_REG2_BOOT_REBOOT_MEMORY_CONTENT );
aux = _i2c.write ( _HTS221_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
if ( aux == I2C_SUCCESS ) {
return HTS221_SUCCESS;
} else {
return HTS221_FAILURE;
}
}
/**
* @brief HTS221_GetBoot ( HTS221_data_t* )
*
* @details It gets reboot memory content.
*
* @param[in] N/A.
*
* @param[out] myBOOT: Reboot memory content flag
*
*
* @return Status of HTS221_GetBoot.
*
*
* @author Manuel Caballero
* @date 31/May/2019
* @version 31/May/2019 The ORIGIN
* @pre N/A
* @warning N/A.
*/
HTS221::HTS221_status_t HTS221::HTS221_GetBoot ( HTS221_data_t* myBOOT )
{
char cmd = 0U;
uint32_t aux;
/* Read the register */
cmd = HTS221_CTRL_REG2;
aux = _i2c.write ( _HTS221_Addr, &cmd, 1U, true );
aux = _i2c.read ( _HTS221_Addr, &cmd, 1U );
/* Parse the data */
myBOOT->boot = (HTS221_ctrl_reg2_boot_t)( cmd & CTRL_REG2_BOOT_MASK );
if ( aux == I2C_SUCCESS ) {
return HTS221_SUCCESS;
} else {
return HTS221_FAILURE;
}
}
/**
* @brief HTS221_SetHeater ( HTS221_data_t* )
*
* @details It sets heater mode: Enabled/Disabled.
*
* @param[in] N/A.
* @param[in] myHeater: Heater mode.
*
* @param[out] N/A
*
*
* @return Status of HTS221_SetHeater.
*
*
* @author Manuel Caballero
* @date 31/May/2019
* @version 31/May/2019 The ORIGIN
* @pre N/A
* @warning N/A.
*/
HTS221::HTS221_status_t HTS221::HTS221_SetHeater ( HTS221_data_t myHeater )
{
char cmd[2] = { 0U };
uint32_t aux;
/* Read the register */
cmd[0] = HTS221_CTRL_REG2;
aux = _i2c.write ( _HTS221_Addr, &cmd[0], 1U, true );
aux = _i2c.read ( _HTS221_Addr, &cmd[1], 1U );
/* Update the register */
cmd[1] = ( ( cmd[1] & ~CTRL_REG2_HEATER_MASK ) | myHeater.heater );
aux = _i2c.write ( _HTS221_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
if ( aux == I2C_SUCCESS ) {
return HTS221_SUCCESS;
} else {
return HTS221_FAILURE;
}
}
/**
* @brief HTS221_GetHeater ( HTS221_data_t* )
*
* @details It gets heater mode.
*
* @param[in] N/A.
*
* @param[out] myHeater Heater mode
*
*
* @return Status of HTS221_GetHeater.
*
*
* @author Manuel Caballero
* @date 31/May/2019
* @version 31/May/2019 The ORIGIN
* @pre N/A
* @warning N/A.
*/
HTS221::HTS221_status_t HTS221::HTS221_GetHeater ( HTS221_data_t* myHeater )
{
char cmd = 0U;
uint32_t aux;
/* Read the register */
cmd = HTS221_CTRL_REG2;
aux = _i2c.write ( _HTS221_Addr, &cmd, 1U, true );
aux = _i2c.read ( _HTS221_Addr, &cmd, 1U );
/* Parse the data */
myHeater->heater = (HTS221_ctrl_reg2_heater_t)( cmd & CTRL_REG2_HEATER_MASK );
if ( aux == I2C_SUCCESS ) {
return HTS221_SUCCESS;
} else {
return HTS221_FAILURE;
}
}
/**
* @brief HTS221_SetOneShot ( void )
*
* @details It sets one-shot, new data set.
*
* @param[in] N/A.
*
* @param[out] N/A
*
*
* @return Status of HTS221_SetOneShot.
*
*
* @author Manuel Caballero
* @date 31/May/2019
* @version 31/May/2019 The ORIGIN
* @pre ONE_SHOT bit comes back to '0' by hardware
* @warning N/A.
*/
HTS221::HTS221_status_t HTS221::HTS221_SetOneShot ( void )
{
char cmd[2] = { 0U };
uint32_t aux;
/* Read the register */
cmd[0] = HTS221_CTRL_REG2;
aux = _i2c.write ( _HTS221_Addr, &cmd[0], 1U, true );
aux = _i2c.read ( _HTS221_Addr, &cmd[1], 1U );
/* Update the register */
cmd[1] = ( ( cmd[1] & ~CTRL_REG2_ONE_SHOT_MASK ) | CTRL_REG2_ONE_SHOT_START );
aux = _i2c.write ( _HTS221_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
if ( aux == I2C_SUCCESS ) {
return HTS221_SUCCESS;
} else {
return HTS221_FAILURE;
}
}
/**
* @brief HTS221_GetOneShot ( HTS221_data_t* )
*
* @details It gets one-shot flag.
*
* @param[in] N/A.
*
* @param[out] myOneShot: One-shot flag
*
*
* @return Status of HTS221_GetOneShot.
*
*
* @author Manuel Caballero
* @date 31/May/2019
* @version 31/May/2019 The ORIGIN
* @pre N/A
* @warning N/A.
*/
HTS221::HTS221_status_t HTS221::HTS221_GetOneShot ( HTS221_data_t* myOneShot )
{
char cmd = 0U;
uint32_t aux;
/* Read the register */
cmd = HTS221_CTRL_REG2;
aux = _i2c.write ( _HTS221_Addr, &cmd, 1U, true );
aux = _i2c.read ( _HTS221_Addr, &cmd, 1U );
/* Parse the data */
myOneShot->one_shot = (HTS221_ctrl_reg2_one_shot_t)( cmd & CTRL_REG2_ONE_SHOT_MASK );
if ( aux == I2C_SUCCESS ) {
return HTS221_SUCCESS;
} else {
return HTS221_FAILURE;
}
}
/**
* @brief HTS221_SetDataReadyOuput ( HTS221_ctrl_reg3_drdy_h_l_t )
*
* @details It sets data ready output signal active high/low.
*
* @param[in] N/A.
* @param[in] myDRDY_H_L: Data ready output signal high/low.
*
* @param[out] N/A
*
*
* @return Status of HTS221_SetDataReadyOuput.
*
*
* @author Manuel Caballero
* @date 31/May/2019
* @version 31/May/2019 The ORIGIN
* @pre N/A.
* @warning N/A.
*/
HTS221::HTS221_status_t HTS221::HTS221_SetDataReadyOuput ( HTS221_ctrl_reg3_drdy_h_l_t myDRDY_H_L )
{
char cmd[2] = { 0U };
uint32_t aux;
/* Read the register */
cmd[0] = HTS221_CTRL_REG3;
aux = _i2c.write ( _HTS221_Addr, &cmd[0], 1U, true );
aux = _i2c.read ( _HTS221_Addr, &cmd[1], 1U );
/* Update the register */
cmd[1] = ( ( cmd[1] & ~CTRL_REG3_DRDY_H_L_MASK ) | myDRDY_H_L );
aux = _i2c.write ( _HTS221_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
if ( aux == I2C_SUCCESS ) {
return HTS221_SUCCESS;
} else {
return HTS221_FAILURE;
}
}
/**
* @brief HTS221_SetSelectionOnPin3 ( HTS221_ctrl_reg3_pp_od_t )
*
* @details It sets Push-pull/Open Drain selection on pin 3 ( DRDY ).
*
* @param[in] N/A.
* @param[in] myDRDY: Push-pull/Open Drain selection on pin 3 (DRDY).
*
* @param[out] N/A
*
*
* @return Status of HTS221_SetDataReadyOuput.
*
*
* @author Manuel Caballero
* @date 31/May/2019
* @version 31/May/2019 The ORIGIN
* @pre N/A.
* @warning N/A.
*/
HTS221::HTS221_status_t HTS221::HTS221_SetSelectionOnPin3 ( HTS221_ctrl_reg3_pp_od_t myDRDY )
{
char cmd[2] = { 0U };
uint32_t aux;
/* Read the register */
cmd[0] = HTS221_CTRL_REG3;
aux = _i2c.write ( _HTS221_Addr, &cmd[0], 1U, true );
aux = _i2c.read ( _HTS221_Addr, &cmd[1], 1U );
/* Update the register */
cmd[1] = ( ( cmd[1] & ~CTRL_REG3_PP_OD_MASK ) | myDRDY );
aux = _i2c.write ( _HTS221_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
if ( aux == I2C_SUCCESS ) {
return HTS221_SUCCESS;
} else {
return HTS221_FAILURE;
}
}
/**
* @brief HTS221_SetDataReadyEnable ( HTS221_ctrl_reg3_drdy_en_t )
*
* @details It sets data ready enable.
*
* @param[in] N/A.
* @param[in] myDRDY_EN: Data Ready enable.
*
* @param[out] N/A
*
*
* @return Status of HTS221_SetDataReadyEnable.
*
*
* @author Manuel Caballero
* @date 31/May/2019
* @version 31/May/2019 The ORIGIN
* @pre N/A.
* @warning N/A.
*/
HTS221::HTS221_status_t HTS221::HTS221_SetDataReadyEnable ( HTS221_ctrl_reg3_drdy_en_t myDRDY_EN )
{
char cmd[2] = { 0U };
uint32_t aux;
/* Read the register */
cmd[0] = HTS221_CTRL_REG3;
aux = _i2c.write ( _HTS221_Addr, &cmd[0], 1U, true );
aux = _i2c.read ( _HTS221_Addr, &cmd[1], 1U );
/* Update the register */
cmd[1] = ( ( cmd[1] & ~CTRL_REG3_DRDY_EN_MASK ) | myDRDY_EN );
aux = _i2c.write ( _HTS221_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
if ( aux == I2C_SUCCESS ) {
return HTS221_SUCCESS;
} else {
return HTS221_FAILURE;
}
}
/**
* @brief HTS221_GetHumidityDataAvailable ( HTS221_data_t* )
*
* @details It gets humidity data available flag.
*
* @param[in] N/A.
*
* @param[out] myHumidityFlag: Humidity data available flag
*
*
* @return Status of HTS221_GetHumidityDataAvailable.
*
*
* @author Manuel Caballero
* @date 31/May/2019
* @version 31/May/2019 The ORIGIN
* @pre N/A
* @warning N/A.
*/
HTS221::HTS221_status_t HTS221::HTS221_GetHumidityDataAvailable ( HTS221_data_t* myHumidityFlag )
{
char cmd = 0U;
uint32_t aux;
/* Read the register */
cmd = HTS221_STATUS_REG;
aux = _i2c.write ( _HTS221_Addr, &cmd, 1U, true );
aux = _i2c.read ( _HTS221_Addr, &cmd, 1U );
/* Parse the data */
myHumidityFlag->h_da = (HTS221_status_reg_h_da_t)( cmd & STATUS_REGISTER_H_DA_MASK );
if ( aux == I2C_SUCCESS ) {
return HTS221_SUCCESS;
} else {
return HTS221_FAILURE;
}
}
/**
* @brief HTS221_GetTemperatureDataAvailable ( HTS221_data_t* )
*
* @details It gets temperature data available flag.
*
* @param[in] N/A.
*
* @param[out] myTemperatureFlag: Temperature data available flag
*
*
* @return Status of HTS221_GetTemperatureDataAvailable.
*
*
* @author Manuel Caballero
* @date 24/May/2019
* @version 24/May/2019 The ORIGIN
* @pre N/A
* @warning N/A.
*/
HTS221::HTS221_status_t HTS221::HTS221_GetTemperatureDataAvailable ( HTS221_data_t* myTemperatureFlag )
{
char cmd = 0U;
uint32_t aux;
/* Read the register */
cmd = HTS221_STATUS_REG;
aux = _i2c.write ( _HTS221_Addr, &cmd, 1U, true );
aux = _i2c.read ( _HTS221_Addr, &cmd, 1U );
/* Parse the data */
myTemperatureFlag->t_da = (HTS221_status_reg_t_da_t)( cmd & STATUS_REGISTER_T_DA_MASK );
if ( aux == I2C_SUCCESS ) {
return HTS221_SUCCESS;
} else {
return HTS221_FAILURE;
}
}
/**
* @brief HTS221_GetRawHumidity ( HTS221_data_t* )
*
* @details It gets raw humidity.
*
* @param[in] N/A
*
* @param[out] myRawHumidity: Raw humidity
*
*
* @return Status of HTS221_GetRawHumidity.
*
*
* @author Manuel Caballero
* @date 31/May/2019
* @version 31/May/2019 The ORIGIN
* @pre This function uses autoincrementing for reading the registers.
* @warning N/A.
*/
HTS221::HTS221_status_t HTS221::HTS221_GetRawHumidity ( HTS221_data_t* myRawHumidity )
{
char cmd[2] = { 0U };
uint32_t aux;
/* Read the register */
cmd[0] = ( HTS221_HUMIDITY_OUT_L | 0x80 ); // Autoincrementing
aux = _i2c.write ( _HTS221_Addr, &cmd[0], 1U, true );
aux = _i2c.read ( _HTS221_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
/* Parse the data */
myRawHumidity->rawHumidity = cmd[1];
myRawHumidity->rawHumidity <<= 8U;
myRawHumidity->rawHumidity |= cmd[0];
if ( aux == I2C_SUCCESS ) {
return HTS221_SUCCESS;
} else {
return HTS221_FAILURE;
}
}
/**
* @brief HTS221_GetRawTemperature ( HTS221_data_t* )
*
* @details It gets raw temperature.
*
* @param[in] N/A.
*
* @param[out] myRawTemperature: Raw temperature
*
*
* @return Status of HTS221_GetRawTemperature.
*
*
* @author Manuel Caballero
* @date 31/May/2019
* @version 31/May/2019 The ORIGIN
* @pre This function uses autoincrementing for reading the registers.
* @warning N/A.
*/
HTS221::HTS221_status_t HTS221::HTS221_GetRawTemperature ( HTS221_data_t* myRawTemperature )
{
char cmd[2] = { 0U };
uint32_t aux;
/* Read the register */
cmd[0] = ( HTS221_TEMP_OUT_L | 0x80 ); // Autoincrementing
aux = _i2c.write ( _HTS221_Addr, &cmd[0], 1U, true );
aux = _i2c.read ( _HTS221_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
/* Parse the data */
myRawTemperature->rawTemperature = cmd[1];
myRawTemperature->rawTemperature <<= 8U;
myRawTemperature->rawTemperature |= cmd[0];
if ( aux == I2C_SUCCESS ) {
return HTS221_SUCCESS;
} else {
return HTS221_FAILURE;
}
}
/**
* @brief HTS221_GetCalibrationCoefficients ( HTS221_data_t* )
*
* @details It gets calibration coefficients.
*
* @param[in] N/A.
*
* @param[out] myCoeff: Calibration coefficients
*
*
* @return Status of HTS221_GetCalibrationCoefficients.
*
*
* @author Manuel Caballero
* @date 31/May/2019
* @version 31/May/2019 The ORIGIN
* @pre This function uses autoincrementing for reading the registers.
* @warning N/A.
*/
HTS221::HTS221_status_t HTS221::HTS221_GetCalibrationCoefficients ( HTS221_data_t* myCoeff )
{
char cmd[16] = { 0U };
uint32_t aux;
/* Read the register */
cmd[0] = ( HTS221_CALIB_0 | 0x80 ); // Autoincrementing
aux = _i2c.write ( _HTS221_Addr, &cmd[0], 1U, true );
aux = _i2c.read ( _HTS221_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
/* Parse the data */
myCoeff->h0_rH_x2 = cmd[0];
myCoeff->h1_rH_x2 = cmd[1];
myCoeff->t0_degC_x8 = cmd[2];
myCoeff->t1_degC_x8 = cmd[3];
myCoeff->t1_T0_msb = ( cmd[5] & 0x0F );
myCoeff->h0_T0_OUT = cmd[7];
myCoeff->h0_T0_OUT <<= 8U;
myCoeff->h0_T0_OUT |= cmd[6];
myCoeff->h1_T0_OUT = cmd[11];
myCoeff->h1_T0_OUT <<= 8U;
myCoeff->h1_T0_OUT |= cmd[10];
myCoeff->t0_OUT = cmd[13];
myCoeff->t0_OUT <<= 8U;
myCoeff->t0_OUT |= cmd[12];
myCoeff->t1_OUT = cmd[15];
myCoeff->t1_OUT <<= 8U;
myCoeff->t1_OUT |= cmd[14];
/* Coefficient result for temperature & humidity */
myCoeff->t0_degC = ( myCoeff->t1_T0_msb & 0x03 );
myCoeff->t0_degC <<= 8U;
myCoeff->t0_degC |= myCoeff->t0_degC_x8;
myCoeff->t0_degC >>= 3U;
myCoeff->t1_degC = ( myCoeff->t1_T0_msb & 0x0C );
myCoeff->t1_degC <<= 6U;
myCoeff->t1_degC |= myCoeff->t1_degC_x8;
myCoeff->t1_degC >>= 3U;
myCoeff->h0_RH = myCoeff->h0_rH_x2;
myCoeff->h0_RH >>= 1U;
myCoeff->h1_RH = myCoeff->h1_rH_x2;
myCoeff->h1_RH >>= 1U;
if ( aux == I2C_SUCCESS ) {
return HTS221_SUCCESS;
} else {
return HTS221_FAILURE;
}
}
/**
* @brief HTS221_GetTemperature ( HTS221_data_t* )
*
* @details It gets the current temperature in Celsius degrees.
*
* @param[in] N/A.
*
* @param[out] myTemperature: Current temperature in Celsius degress
*
*
* @return Status of HTS221_GetTemperature.
*
*
* @author Manuel Caballero
* @date 31/May/2019
* @version 31/May/2019 The ORIGIN
* @pre N/A.
* @warning N/A.
*/
HTS221::HTS221_status_t HTS221::HTS221_GetTemperature ( HTS221_data_t* myTemperature )
{
HTS221::HTS221_status_t aux;
/* Get temperature */
aux = HTS221::HTS221_GetRawTemperature ( &(*myTemperature) );
/* Parse the data */
myTemperature->temperature = (int32_t)( 10.0*( myTemperature->rawTemperature - myTemperature->t0_OUT )*( myTemperature->t1_degC - myTemperature->t0_degC )/( myTemperature->t1_OUT - myTemperature->t0_OUT ) );
myTemperature->temperature += 10.0*myTemperature->t0_degC;
myTemperature->temperature /= 10.0;
if ( aux == HTS221_SUCCESS ) {
return HTS221_SUCCESS;
} else {
return HTS221_FAILURE;
}
}
/**
* @brief HTS221_GetHumidity ( HTS221_data_t* )
*
* @details It gets the current humidity value.
*
* @param[in] N/A.
*
* @param[out] myHumidity: Current humidity value
*
*
* @return Status of HTS221_GetHumidity.
*
*
* @author Manuel Caballero
* @date 31/May/2019
* @version 31/May/2019 The ORIGIN
* @pre N/A.
* @warning N/A.
*/
HTS221::HTS221_status_t HTS221::HTS221_GetHumidity ( HTS221_data_t* myHumidity )
{
HTS221::HTS221_status_t aux;
/* Get humidity */
aux = HTS221::HTS221_GetRawHumidity ( &(*myHumidity) );
/* Parse the data */
myHumidity->humidity = (int32_t)( 10.0*( myHumidity->rawHumidity - myHumidity->h0_T0_OUT )*( myHumidity->h1_RH - myHumidity->h0_RH )/( myHumidity->h1_T0_OUT - myHumidity->h0_T0_OUT ) );
myHumidity->humidity += 10.0*myHumidity->h0_RH;
myHumidity->humidity /= 10.0;
/* Check if it is saturated */
if ( myHumidity->humidity > 100 ) {
myHumidity->humidity = 100;
}
if ( aux == HTS221_SUCCESS ) {
return HTS221_SUCCESS;
} else {
return HTS221_FAILURE;
}
}