Digital humidity sensor with temperature output
Diff: HTU21D.cpp
- Revision:
- 2:ad5e3555c7ef
- Parent:
- 0:d15aa997f9c1
--- a/HTU21D.cpp Thu Aug 31 20:28:28 2017 +0000 +++ b/HTU21D.cpp Tue Sep 05 13:18:23 2017 +0000 @@ -0,0 +1,464 @@ +/** + * @brief HTU21D.c + * @details Digital humidity sensor with temperature output. + * Functions file. + * + * + * @return NA + * + * @author Manuel Caballero + * @date 4/September/2017 + * @version 4/September/2017 The ORIGIN + * @pre NaN. + * @warning NaN + * @pre This code belongs to AqueronteBlog ( http://unbarquero.blogspot.com ). + */ + +#include "HTU21D.h" + + +HTU21D::HTU21D ( PinName sda, PinName scl, uint32_t addr, uint32_t freq ) + : i2c ( sda, scl ) + , HTU21D_Addr ( addr ) +{ + i2c.frequency( freq ); +} + + +HTU21D::~HTU21D() +{ +} + + + +/** + * @brief HTU21D_Init ( HTU21D_master_mode_t , HTU21D_user_register_resolution_t , HTU21D_user_register_otp_t ) + * + * @details It initializes the device. + * + * @param[in] myMode: Hold/No Hold master mode. + * @param[in] myResolution: Resolution of the sensor. + * @param[in] myHeater: Heater enabled or disabled. + * + * @param[out] NaN. + * + * + * @return Status of HTU21D_Init. + * + * + * @author Manuel Caballero + * @date 4/September/2017 + * @version 4/September/2017 The ORIGIN + * @pre NaN + * @warning NaN. + */ +HTU21D::HTU21D_status_t HTU21D::HTU21D_Init ( HTU21D_master_mode_t myMode, HTU21D_user_register_resolution_t myResolution, HTU21D_user_register_heater_t myHeater ) +{ + char cmd[] = { HTU21D_READ_REGISTER, 0 }; + uint32_t aux = 0; + + + HTU21D_Mode = myMode; + HTU21D_Resolution = myResolution; + + + // Reserved bits must not be changed. Therefore, for any writing to user register, default values of reserved bits must be read first + // Datasheet: User register p.13. + aux = i2c.write ( HTU21D_Addr, &cmd[0], 1 ); + aux = i2c.read ( HTU21D_Addr, &cmd[0], 1 ); + + + cmd[0] &= 0x38; // Mask reserved bits + + // On-chip heater + if ( myHeater == HEATER_ENABLED ) + cmd[0] |= 0x04; + + // Resolution + switch ( HTU21D_Resolution ) { + default: + case RESOLUTION_12RH_14TEMP: + cmd[0] &= 0x7E; + break; + + case RESOLUTION_8RH_12TEMP: + cmd[0] |= 0x01; + break; + + case RESOLUTION_10RH_13TEMP: + cmd[0] |= 0x80; + break; + + case RESOLUTION_11RH_11TEMP: + cmd[0] |= 0x81; + break; + } + + + cmd[1] = ( cmd[0] | 0x02 ); // OTP reload disabled + cmd[0] = HTU21D_WRITE_REGISTER; + + aux = i2c.write ( HTU21D_Addr, &cmd[0], 2 ); + + + + if ( aux == I2C_SUCCESS ) + return HTU21D_SUCCESS; + else + return HTU21D_FAILURE; +} + + + +/** + * @brief HTU21D_SoftReset ( void ) + * @details Rebooting the HTU21D sensor switching the power off and on again. + * + * @param[in] NaN. + * + * @param[out] Status of HTU21D_SoftReset. + * + * + * @return NA + * + * @author Manuel Caballero + * @date 5/September/2017 + * @version 5/September/2017 The ORIGIN + * @pre NaN + * @warning The soft reset takes less than 15ms. + */ +HTU21D::HTU21D_status_t HTU21D::HTU21D_SoftReset ( void ) +{ + char cmd = HTU21D_SOFT_RESET; + uint32_t aux = 0; + + + aux = i2c.write ( HTU21D_Addr, &cmd, 1 ); + wait ( 0.015 ); + + + if ( aux == HTU21D_SUCCESS ) + return HTU21D_SUCCESS; + else + return HTU21D_FAILURE; +} + + + + /** + * @brief HTU21D_TriggerTemperature ( void ) + * @details Trigger a new temperature measurement. + * + * @param[in] NaN. + * + * @param[out] Status of HTU21D_TriggerTemperature. + * + * + * @return NA + * + * @author Manuel Caballero + * @date 5/September/2017 + * @version 5/September/2017 The ORIGIN + * @pre NaN + * @warning The measuring time depends on the chosen resolution. + */ +HTU21D::HTU21D_status_t HTU21D::HTU21D_TriggerTemperature ( void ) +{ + char cmd = 0; + uint32_t aux = 0; + float myDelay = 0; + + + // Check if the event is by Hold Master Mode + if ( HTU21D_Mode == MODE_HOLD_MASTER ) + cmd = HTU21D_TRIGGER_TEMPERATURE_MEASUREMENT_HOLD_MASTER; + else + cmd = HTU21D_TRIGGER_TEMPERATURE_MEASUREMENT_NO_HOLD_MASTER; + + + aux = i2c.write ( HTU21D_Addr, &cmd, 1 ); + + // Measuring time + switch ( HTU21D_Resolution ){ + default: + case RESOLUTION_12RH_14TEMP: + myDelay = 0.05; + break; + + case RESOLUTION_8RH_12TEMP: + myDelay = 0.013; + break; + + case RESOLUTION_10RH_13TEMP: + myDelay = 0.025; + break; + + case RESOLUTION_11RH_11TEMP: + myDelay = 0.007; + break; + } + + wait ( myDelay ); + + + if ( aux == HTU21D_SUCCESS ) + return HTU21D_SUCCESS; + else + return HTU21D_FAILURE; +} + + + +/** + * @brief HTU21D_ReadTemperature ( Vector_temperature_f* ) + * @details Read a new temperature measurement. + * + * @param[in] mytemperature: Variable to store the temperature. + * + * @param[out] Status of HTU21D_ReadTemperature. + * + * + * @return NA + * + * @author Manuel Caballero + * @date 5/September/2017 + * @version 5/September/2017 The ORIGIN + * @pre NaN + * @warning HTU21D_TriggerTemperature MUST be called before. + */ +HTU21D::HTU21D_status_t HTU21D::HTU21D_ReadTemperature ( Vector_temperature_f* mytemperature ) +{ + char aux = 0; + char myRawTemp[] = { 0, 0, 0}; + + + aux = i2c.read ( HTU21D_Addr, &myRawTemp[0], 3 ); + + + mytemperature->Temperature = ( myRawTemp[0] << 8 ) | myRawTemp[1]; + mytemperature->Temperature /= 65536.0; + mytemperature->Temperature *= 175.72; + mytemperature->Temperature -= 46.85; + + + + if ( aux == HTU21D_SUCCESS ) + return HTU21D_SUCCESS; + else + return HTU21D_FAILURE; +} + + + +/** + * @brief HTU21D_ReadRawTemperature ( Vector_raw_temperature_t* ) + * @details Read a new raw temperature measurement. + * + * @param[in] myRawtemperature: Variable to store the temperature. + * + * @param[out] Status of HTU21D_ReadTemperature. + * + * + * @return NA + * + * @author Manuel Caballero + * @date 5/September/2017 + * @version 5/September/2017 The ORIGIN + * @pre NaN + * @warning HTU21D_TriggerTemperature MUST be called before. + */ +HTU21D::HTU21D_status_t HTU21D::HTU21D_ReadRawTemperature ( Vector_raw_temperature_t* myRawtemperature ) +{ + uint32_t aux = 0; + + + aux = i2c.read ( HTU21D_Addr, &myRawtemperature->RawTemperature[0], 3 ); + + + if ( aux == HTU21D_SUCCESS ) + return HTU21D_SUCCESS; + else + return HTU21D_FAILURE; +} + + +/** + * @brief HTU21D_TriggerHumidity ( void ) + * @details Trigger a new humidity measurement. + * + * @param[in] NaN. + * + * @param[out] Status of HTU21D_TriggerHumidity. + * + * + * @return NA + * + * @author Manuel Caballero + * @date 5/September/2017 + * @version 5/September/2017 The ORIGIN + * @pre NaN + * @warning The measuring time depends on the chosen resolution. + */ +HTU21D::HTU21D_status_t HTU21D::HTU21D_TriggerHumidity ( void ) +{ + char cmd = 0; + uint32_t aux = 0; + float myDelay = 0; + + + // Check if the event is by Hold Master Mode + if ( HTU21D_Mode == MODE_HOLD_MASTER ) + cmd = HTU21D_TRIGGER_HUMIDITY_MEASUREMENT_HOLD_MASTER; + else + cmd = HTU21D_TRIGGER_HUMIDITY_MEASUREMENT_NO_HOLD_MASTER; + + + aux = i2c.write ( HTU21D_Addr, &cmd, 1 ); + + // Measuring time + switch ( HTU21D_Resolution ){ + default: + case RESOLUTION_12RH_14TEMP: + myDelay = 0.05; + break; + + case RESOLUTION_8RH_12TEMP: + myDelay = 0.013; + break; + + case RESOLUTION_10RH_13TEMP: + myDelay = 0.025; + break; + + case RESOLUTION_11RH_11TEMP: + myDelay = 0.007; + break; + } + + wait ( myDelay ); + + + if ( aux == HTU21D_SUCCESS ) + return HTU21D_SUCCESS; + else + return HTU21D_FAILURE; +} + + + +/** + * @brief HTU21D_ReadHumidity ( Vector_humidity_f* ) + * @details Read a new humidity measurement. + * + * @param[in] myhumidity: Variable to store the humidity. + * + * @param[out] Status of HTU21D_ReadHumidity. + * + * + * @return NA + * + * @author Manuel Caballero + * @date 5/September/2017 + * @version 5/September/2017 The ORIGIN + * @pre NaN + * @warning HTU21D_TriggerHumidity MUST be called before. + */ +HTU21D::HTU21D_status_t HTU21D::HTU21D_ReadHumidity ( Vector_humidity_f* myhumidity ) +{ + uint32_t aux = 0; + char myRawRH[] = { 0, 0, 0}; + + + aux = i2c.read ( HTU21D_Addr, &myRawRH[0], 3 ); + + + myhumidity->Humidity = ( myRawRH[0] << 8 ) | myRawRH[1]; + myhumidity->Humidity /= 65536.0; + myhumidity->Humidity *= 125.0; + myhumidity->Humidity -= 6.0; + + + + if ( aux == HTU21D_SUCCESS ) + return HTU21D_SUCCESS; + else + return HTU21D_FAILURE; +} + + + +/** + * @brief HTU21D_ReadRawHumidity ( Vector_raw_humidity_t* ) + * @details Read a new raw humidity measurement. + * + * @param[in] myRawhumidity: Variable to store the raw humidity. + * + * @param[out] Status of HTU21D_ReadHumidity. + * + * + * @return NA + * + * @author Manuel Caballero + * @date 5/September/2017 + * @version 5/September/2017 The ORIGIN + * @pre NaN + * @warning The measuring time depends on the chosen resolution. + * @warning HTU21D_TriggerHumidity MUST be called before. + */ +HTU21D::HTU21D_status_t HTU21D::HTU21D_ReadRawHumidity ( Vector_raw_humidity_t* myRawhumidity ) +{ + uint32_t aux = 0; + + + aux = i2c.read ( HTU21D_Addr, &myRawhumidity->RawHumidity[0], 3 ); + + + + if ( aux == HTU21D_SUCCESS ) + return HTU21D_SUCCESS; + else + return HTU21D_FAILURE; +} + + + +/** + * @brief HTU21D_BatteryStatus ( HTU21D_user_register_status_t* ) + * @details Read the user register to check the battery status. + * + * @param[in] battStatus: Variable to store the battery status. + * + * @param[out] Status of HTU21D_BatteryStatus. + * + * + * @return NA + * + * @author Manuel Caballero + * @date 5/September/2017 + * @version 5/September/2017 The ORIGIN + * @pre NaN + * @warning NaN. + */ +HTU21D::HTU21D_status_t HTU21D::HTU21D_BatteryStatus ( HTU21D_user_register_status_t* battStatus ) +{ + char cmd = HTU21D_READ_REGISTER; + uint32_t aux = 0; + + + aux = i2c.write ( HTU21D_Addr, &cmd, 1 ); + aux = i2c.read ( HTU21D_Addr, &cmd, 1 ); + + + cmd &= 0x40; // Mask 'Status: End of Batter' bit + + if ( cmd == 0x40 ) + *battStatus = STATUS_END_BATTERY_LOW_2V25; + else + *battStatus = STATUS_END_BATTERY_HIGH_2V25; + + + if ( aux == HTU21D_SUCCESS ) + return HTU21D_SUCCESS; + else + return HTU21D_FAILURE; +}