Library for the BH1750 Digital 16-bit Serial Output Type Ambient Light Sensor IC.
BH1750.cpp
- Committer:
- mcm
- Date:
- 2017-08-10
- Revision:
- 0:bea4477679ee
- Child:
- 1:8115dc8275eb
File content as of revision 0:bea4477679ee:
/** * @brief BH1750.h * @details Digital 16-bit Serial Output Type Ambient Light Sensor IC. * Functions file. * * * @return NA * * @author Manuel Caballero * @date 10/August/2017 * @version 10/August/2017 The ORIGIN * @pre NaN * @warning NaN * @pre This code belongs to AqueronteBlog ( http://unbarquero.blogspot.com ). */ #include "BH1750.h" BH1750::BH1750 ( PinName sda, PinName scl, uint32_t addr, uint32_t hz ) : i2c ( sda, scl ) , BH1750_Addr ( addr ) { i2c.frequency(hz); } BH1750::~BH1750(){ } /** * @brief uint32_t BH1750_ResetDataRegister ( void ) * @details Reseting the data register value. * * @param[in] NaN. * * @param[out] Status of BH1750_ResetDataRegister. * * * @return NA * * @author Manuel Caballero * @date 10/August/2017 * @version 10/August/2017 The ORIGIN * @pre NaN * @warning Reset command is not acceptable in Power Down mode. */ uint32_t BH1750::BH1750_ResetDataRegister ( void ) { char cmd[] = { BH1750_RESET }; uint32_t aux = 0; aux = i2c.write ( BH1750_Addr, &cmd[0], 1 ); if ( aux == I2C_SUCCESS ) return BH1750_SUCCESS; else return BH1750_FAILURE; } /** * @brief uint32_t BH1750_PowerDown ( void ) * @details BH1750 in low power mode. * * @param[in] NaN * * @param[out] Status of BH1750_PowerDown. * * * @return NA * * @author Manuel Caballero * @date 10/August/2017 * @version 10/August/2017 The ORIGIN * @pre NaN * @warning NaN. */ uint32_t BH1750::BH1750_PowerDown ( void ) { char cmd[] = { BH1750_POWER_DOWN }; uint32_t aux = 0; aux = i2c.write ( BH1750_Addr, &cmd[0], 1 ); if ( aux == I2C_SUCCESS ) return BH1750_SUCCESS; else return BH1750_FAILURE; } /** * @brief uint32_t BH1750_PowerOn ( void ) * @details BH1750 is on and waiting for measurement command. * * @param[in] NaN * * @param[out] Status of BH1750_PowerOn. * * * @return NA * * @author Manuel Caballero * @date 10/August/2017 * @version 10/August/2017 The ORIGIN * @pre NaN * @warning NaN. */ uint32_t BH1750::BH1750_PowerOn ( void ) { char cmd[] = { BH1750_POWER_ON }; uint32_t aux = 0; aux = i2c.write ( BH1750_Addr, &cmd[0], 1 ); if ( aux == I2C_SUCCESS ) return BH1750_SUCCESS; else return BH1750_FAILURE; } /** * @brief uint32_t BH1750_TriggerMeasurement ( uint32_t ) * @details Trigger a new temperature measurement. * * @param[in] MODE: ONE-SHOT or CONTINUOUSLY measurement ( Normal Mode or Mode2 ). * * @param[out] Status of BH1750_TriggerMeasurement. * * * @return NA * * @author Manuel Caballero * @date 10/August/2017 * @version 10/August/2017 The ORIGIN * @pre NaN * @warning The measuring time depends on the chosen resolution ( MODE ). The user * must take this into account. */ uint32_t BH1750::BH1750_TriggerMeasurement ( uint32_t MODE ) { char cmd[] = { MODE }; uint32_t aux = 0; BH1750_Mode = MODE; aux = i2c.write ( BH1750_Addr, &cmd[0], 1 ); if ( aux == I2C_SUCCESS ) return BH1750_SUCCESS; else return BH1750_FAILURE; } /** * @brief uint32_t BH1750_NewSensitivity ( uint8_t ) * @details It configures the new sensitivity of the sensor. The sensitivity depends on which * resolution mode is used: * * H-reslution mode : Illuminance per 1 count ( lx / count ) = 1 / 1.2 *( 69 / X ) * H-reslution mode2 : Illuminance per 1 count ( lx / count ) = 1 / 1.2 *( 69 / X ) / 2 * * So, by the default: * * H-reslution mode : Sensitivity = 1 / 1.2 *( 69 / 69 ) ~ 0.83 * H-reslution mode2 : Sensitivity = 1 / 1.2 *( 69 / 69 ) / 2 ~ 1.67 * * * Example ( H-reslution mode ): * * Minimum Sensitivity = 1 / 1.2 *( 69 / 31 ) ~ 0.37 * Maximum Sensitivity = 1 / 1.2 *( 69 / 254 ) ~ 3.07 * * * * @param[in] newSensitivity: New sensitivity value. * * @param[out] Status of BH1750_NewSensitivity. * * * @return NA * * @author Manuel Caballero * @date 10/August/2017 * @version 10/August/2017 The ORIGIN * @pre NaN * @warning newSensitivity can ONLY be from 31 to 254. */ uint32_t BH1750::BH1750_NewSensitivity ( uint8_t newSensitivity ) { char cmd[] = { 0x40, 0x60 }; // 0x40 ( MT High byte ), 0x60 ( MT Low byte ) uint32_t aux = 0; if ( ( newSensitivity > 30 ) && ( newSensitivity < 255 ) ) { cmd[0] |= ( ( newSensitivity & 0xE0 ) >> 5 ); cmd[1] |= ( newSensitivity & 0x1F ); aux = i2c.write ( BH1750_Addr, &cmd[0], 2 ); } else aux = BH1750_FAILURE; if ( aux == I2C_SUCCESS ) return BH1750_SUCCESS; else return BH1750_FAILURE; } /** * @brief uint32_t BH1750_ReadRawData ( uint32_t* ) * @details Read a new raw temperature measurement. * * @param[in] myRawData: Variable to store the raw data. * * @param[out] Status of BH1750_ReadRawData. * * * @return NA * * @author Manuel Caballero * @date 10/August/2017 * @version 10/August/2017 The ORIGIN * @pre NaN * @warning BH1750_TriggerMeasurement MUST be call before. */ uint32_t BH1750::BH1750_ReadRawData ( char* myRawData ) { uint32_t aux = 0; aux = i2c.read ( BH1750_Addr, &myRawData[0], 2 ); if ( aux == I2C_SUCCESS ) return BH1750_SUCCESS; else return BH1750_FAILURE; } /** * @brief BH1750_ReadLux ( float* ) * @details It turns the raw data into a Lux data. * * @param[in] myLux: Variable to store the Lux. * * @param[out] Status of BH1750_ReadLux. * * * @return NA * * @author Manuel Caballero * @date 10/August/2017 * @version 10/August/2017 The ORIGIN * @pre NaN * @warning BH1750_TriggerMeasurement MUST be call before. */ uint32_t BH1750::BH1750_ReadLux ( float* myLux ) { uint32_t aux = 0; char myRawData[] = { 0, 0}; aux = BH1750_ReadRawData ( &myRawData[0] ); if ( ( BH1750_Mode == BH1750_CONTINUOUSLY_H_RESOLUTION_MODE ) || ( BH1750_Mode == BH1750_CONTINUOUSLY_L_RESOLUTION_MODE ) || ( BH1750_Mode == BH1750_ONE_TIME_H_RESOLUTION_MODE ) || ( BH1750_Mode == BH1750_ONE_TIME_L_RESOLUTION_MODE ) ) { *myLux = ( myRawData[0] << 8 ) | myRawData[1]; *myLux = ( uint16_t )( *myLux / 1.2 ); } else { *myLux = ( ( myRawData[0] << 8 ) | myRawData[1] ) >> 1; *myLux = ( uint16_t )( *myLux / 1.2 ); if ( ( myRawData[1] & 0x01 ) == 0x01 ) *myLux += 0.5; } if ( aux == I2C_SUCCESS ) return BH1750_SUCCESS; else return BH1750_FAILURE; }