Farbmessung mit dem APDS9960-Sensor

Hier werden einzelne Projekte mit MicroPython vorgestellt
Antworten
Heinrichs
Beiträge: 171
Registriert: Do 21. Okt 2010, 18:31

Farbmessung mit dem APDS9960-Sensor

Beitrag von Heinrichs » Mi 8. Mär 2023, 17:10

Die Messung von Farben erfolgt ganz ähnlich wie die Proximity-Messung: Bei der Instanziierung des Sensors wird lediglich prox durch als ersetzt:

Code: Alles auswählen

i2c = I2C(1, sda=Pin(22), scl=Pin(21))
apds9960=APDS9960_ALS_PROX.APDS9960(i2c)      # apds9960 instanziieren
s = apds9960.als                  # ALS-Sensor s instanziieren
s.enableSensor()                  # Licht-Sensor aktivieren
Die Lichtwerte für die einzelnen Farben können wir dann mit

s.redLightLevel bzw. s.greenLightLevel bzw. s.blueLightLevel

erhalten und mit einer print-Funktion auf dem Terminal ausgeben lassen. Will man statt der Rohwerte relative Farbwerte anzeigen lassen, benutzt man das Property rgb_tuple: print(s.rgb_tuple) zeigt dann die relativen Farbwerte als 3-Tupel an.

Besonders wirkungsvoll ist es, wenn man den Sensor mit verschiedenfarbigen LEDs beleuchtet, z. B. mit Hilfe eines RGB-LED-Moduls wie dem JY-MCU-Baustein.

Das folgende Programm beleuchtet den Sensor nacheinander mit rotem, grünen und blauen Licht und zeigt die gemessenen Lichtwerte am Terminal an.

Code: Alles auswählen

# APDS9960_ALS_colors_test_1.py (08.03.2023)
# Für APDS9960!

# 3 LEDs (R, G, B) beleuchten das APDS9960-Modul nacheinander.
# Wir benutzen ein RGB-LED-Modul (JY-MCU) mit eingebauten Vorwiderständen 100 bzw. 50 Ohm.
# Die jeweils gemessenen Farbwerte werden auf dem Terminal (als Rohwert und in %) ausgegeben.

#########################
# APDS9960 | TTGO       #
# --------------------- #
# GND      | G          #
# VCC      | 3V (3.3 V) #
# SDA      | Pin22      #
# SCL      | Pin21      #
#########################
#  Blaue LED an Pin25   #
#  Grüne LED an Pin26   #
#  Rote LED an Pin27    #
#########################


from machine import Pin, I2C
from time import sleep_ms
import APDS9960_ALS_PROX

blue = Pin(25, Pin.OUT)
green = Pin(26, Pin.OUT)
red = Pin(27, Pin.OUT)

time = 1000 # Blink-Intervall in ms

#Init I2C 
i2c = I2C(1, sda=Pin(22), scl=Pin(21))
apds9960=APDS9960_ALS_PROX.APDS9960(i2c)      # apds9960 instanziieren
s = apds9960.als                  # ALS-Sensor s instanziieren
s.enableSensor()                  # Licht-Sensor aktivieren
s.eLightGain = 1                  # Foto-Signal-Verstärkung (0..3); Standardwert: 0

print('eLightGain: ', s.eLightGain) # nur zur Kontrolle
print()

def messung():
    sleep_ms(10)
    '''while (apds9960.statusRegister & 0b0000_0001) == 0: # warten bis AVALID = 1
        pass'''
    abs_colors = (s.redLightLevel, s.greenLightLevel, s.blueLightLevel)
    print('absolute Farbwerte:', abs_colors)
    print('relative Farbwerte:', s.rgb_tuple)
    red, green, blue = s.rgb_tuple
    print()

while True:
    print('R E D')
    red.on()
    messung()
    sleep_ms(time)
    red.off()
    
    print('G R E E N')
    green.on()
    messung()
    sleep_ms(time)
    green.off()
    
    print('B L U E')
    blue.on()
    messung()
    sleep_ms(time)
    blue.off()
Hier noch ein Bild von einer solchen Messung. Allerdings wurden hier zusätzlich die relativen Farbwerte in einem Balkendiagramm auf dem Display des TTGO T-Display angezeigt.

rgb_messung.jpg
Abb. 1: RGB-Messung mit Balkendiagramm
rgb_messung.jpg (180.73 KiB) 6434 mal betrachtet

Ein zugehöriges Programm sowie ein Video finden Sie im Anhang.

.
Dateianhänge
rgb_messung.zip
Programm und Video zu Abb. 1
(2.46 MiB) 334-mal heruntergeladen

Antworten