Wie man eine RGB LED am ESP32 mit MicroPython programmiert, möchte ich dir in diesem Beitrag erläutern.
benötigte Bauteile
Für den betrieb einer RGB LED am ESP32 benötigst du folgende Bauteile:
- einen ESP32*,
- vier Breadboardkabel*, 10 cm, Stecker – Stecker,
- eine RGB LED vom Typ “WS18B20”*
Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!
Aufbau einer RGB LED vom Typ WS18B20
Die RGB LED verfügt über 4 Beinchen, welche jeweils unterschiedlich lang sind. Des Weiteren verfügt die RGB LED über eine abgeflachte Seite am Gehäuse, somit können wir die Pinbelegung besser ermitteln.
Es gibt natürlich auch fertige RGB LED Shields / NeoPixel auf dem Markt welche man etwas besser an den ESP32 anschließen kann. An diese Module lassen sich Litzen anlöten und somit kann man diese einfacher anschließen.
Die dort verbauten NeoPixel haben die Modelbezeichnung “WS2812B” wobei die Programmierung und die selbe ist wie bei den “WS18B20”.
Aufbau der Schaltung am ESP32
In dieser Schaltung wollen wir zunächst eine RGB LED betreiben. Diese RGB LED verfügt wie bereits gezeigt über 4 Beinchen welche für den digitalen Eingang (DIN), die Spannungsversorgung (VCC)von 3,5V bis max. 6V sowie den Minuspol (G) dienen. Das vierte Beinchen der RGB LED dient für das kaskadierende Anschließen weiterer LEDs, somit kann man eine Reihe von x RGB LEDs hintereinander anschließen und nur mit einem digitalen Pin betreiben.
Programmieren
setzen der Farbe an einer RGB LED vom Typ WS2812B am ESP32
Wenn du die gleiche Entwicklungsumgebung (uPyCraft) und Python3 wie ich verwendest, dann musst du keine zusätzliche Bibliothek installieren.
Zum Ansteuern der NeoPixel importieren wir die Bibliothek “neopixel”.
import neopixel
Des Weiteren benötigen wir aus der bereits bekannten Bibliothek “machine” das Modul “Pin”.
from machine import Pin
Zunächst erzeugen wir uns ein NeoPixel Objekt, meine RGB Led ist am GPIO 4 angeschlossen. Dem Konstruktor des Objektes NeoPixel übergeben wir ein “Pin” Objekt sowie die Anzahl der NeoPixel.
rgbLeds = neopixel.NeoPixel(Pin(4, Pin.OUT), 1)
Über einen Index können wir nun jede einzelne RGB LED steuern. Da wir in diesem Beispiel nur eine RGB LED haben greifen wir mit dem Index “0” auf die einzelne LED zu und weisen dieser die Farbe “rot” zu.
rgbLeds[0] = (0, 255, 0)
Interessant ist, das es nicht im Format “RGB” also rot – grün – blau ist, sondern im Format grün – rot – blau. Der minimale Wert für eine Farbe ist “0” und der maximale ist “255”.
Wenn du also die Farbe grün einstellen möchtest so wählst du hier den Wert “rgbLeds[0] = (255, 0, 0)”.
Mit der Methode “write” wird der gesetzte Farbwert auf die LED “geschrieben”.
rgbLeds.write()
Hier nun der komplette Quellcode:
import neopixel from machine import Pin rgbLeds = neopixel.NeoPixel(Pin(4, Pin.OUT), 1) rgbLeds[0] = (0, 255, 0) rgbLeds.write()
Wechselblinken zweier RGB LEDs
Zum betrieb zweier LEDs verwende ich zusätzlich ein Power Modul an welchem eine 9V Block Batterie angeschlossen ist. Das hat den Hintergrund das ein GPIO Pin des ESP32 nur maximal 12mA Leistung hat. Ich konnte leider kein Datenblatt finden wo für die RGB LED WS2812B bzw. PL9823-F5 die Technischen Daten komplett abgebildet sind. Einzig auf aliexpress.com habe ich in einer Artikelbeschreibung gefunden das diese RGB LED wohl eine maximale Stromaufnahme von 120mA (an anderen Stellen steht 100mA) hat.
Aufbau der Schaltung mit 2 RGB LEDs
Die Stromversorgung der LEDs kommt, wie eingangs erwähnt von einer 9V Block Batterie. Zusätzlich muss für den Potentialausgleich “-” von der Stromversorgung mit “G” des ESP32 verbunden werden. Des Weiteren wird DOUT der LED1 mit DIN der LED2 (blaues Breadboardkabel im Bild) verbunden.
Quellcode
Wir nutzen als Basis das Programm aus dem vorherigen Beispiel mit nur einer RGB LED. Wir müssen hier nur den Konstruktor anpassen so das 2 LEDs angesprochen werden können.
rgbLeds = neopixel.NeoPixel(Pin(4, Pin.OUT), 2)
Die Methode “setColor” erweitern wir um einen Parameter für den Index der LED (0 oder 1).
def setColor(led, red, green, blue): rgbLeds[led] = (green, red, blue) print("RGB {%1d} Value={%3d, %3d, %3d}"%(led,red, green, blue)) rgbLeds.write()
In der Endlosschleife setzen wir nun die Farben der jeweiligen LEDs immer abwechselnd in einem Intervall von 500ms.
Die LED am Index 0 wird in der Farbe “rot” blinken und die andere LED in der Farbe “grün”. Zwischendrin wird die Farbe jeweils auf “schwarz” (alle Werte auf 0) gesetzt, so das die LED deaktiviert ist.
while(1): setColor(0,255,0,0) sleep(0.5) setColor(0,0,0,0) sleep(0.5) setColor(1,0,255,0) sleep(0.5) setColor(1,0,0,0) sleep(0.5)
Das gesamte Programm:
import neopixel from machine import Pin from time import sleep rgbLeds = neopixel.NeoPixel(Pin(4, Pin.OUT), 2) def setColor(led, red, green, blue): rgbLeds[led] = (green, red, blue) print("RGB {%1d} Value={%3d, %3d, %3d}"%(led,red, green, blue)) rgbLeds.write() while(1): setColor(0,255,0,0) sleep(0.5) setColor(0,0,0,0) sleep(0.5) setColor(1,0,255,0) sleep(0.5) setColor(1,0,0,0) sleep(0.5)