Library for BH1750 I2C light sensor. Supports autoranging! True to datasheet. (beware: calls are blocking at the moment)

So there is this light sensor (like the one present in any phone), BH1750. I got mine soldered to some nice breakout board.

Few facts about this library: it is very true to the datasheet. it takes advantage of MTreg (time of measurement), which lets you to increase resolution up to 3.86 times at the cost of time it takes to perform a measurement. Measurement is blocking ! I've also implemented an autoranging feature. Just like in those fancy multimeters! It works as follows, thresholds are hard-coded:

  1. <5 lx switches to Hi-res2 and to max MTreg (so measurement time is like 500ms)
  2. <1000 lx Hi-res, MTreg default.
  3. above there is no real need for Hi-res, so Low-res mode is used.

Last note: I greatly recommend you to use log10 value of the luminosity data. it makes much more sense, because it becomes linear.

Committer:
amateusz
Date:
Tue Aug 22 00:29:50 2017 +0000
Revision:
0:a7280a6c3c9b
initial commit. supports autoranging, addresss selection, all continous modes

Who changed what in which revision?

UserRevisionLine numberNew contents of line
amateusz 0:a7280a6c3c9b 1 #include "mbed.h"
amateusz 0:a7280a6c3c9b 2
amateusz 0:a7280a6c3c9b 3 #ifndef BH1750_h
amateusz 0:a7280a6c3c9b 4 #define BH1750_h
amateusz 0:a7280a6c3c9b 5
amateusz 0:a7280a6c3c9b 6 class BH1750
amateusz 0:a7280a6c3c9b 7 {
amateusz 0:a7280a6c3c9b 8 private:
amateusz 0:a7280a6c3c9b 9 static const char ADDRESS_LOW = 0x23;
amateusz 0:a7280a6c3c9b 10 static const char ADDRESS_HIGH = 0x5C;
amateusz 0:a7280a6c3c9b 11 static const char powerOn_cmd = 0b00000001;
amateusz 0:a7280a6c3c9b 12 static const char powerDown_cmd = 0b00000000;
amateusz 0:a7280a6c3c9b 13 static const char reset_cmd = 0b00000111;
amateusz 0:a7280a6c3c9b 14
amateusz 0:a7280a6c3c9b 15 static const char L_RES_MEASUREMENT_TIME = 12; // ms
amateusz 0:a7280a6c3c9b 16 static const char H_RES_MEASUREMENT_TIME = 120; // ms
amateusz 0:a7280a6c3c9b 17
amateusz 0:a7280a6c3c9b 18 char _address;
amateusz 0:a7280a6c3c9b 19 char _currentMode;
amateusz 0:a7280a6c3c9b 20 char _currentMtreg;
amateusz 0:a7280a6c3c9b 21 unsigned int _waitForMeasurement;
amateusz 0:a7280a6c3c9b 22 bool _autoModeAdjustSwitch;
amateusz 0:a7280a6c3c9b 23 I2C &_i2c_inst;
amateusz 0:a7280a6c3c9b 24
amateusz 0:a7280a6c3c9b 25 void _sendCommand(char);
amateusz 0:a7280a6c3c9b 26
amateusz 0:a7280a6c3c9b 27 unsigned int _readRaw();
amateusz 0:a7280a6c3c9b 28 bool _autoModeAdjust(float measurement); // returns if adjusted or left alone
amateusz 0:a7280a6c3c9b 29 float _readSingle();
amateusz 0:a7280a6c3c9b 30 public:
amateusz 0:a7280a6c3c9b 31 static const char CONTINOUS_L_RES_CMD = 0b00010011;
amateusz 0:a7280a6c3c9b 32 static const char CONTINOUS_H_RES_CMD = 0b00010000;
amateusz 0:a7280a6c3c9b 33 static const char CONTINOUS_H2_RES_CMD = 0b00010001;
amateusz 0:a7280a6c3c9b 34 static const char ONETIME_L_RES_CMD = 0b01000011;
amateusz 0:a7280a6c3c9b 35 static const char ONETIME_H_RES_CMD = 0b01000000;
amateusz 0:a7280a6c3c9b 36 static const char ONETIME_H2_RES_CMD = 0b01000001;
amateusz 0:a7280a6c3c9b 37 static const char DEFAULTMTREG = 69;
amateusz 0:a7280a6c3c9b 38
amateusz 0:a7280a6c3c9b 39 BH1750(I2C & , bool autoRange = false, bool addressPinState = false);
amateusz 0:a7280a6c3c9b 40 void power(bool); // power on or off.
amateusz 0:a7280a6c3c9b 41 float read(); // main function to read a value (or rather perform a read when in one_time mode)
amateusz 0:a7280a6c3c9b 42 void setMode(const char); // set mode. datasheet lists L, H, H2 resolution modes in continous and one_time versions
amateusz 0:a7280a6c3c9b 43 void setMtreg(char); // correcting measurement time. can be used to increase precision by a factor of 3.86 at the cost of time
amateusz 0:a7280a6c3c9b 44 };
amateusz 0:a7280a6c3c9b 45
amateusz 0:a7280a6c3c9b 46 #endif