In diesem Beitrag möchte ich dir gerne erläutern, wie du zwei RGB Stripes am ESP32 anschließen und mit jeweils zwei Taster steuern kannst.
Die Idee zu diesem Beitrag habe ich aus einem Kommentar zum Beitrags ESP32 mit RGB Stripe entnommen. Daher vielen Dank an Markus B.
Benötigte Ressourcen für dieses Projekt
Wenn du das kleine Projekt nachbauen möchtest, dann benötigst du:
- einen ESP32*,
- ein passendes USB-Datenkabel*,
- zwei 8bit RGB Stripes*,
- zwei Taster*,
- zwei 400 Pin Breadboards*,
- ein Power Supply Modul*,
- eine 9V Block-Batterie*,
- diverse Breadboardkabel*, männlich – männlich, 10 cm
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 der Schaltung
Die Schaltung ist mit zwei Taster und zwei RGB Stripes recht einfach. Der ESP32 liefert im Normalfall lediglich 3.3V, die RGB Stripes jedoch benötigen 5V, hier kann man mit einem Power Supply Modul, welches man auf ein Breadboard steckt, diese benötigte Spannung bereitstellen.
Die Schaltung sieht in meinem Fall wie folgt aus. Ich verwende hier den Mikrocontroller ESP32 von AZ-Delivery im Formfaktor eines Arduino UNOs, diesen habe ich dir bereits im Beitrag AZ-Delivery D1 Board mit ESP32 Chip vorgestellt.
Programmieren
Zum Steuern der RGB Stripes sowie zum Entprellen der Taster benötigen wir jeweils eine Bibliothek, welche wir zuvor installieren.
Ich gehe davon aus, dass du deinen ESP32 bereits in die Arduino IDE eingerichtet hast.
Aktivieren / Deaktivieren der RGB Stripes per Taster
Im ersten Beispiel möchte ich dir erläutern, wie du per Taster die RGB Stripes aktivierst bzw. deaktivierst.
//Bibliothek zum steuern der NeoPixel am Mikrocontroller #include <Adafruit_NeoPixel.h> //Bibliothek zum entprellen der Taster #include <Bounce2.h> //Taster 1 am GPIO13 angeschlossen #define button1 13 //RGB Stripe 2 am GPIO16 angeschlossen #define rgbStripe1 16 //Taster 2 am GPIO27 angeschlossen #define button2 27 //RGB Stripe 2 am GPIO17 angeschlossen #define rgbStripe2 17 //Bounce2 Objekte initialisieren für die Taster Bounce btn1 = Bounce(); Bounce btn2 = Bounce(); //Anzahl der NeoPixel pro Modul / Stripe const int NUM_PIXEL = 8; //Initialisieren der Adafruit_NeoPixel Objekte //für jeden Stripe wird ein Objekt benötigt. Adafruit_NeoPixel pixelStripe1 = Adafruit_NeoPixel(NUM_PIXEL, rgbStripe1, NEO_GRB + NEO_KHZ800); Adafruit_NeoPixel pixelStripe2 = Adafruit_NeoPixel(NUM_PIXEL, rgbStripe2, NEO_GRB + NEO_KHZ800); //Farben für aktiviert / deaktiviert definieren const uint32_t COLOR_ACTIVE = pixelStripe1.Color(255, 255, 255); const uint32_t COLOR_DEACTIVE = pixelStripe1.Color(0, 0, 0); //Felder zum speichern der Zustände der RGB Stripe bool stripe1Active = false; bool stripe2Active = false; void setup() { //Einrichten des ersten Tasters btn1.attach(button1, INPUT_PULLUP); btn1.interval(25); //Einrichten des zweiten Tasters btn2.attach(button2, INPUT_PULLUP); btn2.interval(25); //Beginn der kommunikation mit den RGB Stripes pixelStripe1.begin(); pixelStripe2.begin(); } /** * Befüllen eines RGB Stripes mit einer Farbe je nach Status **/ void setPixelStripe(Adafruit_NeoPixel pixelStripe, bool isActive) { if (isActive) { pixelStripe.fill(COLOR_ACTIVE, 0, NUM_PIXEL); } else { pixelStripe.fill(COLOR_DEACTIVE, 0, NUM_PIXEL); } pixelStripe.show(); } void loop() { //aktualisieren der Bounce2 Objekte btn1.update(); btn2.update(); //Wenn die Taste betätigt wird, dann... if (btn1.fell()) { //umkehren des zuvor gespeicherten Status stripe1Active = !stripe1Active; //aktualisieren des RGB Stripes setPixelStripe(pixelStripe1, stripe1Active); } if (btn2.fell()) { stripe2Active = !stripe2Active; setPixelStripe(pixelStripe2, stripe2Active); } }
Wenn du den Code auf deinen ESP32 aufspielst, dann kannst du mit jedem Taster jeweils die eine RGB Stripe aktivieren & deaktivieren.
Den Code findest du nachfolgend einfach als ZIP-Datei zum Download.
Blinken eines RGB Stripes per Taster
Im zweiten Beispiel möchte ich per Taster ein RGB Stripe zum Blinken bringen. Jedoch bin ich dabei auf einen Fehler gestoßen.
CORRUPT HEAP: Bad head at 0x3ffb7f0c. Expected 0xabba1234 got 0x3ffb7ff0
abort() was called at PC 0x400838a5 on core 1
Etwas Googeln hat hier ergeben, dass dieser Fehler wohl auftritt, wenn ein Speicherbereich überschrieben wird, was nicht sein darf.
Die Analyse hat ergeben, dass der Code deutlich eingekürzt werden muss, zusätzlich musste ich dann noch die Schaltung etwas anpassen, denn wir benötigen nun nur noch eine Instanz vom Adafruit Neopixel Objekt.
Programmieren des Blinkens von zwei RGB Stripes mit zwei Taster
Nachfolgend jetzt das erweiterte Programm, wo nur eine Instanz des Adafruit Neopixel Objektes benötigt wird.
//Bibliothek zum steuern der NeoPixel am Mikrocontroller #include <Adafruit_NeoPixel.h> //Bibliothek zum entprellen der Taster #include <Bounce2.h> //Taster 1 am GPIO13 angeschlossen #define button1 13 //RGB Stripe 2 am GPIO16 angeschlossen #define rgbStripe1 16 //Taster 2 am GPIO27 angeschlossen #define button2 27 //Bounce2 Objekte initialisieren für die Taster Bounce btn1 = Bounce(); Bounce btn2 = Bounce(); const int PUSH_INTERVAL = 25; //Anzahl der NeoPixel pro Modul / Stripe const int NUM_PIXEL = 16; //Initialisieren der Adafruit_NeoPixel Objekte //für jeden Stripe wird ein Objekt benötigt. Adafruit_NeoPixel pixelStripe = Adafruit_NeoPixel(NUM_PIXEL, rgbStripe1, NEO_GRB + NEO_KHZ800); //Wie oft die RGB Stripe blinken soll, //dabei zählt jeweil einmal AN und einmal AUS als zwei Schritte. //Möchtest du also das die RGB Stripes 10 mit pause aufleuchten so //musst du den Wert mal zwei nehmen. const int COUNT_BLINK = 5; const int BLINK_PAUSE = 250; void setup() { Serial.begin(115200); //Einrichten des ersten Tasters btn1.attach(button1, INPUT_PULLUP); btn1.interval(PUSH_INTERVAL); //Einrichten des zweiten Tasters btn2.attach(button2, INPUT_PULLUP); btn2.interval(PUSH_INTERVAL); //Beginn der kommunikation mit den RGB Stripes pixelStripe.begin(); } /** * Funktion um ein RGB Stripe zum blinken zu bringen. * Die RGB Stripes sind jeweils hintereinander gekoppelt. * Die erste RGB Stripe beginnt von 0 und endet bei 7, * die zweite RGB Stripe beginnt bei 8 und ende bei 16. **/ void blinkRgbStripe(int from, int to) { //Schleife von 0 bis Wert COUNT_BLINK for (int i = 0; i < COUNT_BLINK; i++) { //Wenn die Teilung der Schleifenvariable i durch 2 keinen Rest //ergibt dann... if (i % 2 == 0) { pixelStripe.fill((255, 255, 255), from, to); } else { pixelStripe.clear(); } pixelStripe.show(); //eine kleine Pause delay(BLINK_PAUSE); } //zum schluss löschen der Pixel pixelStripe.clear(); pixelStripe.show(); } void loop() { //aktualisieren der Bounce2 Objekte btn1.update(); btn2.update(); //Wenn die Taste betätigt wird, dann... if (btn1.fell()) { blinkRgbStripe(0, 7); } if (btn2.fell()) { blinkRgbStripe(8, 16); } }
Wenn du den Code auf deinen Mikrocontroller hochlädst, dann kannst du mit den beiden Tastern jeweils die eine oder die andere RGB Stripe zum Blinken bringen.
Den Code kannst du dir wieder hier bequem als ZIP-Datei herunterladen.
Hallo Stefan,
super Danke für die Umsetzung und Hilfestellung.
Grüße Markus
Hallo Stefan,
ich bin ein absoluter Nullinger in Sachen Elektronik. Mir ist bei deinen Schaltkreisen aufgefallen, dass ein schwarzes Kabel (rechts von GPIO13) auf die Plusleitung gelegt worden ist.
Für mich als Nullinger ist dies sehr irritierend. Warum hast du kein rotes Kabel verwendet ?
Oder handelt es sich hierbei um einen Fehler in der Abbildung ?
LG
FW
Hi,
sorry für die Verwirrung, ja, das schwarze Kabel gehört eine Reihe nach oben. Ich habe die Grafiken nun angepasst.
Gruß, Stefan