Library for the BH1750 Digital 16-bit Serial Output Type Ambient Light Sensor IC.

Committer:
mcm
Date:
Thu Aug 10 16:28:23 2017 +0000
Revision:
1:8115dc8275eb
Parent:
0:bea4477679ee
The BH1750 library has been completed and tested, it works as expected.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mcm 0:bea4477679ee 1 /**
mcm 1:8115dc8275eb 2 * @brief BH1750.cpp
mcm 0:bea4477679ee 3 * @details Digital 16-bit Serial Output Type Ambient Light Sensor IC.
mcm 0:bea4477679ee 4 * Functions file.
mcm 0:bea4477679ee 5 *
mcm 0:bea4477679ee 6 *
mcm 0:bea4477679ee 7 * @return NA
mcm 0:bea4477679ee 8 *
mcm 0:bea4477679ee 9 * @author Manuel Caballero
mcm 0:bea4477679ee 10 * @date 10/August/2017
mcm 0:bea4477679ee 11 * @version 10/August/2017 The ORIGIN
mcm 0:bea4477679ee 12 * @pre NaN
mcm 0:bea4477679ee 13 * @warning NaN
mcm 0:bea4477679ee 14 * @pre This code belongs to AqueronteBlog ( http://unbarquero.blogspot.com ).
mcm 0:bea4477679ee 15 */
mcm 0:bea4477679ee 16
mcm 0:bea4477679ee 17 #include "BH1750.h"
mcm 0:bea4477679ee 18
mcm 0:bea4477679ee 19
mcm 0:bea4477679ee 20
mcm 1:8115dc8275eb 21 BH1750::BH1750 ( PinName sda, PinName scl, uint32_t addr, uint32_t freq )
mcm 0:bea4477679ee 22 : i2c ( sda, scl )
mcm 0:bea4477679ee 23 , BH1750_Addr ( addr )
mcm 0:bea4477679ee 24 {
mcm 1:8115dc8275eb 25 i2c.frequency( freq );
mcm 0:bea4477679ee 26 }
mcm 0:bea4477679ee 27
mcm 0:bea4477679ee 28
mcm 0:bea4477679ee 29 BH1750::~BH1750(){
mcm 0:bea4477679ee 30 }
mcm 0:bea4477679ee 31
mcm 0:bea4477679ee 32
mcm 0:bea4477679ee 33
mcm 0:bea4477679ee 34 /**
mcm 0:bea4477679ee 35 * @brief uint32_t BH1750_ResetDataRegister ( void )
mcm 0:bea4477679ee 36 * @details Reseting the data register value.
mcm 0:bea4477679ee 37 *
mcm 0:bea4477679ee 38 * @param[in] NaN.
mcm 0:bea4477679ee 39 *
mcm 0:bea4477679ee 40 * @param[out] Status of BH1750_ResetDataRegister.
mcm 0:bea4477679ee 41 *
mcm 0:bea4477679ee 42 *
mcm 0:bea4477679ee 43 * @return NA
mcm 0:bea4477679ee 44 *
mcm 0:bea4477679ee 45 * @author Manuel Caballero
mcm 0:bea4477679ee 46 * @date 10/August/2017
mcm 0:bea4477679ee 47 * @version 10/August/2017 The ORIGIN
mcm 0:bea4477679ee 48 * @pre NaN
mcm 0:bea4477679ee 49 * @warning Reset command is not acceptable in Power Down mode.
mcm 0:bea4477679ee 50 */
mcm 0:bea4477679ee 51 uint32_t BH1750::BH1750_ResetDataRegister ( void )
mcm 0:bea4477679ee 52 {
mcm 0:bea4477679ee 53 char cmd[] = { BH1750_RESET };
mcm 0:bea4477679ee 54 uint32_t aux = 0;
mcm 0:bea4477679ee 55
mcm 0:bea4477679ee 56
mcm 0:bea4477679ee 57 aux = i2c.write ( BH1750_Addr, &cmd[0], 1 );
mcm 0:bea4477679ee 58
mcm 0:bea4477679ee 59
mcm 0:bea4477679ee 60 if ( aux == I2C_SUCCESS )
mcm 0:bea4477679ee 61 return BH1750_SUCCESS;
mcm 0:bea4477679ee 62 else
mcm 0:bea4477679ee 63 return BH1750_FAILURE;
mcm 0:bea4477679ee 64 }
mcm 0:bea4477679ee 65
mcm 0:bea4477679ee 66
mcm 0:bea4477679ee 67 /**
mcm 0:bea4477679ee 68 * @brief uint32_t BH1750_PowerDown ( void )
mcm 0:bea4477679ee 69 * @details BH1750 in low power mode.
mcm 0:bea4477679ee 70 *
mcm 0:bea4477679ee 71 * @param[in] NaN
mcm 0:bea4477679ee 72 *
mcm 0:bea4477679ee 73 * @param[out] Status of BH1750_PowerDown.
mcm 0:bea4477679ee 74 *
mcm 0:bea4477679ee 75 *
mcm 0:bea4477679ee 76 * @return NA
mcm 0:bea4477679ee 77 *
mcm 0:bea4477679ee 78 * @author Manuel Caballero
mcm 0:bea4477679ee 79 * @date 10/August/2017
mcm 0:bea4477679ee 80 * @version 10/August/2017 The ORIGIN
mcm 0:bea4477679ee 81 * @pre NaN
mcm 0:bea4477679ee 82 * @warning NaN.
mcm 0:bea4477679ee 83 */
mcm 0:bea4477679ee 84 uint32_t BH1750::BH1750_PowerDown ( void )
mcm 0:bea4477679ee 85 {
mcm 0:bea4477679ee 86 char cmd[] = { BH1750_POWER_DOWN };
mcm 0:bea4477679ee 87 uint32_t aux = 0;
mcm 0:bea4477679ee 88
mcm 0:bea4477679ee 89
mcm 0:bea4477679ee 90 aux = i2c.write ( BH1750_Addr, &cmd[0], 1 );
mcm 0:bea4477679ee 91
mcm 0:bea4477679ee 92
mcm 0:bea4477679ee 93 if ( aux == I2C_SUCCESS )
mcm 0:bea4477679ee 94 return BH1750_SUCCESS;
mcm 0:bea4477679ee 95 else
mcm 0:bea4477679ee 96 return BH1750_FAILURE;
mcm 0:bea4477679ee 97 }
mcm 0:bea4477679ee 98
mcm 0:bea4477679ee 99
mcm 0:bea4477679ee 100 /**
mcm 0:bea4477679ee 101 * @brief uint32_t BH1750_PowerOn ( void )
mcm 0:bea4477679ee 102 * @details BH1750 is on and waiting for measurement command.
mcm 0:bea4477679ee 103 *
mcm 0:bea4477679ee 104 * @param[in] NaN
mcm 0:bea4477679ee 105 *
mcm 0:bea4477679ee 106 * @param[out] Status of BH1750_PowerOn.
mcm 0:bea4477679ee 107 *
mcm 0:bea4477679ee 108 *
mcm 0:bea4477679ee 109 * @return NA
mcm 0:bea4477679ee 110 *
mcm 0:bea4477679ee 111 * @author Manuel Caballero
mcm 0:bea4477679ee 112 * @date 10/August/2017
mcm 0:bea4477679ee 113 * @version 10/August/2017 The ORIGIN
mcm 0:bea4477679ee 114 * @pre NaN
mcm 0:bea4477679ee 115 * @warning NaN.
mcm 0:bea4477679ee 116 */
mcm 0:bea4477679ee 117 uint32_t BH1750::BH1750_PowerOn ( void )
mcm 0:bea4477679ee 118 {
mcm 0:bea4477679ee 119 char cmd[] = { BH1750_POWER_ON };
mcm 0:bea4477679ee 120 uint32_t aux = 0;
mcm 0:bea4477679ee 121
mcm 0:bea4477679ee 122
mcm 0:bea4477679ee 123 aux = i2c.write ( BH1750_Addr, &cmd[0], 1 );
mcm 0:bea4477679ee 124
mcm 0:bea4477679ee 125
mcm 0:bea4477679ee 126 if ( aux == I2C_SUCCESS )
mcm 0:bea4477679ee 127 return BH1750_SUCCESS;
mcm 0:bea4477679ee 128 else
mcm 0:bea4477679ee 129 return BH1750_FAILURE;
mcm 0:bea4477679ee 130 }
mcm 0:bea4477679ee 131
mcm 0:bea4477679ee 132
mcm 0:bea4477679ee 133 /**
mcm 0:bea4477679ee 134 * @brief uint32_t BH1750_TriggerMeasurement ( uint32_t )
mcm 0:bea4477679ee 135 * @details Trigger a new temperature measurement.
mcm 0:bea4477679ee 136 *
mcm 1:8115dc8275eb 137 * @param[in] mode: ONE-SHOT or CONTINUOUSLY measurement ( Normal Mode or Mode2 ).
mcm 0:bea4477679ee 138 *
mcm 0:bea4477679ee 139 * @param[out] Status of BH1750_TriggerMeasurement.
mcm 0:bea4477679ee 140 *
mcm 0:bea4477679ee 141 *
mcm 0:bea4477679ee 142 * @return NA
mcm 0:bea4477679ee 143 *
mcm 0:bea4477679ee 144 * @author Manuel Caballero
mcm 0:bea4477679ee 145 * @date 10/August/2017
mcm 0:bea4477679ee 146 * @version 10/August/2017 The ORIGIN
mcm 0:bea4477679ee 147 * @pre NaN
mcm 0:bea4477679ee 148 * @warning The measuring time depends on the chosen resolution ( MODE ). The user
mcm 0:bea4477679ee 149 * must take this into account.
mcm 0:bea4477679ee 150 */
mcm 1:8115dc8275eb 151 uint32_t BH1750::BH1750_TriggerMeasurement ( BH1750_COMMANDS mode )
mcm 0:bea4477679ee 152 {
mcm 1:8115dc8275eb 153 char cmd[] = { mode };
mcm 0:bea4477679ee 154 uint32_t aux = 0;
mcm 0:bea4477679ee 155
mcm 1:8115dc8275eb 156 BH1750_Mode = mode;
mcm 0:bea4477679ee 157
mcm 0:bea4477679ee 158
mcm 0:bea4477679ee 159 aux = i2c.write ( BH1750_Addr, &cmd[0], 1 );
mcm 0:bea4477679ee 160
mcm 0:bea4477679ee 161
mcm 0:bea4477679ee 162 if ( aux == I2C_SUCCESS )
mcm 0:bea4477679ee 163 return BH1750_SUCCESS;
mcm 0:bea4477679ee 164 else
mcm 0:bea4477679ee 165 return BH1750_FAILURE;
mcm 0:bea4477679ee 166 }
mcm 0:bea4477679ee 167
mcm 0:bea4477679ee 168
mcm 0:bea4477679ee 169 /**
mcm 0:bea4477679ee 170 * @brief uint32_t BH1750_NewSensitivity ( uint8_t )
mcm 0:bea4477679ee 171 * @details It configures the new sensitivity of the sensor. The sensitivity depends on which
mcm 0:bea4477679ee 172 * resolution mode is used:
mcm 0:bea4477679ee 173 *
mcm 0:bea4477679ee 174 * H-reslution mode : Illuminance per 1 count ( lx / count ) = 1 / 1.2 *( 69 / X )
mcm 0:bea4477679ee 175 * H-reslution mode2 : Illuminance per 1 count ( lx / count ) = 1 / 1.2 *( 69 / X ) / 2
mcm 0:bea4477679ee 176 *
mcm 0:bea4477679ee 177 * So, by the default:
mcm 0:bea4477679ee 178 *
mcm 0:bea4477679ee 179 * H-reslution mode : Sensitivity = 1 / 1.2 *( 69 / 69 ) ~ 0.83
mcm 0:bea4477679ee 180 * H-reslution mode2 : Sensitivity = 1 / 1.2 *( 69 / 69 ) / 2 ~ 1.67
mcm 0:bea4477679ee 181 *
mcm 0:bea4477679ee 182 *
mcm 0:bea4477679ee 183 * Example ( H-reslution mode ):
mcm 0:bea4477679ee 184 *
mcm 0:bea4477679ee 185 * Minimum Sensitivity = 1 / 1.2 *( 69 / 31 ) ~ 0.37
mcm 0:bea4477679ee 186 * Maximum Sensitivity = 1 / 1.2 *( 69 / 254 ) ~ 3.07
mcm 0:bea4477679ee 187 *
mcm 0:bea4477679ee 188 *
mcm 0:bea4477679ee 189 *
mcm 0:bea4477679ee 190 * @param[in] newSensitivity: New sensitivity value.
mcm 0:bea4477679ee 191 *
mcm 0:bea4477679ee 192 * @param[out] Status of BH1750_NewSensitivity.
mcm 0:bea4477679ee 193 *
mcm 0:bea4477679ee 194 *
mcm 0:bea4477679ee 195 * @return NA
mcm 0:bea4477679ee 196 *
mcm 0:bea4477679ee 197 * @author Manuel Caballero
mcm 0:bea4477679ee 198 * @date 10/August/2017
mcm 0:bea4477679ee 199 * @version 10/August/2017 The ORIGIN
mcm 0:bea4477679ee 200 * @pre NaN
mcm 0:bea4477679ee 201 * @warning newSensitivity can ONLY be from 31 to 254.
mcm 0:bea4477679ee 202 */
mcm 0:bea4477679ee 203 uint32_t BH1750::BH1750_NewSensitivity ( uint8_t newSensitivity )
mcm 0:bea4477679ee 204 {
mcm 0:bea4477679ee 205 char cmd[] = { 0x40, 0x60 }; // 0x40 ( MT High byte ), 0x60 ( MT Low byte )
mcm 0:bea4477679ee 206 uint32_t aux = 0;
mcm 0:bea4477679ee 207
mcm 0:bea4477679ee 208
mcm 0:bea4477679ee 209 if ( ( newSensitivity > 30 ) && ( newSensitivity < 255 ) )
mcm 0:bea4477679ee 210 {
mcm 0:bea4477679ee 211 cmd[0] |= ( ( newSensitivity & 0xE0 ) >> 5 );
mcm 0:bea4477679ee 212 cmd[1] |= ( newSensitivity & 0x1F );
mcm 0:bea4477679ee 213
mcm 0:bea4477679ee 214 aux = i2c.write ( BH1750_Addr, &cmd[0], 2 );
mcm 0:bea4477679ee 215 }
mcm 0:bea4477679ee 216 else
mcm 0:bea4477679ee 217 aux = BH1750_FAILURE;
mcm 0:bea4477679ee 218
mcm 0:bea4477679ee 219
mcm 0:bea4477679ee 220
mcm 0:bea4477679ee 221 if ( aux == I2C_SUCCESS )
mcm 0:bea4477679ee 222 return BH1750_SUCCESS;
mcm 0:bea4477679ee 223 else
mcm 0:bea4477679ee 224 return BH1750_FAILURE;
mcm 0:bea4477679ee 225 }
mcm 0:bea4477679ee 226
mcm 0:bea4477679ee 227
mcm 0:bea4477679ee 228
mcm 0:bea4477679ee 229 /**
mcm 0:bea4477679ee 230 * @brief uint32_t BH1750_ReadRawData ( uint32_t* )
mcm 0:bea4477679ee 231 * @details Read a new raw temperature measurement.
mcm 0:bea4477679ee 232 *
mcm 0:bea4477679ee 233 * @param[in] myRawData: Variable to store the raw data.
mcm 0:bea4477679ee 234 *
mcm 0:bea4477679ee 235 * @param[out] Status of BH1750_ReadRawData.
mcm 0:bea4477679ee 236 *
mcm 0:bea4477679ee 237 *
mcm 0:bea4477679ee 238 * @return NA
mcm 0:bea4477679ee 239 *
mcm 0:bea4477679ee 240 * @author Manuel Caballero
mcm 0:bea4477679ee 241 * @date 10/August/2017
mcm 0:bea4477679ee 242 * @version 10/August/2017 The ORIGIN
mcm 0:bea4477679ee 243 * @pre NaN
mcm 0:bea4477679ee 244 * @warning BH1750_TriggerMeasurement MUST be call before.
mcm 0:bea4477679ee 245 */
mcm 0:bea4477679ee 246 uint32_t BH1750::BH1750_ReadRawData ( char* myRawData )
mcm 0:bea4477679ee 247 {
mcm 0:bea4477679ee 248 uint32_t aux = 0;
mcm 0:bea4477679ee 249
mcm 0:bea4477679ee 250
mcm 0:bea4477679ee 251 aux = i2c.read ( BH1750_Addr, &myRawData[0], 2 );
mcm 0:bea4477679ee 252
mcm 0:bea4477679ee 253
mcm 0:bea4477679ee 254 if ( aux == I2C_SUCCESS )
mcm 0:bea4477679ee 255 return BH1750_SUCCESS;
mcm 0:bea4477679ee 256 else
mcm 0:bea4477679ee 257 return BH1750_FAILURE;
mcm 0:bea4477679ee 258 }
mcm 0:bea4477679ee 259
mcm 0:bea4477679ee 260
mcm 0:bea4477679ee 261 /**
mcm 0:bea4477679ee 262 * @brief BH1750_ReadLux ( float* )
mcm 0:bea4477679ee 263 * @details It turns the raw data into a Lux data.
mcm 0:bea4477679ee 264 *
mcm 0:bea4477679ee 265 * @param[in] myLux: Variable to store the Lux.
mcm 0:bea4477679ee 266 *
mcm 0:bea4477679ee 267 * @param[out] Status of BH1750_ReadLux.
mcm 0:bea4477679ee 268 *
mcm 0:bea4477679ee 269 *
mcm 0:bea4477679ee 270 * @return NA
mcm 0:bea4477679ee 271 *
mcm 0:bea4477679ee 272 * @author Manuel Caballero
mcm 0:bea4477679ee 273 * @date 10/August/2017
mcm 0:bea4477679ee 274 * @version 10/August/2017 The ORIGIN
mcm 0:bea4477679ee 275 * @pre NaN
mcm 0:bea4477679ee 276 * @warning BH1750_TriggerMeasurement MUST be call before.
mcm 0:bea4477679ee 277 */
mcm 0:bea4477679ee 278 uint32_t BH1750::BH1750_ReadLux ( float* myLux )
mcm 0:bea4477679ee 279 {
mcm 0:bea4477679ee 280 uint32_t aux = 0;
mcm 0:bea4477679ee 281 char myRawData[] = { 0, 0};
mcm 0:bea4477679ee 282
mcm 0:bea4477679ee 283
mcm 0:bea4477679ee 284 aux = BH1750_ReadRawData ( &myRawData[0] );
mcm 0:bea4477679ee 285
mcm 0:bea4477679ee 286
mcm 0:bea4477679ee 287 if ( ( BH1750_Mode == BH1750_CONTINUOUSLY_H_RESOLUTION_MODE ) || ( BH1750_Mode == BH1750_CONTINUOUSLY_L_RESOLUTION_MODE ) || ( BH1750_Mode == BH1750_ONE_TIME_H_RESOLUTION_MODE ) ||
mcm 0:bea4477679ee 288 ( BH1750_Mode == BH1750_ONE_TIME_L_RESOLUTION_MODE ) )
mcm 0:bea4477679ee 289 {
mcm 0:bea4477679ee 290 *myLux = ( myRawData[0] << 8 ) | myRawData[1];
mcm 0:bea4477679ee 291 *myLux = ( uint16_t )( *myLux / 1.2 );
mcm 0:bea4477679ee 292 }
mcm 0:bea4477679ee 293 else
mcm 0:bea4477679ee 294 {
mcm 0:bea4477679ee 295 *myLux = ( ( myRawData[0] << 8 ) | myRawData[1] ) >> 1;
mcm 0:bea4477679ee 296 *myLux = ( uint16_t )( *myLux / 1.2 );
mcm 0:bea4477679ee 297
mcm 0:bea4477679ee 298 if ( ( myRawData[1] & 0x01 ) == 0x01 )
mcm 0:bea4477679ee 299 *myLux += 0.5;
mcm 0:bea4477679ee 300 }
mcm 0:bea4477679ee 301
mcm 0:bea4477679ee 302
mcm 0:bea4477679ee 303
mcm 0:bea4477679ee 304 if ( aux == I2C_SUCCESS )
mcm 0:bea4477679ee 305 return BH1750_SUCCESS;
mcm 0:bea4477679ee 306 else
mcm 0:bea4477679ee 307 return BH1750_FAILURE;
mcm 0:bea4477679ee 308 }
mcm 0:bea4477679ee 309
mcm 0:bea4477679ee 310