In this article we look at another light-to-digital converter – this time its the TSL2591 and we will connect it to our Raspberry Pi and we will use a python library and create an example to show the sensor in use
Sensor Information
The TSL2591 is a very high sensitivity light-to-digital converter that transforms light intensity into a digital signal output capable of direct I2C interface. The device combines one broadband photodiode (visible plus infrared) and one infrared-responding photodiode on a single CMOS integrated circuit.
Two integrating ADCs convert the photodiode currents into a digital output that represents the irradiance measured on each channel.
This digital output can be input to a microprocessor where illuminance (ambient light level) in lux is derived using an empirical formula to approximate the human eye response. The TSL2591 supports a traditional level style interrupt that remains asserted until the firmware clears it
Features
- Highest sensitivity to 188µLux
- Patented dual-diode architecture
- 600M:1 dynamic range
- Programmable interrupt function
- UV-rejection package
This is the breakout I bought
Parts Required
Here are the parts required to build this, there are various links you can choose from – I personally buy from Aliexpress as it is usually cheaper but you will probably have to wait 3+ weeks
Name | Links |
Raspberry Pi 4 Model B Development Board | Aliexpress link |
TSL2591 Optical Light Sensor | Aliexpress link |
Connecting wire | Aliexpress link |
Schematic/Connection
Again being an I2C sensor this is easy to connect to any Raspberry Pi
Code Example
This code example uses an adafruit library, you can install this from the command line with the following line
sudo pip3 install adafruit-circuitpython-tsl2591
I then opened the Mu editor and entered the following code example
[codesyntax lang=”python”]
# Simple demo of the TSL2591 sensor. Will print the detected light value # every second. import time import board import busio import adafruit_tsl2591 # Initialize the I2C bus. i2c = busio.I2C(board.SCL, board.SDA) # Initialize the sensor. sensor = adafruit_tsl2591.TSL2591(i2c) # You can optionally change the gain and integration time: # sensor.gain = adafruit_tsl2591.GAIN_LOW (1x gain) # sensor.gain = adafruit_tsl2591.GAIN_MED (25x gain, the default) # sensor.gain = adafruit_tsl2591.GAIN_HIGH (428x gain) # sensor.gain = adafruit_tsl2591.GAIN_MAX (9876x gain) # sensor.integration_time = adafruit_tsl2591.INTEGRATIONTIME_100MS (100ms, default) # sensor.integration_time = adafruit_tsl2591.INTEGRATIONTIME_200MS (200ms) # sensor.integration_time = adafruit_tsl2591.INTEGRATIONTIME_300MS (300ms) # sensor.integration_time = adafruit_tsl2591.INTEGRATIONTIME_400MS (400ms) # sensor.integration_time = adafruit_tsl2591.INTEGRATIONTIME_500MS (500ms) # sensor.integration_time = adafruit_tsl2591.INTEGRATIONTIME_600MS (600ms) # Read the total lux, IR, and visible light levels and print it every second. while True: # Read and calculate the light level in lux. lux = sensor.lux print("Total light: {0}lux".format(lux)) # You can also read the raw infrared and visible light levels. # These are unsigned, the higher the number the more light of that type. # There are no units like lux. # Infrared levels range from 0-65535 (16-bit) infrared = sensor.infrared print("Infrared light: {0}".format(infrared)) # Visible-only levels range from 0-2147483647 (32-bit) visible = sensor.visible print("Visible light: {0}".format(visible)) # Full spectrum (visible + IR) also range from 0-2147483647 (32-bit) full_spectrum = sensor.full_spectrum print("Full spectrum (IR + visible) light: {0}".format(full_spectrum)) time.sleep(1.0)
[/codesyntax]
Output
Run this example and you should see the following
Total light: 82.64447999999997lux
Infrared light: 2320
Visible light: 152045440
Full spectrum (IR + visible) light: 152047760
Total light: 82.43558399999993lux
Infrared light: 2316
Visible light: 151783292
Full spectrum (IR + visible) light: 151785608
Links