Library for the BH1750 Digital 16-bit Serial Output Type Ambient Light Sensor IC.
BH1750.cpp@0:bea4477679ee, 2017-08-10 (annotated)
- Committer:
- mcm
- Date:
- Thu Aug 10 12:47:55 2017 +0000
- Revision:
- 0:bea4477679ee
- Child:
- 1:8115dc8275eb
Library for the BH1750 Digital 16-bit Serial Output Type Ambient Light Sensor IC.; ; It is almost ready to be tested.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mcm | 0:bea4477679ee | 1 | /** |
mcm | 0:bea4477679ee | 2 | * @brief BH1750.h |
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 | 0:bea4477679ee | 21 | BH1750::BH1750 ( PinName sda, PinName scl, uint32_t addr, uint32_t hz ) |
mcm | 0:bea4477679ee | 22 | : i2c ( sda, scl ) |
mcm | 0:bea4477679ee | 23 | , BH1750_Addr ( addr ) |
mcm | 0:bea4477679ee | 24 | { |
mcm | 0:bea4477679ee | 25 | i2c.frequency(hz); |
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 | 0:bea4477679ee | 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 | 0:bea4477679ee | 151 | uint32_t BH1750::BH1750_TriggerMeasurement ( uint32_t MODE ) |
mcm | 0:bea4477679ee | 152 | { |
mcm | 0:bea4477679ee | 153 | char cmd[] = { MODE }; |
mcm | 0:bea4477679ee | 154 | uint32_t aux = 0; |
mcm | 0:bea4477679ee | 155 | |
mcm | 0:bea4477679ee | 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 |