In this article we connect a LTR303 UV Light Sensor to the Raspberry Pi Pico
Sensor Information
The LTR-303ALS-01 is a low voltage I2C digital light sensor [ALS] in a low cost miniature chipled lead-free surface mount package. This sensor converts light intensity to a digital output signal capable of direct I2C interface. It providesa linear response over a wide dynamic range from 0.01 lux to 64k lux and is well suited to applications under high ambient brightness.
There are altogether six gain settings (1X, 2X, 4X, 8X, 48X and 96X) available for user to configure.The sensor supports an interrupt feature that removes the need to poll the sensor for a reading which improves system efficiency.
The sensor also supports several features that help to minimize the occurrence of false triggering. This CMOS design and factory-set one time trimming capability ensure minimal sensor-to-sensor variations for ease of manufacturability to the end customers
Features
I2C interface (Fast Mode @ 400kbit/s)
Ultra-small 6-pin ChipLED package
2.0mm(L), 2.0mm(B), 0.7mm(H)
Built-in temperature compensation circuit
Low active power consumption with standby mode
Supply voltage range from 2.4V to 3.6V capable of 1.7V logic voltage
Operating temperature range from –
RoHS and Halogen free compliant
Close to human eye spectral response
Immunity to IR / UV Light Source
Automatically rejects 50 / 60 Hz lightings flicker
Full dynamic range from 0.01 lux to 64k lux
16-bit effective resolution
This is the sensor that I bought
Parts Required
The sensor you can pick up in the $6 price range – you can connect to the sensor using a standard header the classic dupont style jumper wire.
I used a Qwiic cable – since a few sensors seem to use these but this is optional
Name | Link |
Pico | Raspberry Pi Pico Development Board |
LTR303 | adafruit LTR303 |
Connecting cables | Aliexpress product link |
Schematic/Connection
I used the Adafruit LTR303 sensor and in this case used the Stemma connection
For the STEMMA QT cables, it uses the Qwiic convention:
Black for GND
Red for V+
Blue for SDA
Yellow for SCL
So color coded for ease of use, this layout shows a connection to the module
Code Example
I used Thonny for development and I am using Circuitpython
You will need to download and install the latest circuitpython from the citrcuitpython download site
The following is based on a library which you can download the zip bundle from https://github.com/adafruit/Adafruit_CircuitPython_Bundle/releases
Before you continue make sure your board’s lib folder or root filesystem has the adafruit_ltr329_ltr303.mpy, adafruit_bus_device, and adafruit_register files and folders copied over on the RP2040 – https://circuitpython.org/libraries
This is the basic example
import time import board import busio import adafruit_ltr329_ltr303 as adafruit_ltr303 i2c = busio.I2C(board.GP1, board.GP0) # SCL, SDA # i2c = board.STEMMA_I2C() # For using the built-in STEMMA QT connector on a microcontroller time.sleep(0.1) # sensor takes 100ms to 'boot' on power up ltr303 = adafruit_ltr303.LTR303(i2c) # Can set the ALS light gain, can be: 1, 2, 4, 8, 48 or 96 times # to range from 1~64 kLux to 0.01~600 Lux ltr303.als_gain = 96 print("LTR-303 ALS gain:", ltr303.als_gain) # Can set the ALS measurement integration time, how long the sensor # 'looks' for light data. Default is 100ms. # Set to: 50, 100, 150, 200, 250, 300, 350, or 400 millisec # ltr303.integration_time = 50 print("LTR-303 integration time (ms):", ltr303.integration_time) # Can set the ALS measurement rate, how often the data register updates # Default is 500ms. Must be equal or greater than the integration time # Set to: 50, 100, 200, 500, 1000, 2000 millisec # ltr303.measurement_rate = 500 print("LTR-303 measurement rate (ms):", ltr303.measurement_rate) # Can put into stand-by mode at any time, for low power usage # self.active_mode = False # The LTR-303, unlike the LTR-329, can also generate an IRQ output # The interrupt output can be enabled ltr303.enable_int = True # We can also change whether the polarity is active LOW (False) or HIGH (True) # Default is LOW (False) ltr303.int_polarity = False # Then set the low and high thresholds that would trigger an IRQ! ltr303.threshold_low = 2000 # interrupt goes off if BELOW this number ltr303.threshold_high = 40000 # or ABOVE this number! print("Interrupt thresholds:", ltr303.threshold_low, ltr303.threshold_high) # Finally, we can set how many measurements must be above/below before # we trigger an IRQ - basically avoid spurious readings. A setting of 1 # means every value triggers an int, 2 means two consecutive readings to # trigger... up to 16! ltr303.int_persistence = 4 while True: # The sensor will let us know when the measurement time has # created a new data reading! if ltr303.new_als_data_available: # The sensor can get 'overwhelmed' by bright light if the # gain isn't set right, in which case the data is invalid. # We can check the data invalid first and toss out the reading... if ltr303.als_data_invalid: ltr303.throw_out_reading() # perform & toss out the reading continue # try again next time! # OR we can 'try' to do the read and get an exception if the # data is invalid try: # If we're using `new_als_data_available` we should # read both channels ONCE only! To do that use... visible_plus_ir, ir = ltr303.light_channels # this will get both channels at once! (It's also faster) # Now we can do various math... print("Visible + IR:", visible_plus_ir) print("Infrared :", ir) print("ALS gain: :", ltr303.als_data_gain) print() except ValueError: # we can also check `ltr303.als_data_invalid` if we # want, to verify that print("Light sensor data invalid, trying again!") time.sleep(0.1)
Output
Here is what I saw in Thonny REPL window
>>> %Run -c $EDITOR_CONTENT LTR-303 ALS gain: 96 LTR-303 integration time (ms): 100 LTR-303 measurement rate (ms): 500 Interrupt thresholds: 2000 40000 Visible + IR: 1471 Infrared : 859 ALS gain: : 96 Visible + IR: 1254 Infrared : 756 ALS gain: : 96 Visible + IR: 17 Infrared : 25 ALS gain: : 96 Visible + IR: 1488 Infrared : 869 ALS gain: : 96
Links
https://optoelectronics.liteon.com/upload/download/DS86-2013-0004/LTR-303ALS-01_DS_V1.pdf