The BH1750 device is a digital light sensor which uses the I2C interface. This allows it to be connected to the Raspberry Pi with only four wires.
The module allows quick and cheap ambient light level measurement and the light level can be read from it as a digital number due to the built in 16-bit analogue-to-digital converter. The device itself is commonly used in mobile phones, LCD TVs and digital cameras.
The module I’ve got measures only 32 x 16mm. I soldered a five pin header onto the PCB and this allowed me to plug it onto a piece of breadboard.
The BH1750 Ambient Light Sensor IC datasheet provides all the technical details some of which are used in my example Python script.
Configure I2C Interface
In order to use this module you must enable the I2C interface on the Raspberry Pi as it is not enabled by default. This is a fairly easy process and is described in my Enabling The I2C Interface On The Raspberry Pi tutorial.
Connecting Light Sensor Hardware to the Pi
The following table shows how I connected the module pins on the PCB to the Pi’s GPIO header (P1). Please refer to my GPIO header guide for a diagram.
|Module PCB||Desc||GPIO Header Pins|
Here is a diagram of a breadboard setup. If you are connecting the module’s five pins directly to the Pi you only need five female-female wires.
This Fritzing diagram uses a custom part I created for my module. Other modules may have a different pin arrangement so make sure you are connecting the correct pins to the Pi if yours is slightly different.
With the device connected and the Pi powered up the “i2cdetect” command should show the device with address 0x23.
Example Python Script to Show Light Level
You can download an example script to read the light level from the module and print it to the screen.
Use the following command :
or use this link in a browser.
In order to run it you can use :
or for Python 3 :
The output should look something like :
The while loop keeps taking readings every half second until you press CTRL-C.
Python Script Notes :
- The import statements import Python libraries used in the rest of the code including smbus which handles the I2C interface.
- All I2C devices must have an address. In this example I tied the ADDR pin to ground so the address used by the device is 0x23. The address becomes 0x5C if the ADDR pin is tied to 3.3V.
- The block of constants are listed in the datasheet and define the different modes the device can operate in. I define all of them but only use “ONE_TIME_HIGH_RES_MODE_1”. The other modes are only of any real interest if you need to take high speed readings.
- The “smbus.SMBus(1)” function setups the I2C interface.
- The “read_i2c_block_data” function is used to read 2 bytes of data from the device using the ONE_TIME_HIGH_RES_MODE_1.
- The convertToNumber function is then used to convert those 2 bytes of data into a number. The 1.2 value in the calculation is defined in the datasheet.
Buy a BH1750 Module
The module is available from various online sellers :