ESP32 Tutorial 54/55 - WS2812 LED-Streifenfarbe über Wifi einstellen | SunFounders ESP32 IoT-Lernkit
In diesem Tutorial werden wir lernen, wie man die Farbe eines WS2812 RGB LED-Streifens mit einem ESP32-Mikrocontroller über Wi-Fi steuert. Mit einem Farbauswahlwerkzeug können Sie verschiedene Farben von Ihrem Mobilgerät oder Desktop auswählen und diese Informationen an den LED-Streifen senden. Dieses Projekt zeigt die Fähigkeiten des ESP32 und ermöglicht eine nahtlose Interaktion mit der LED-Beleuchtung über eine Weboberfläche.
Der ESP32-Mikrocontroller ist sowohl mit Wi-Fi als auch mit Bluetooth ausgestattet und somit eine vielseitige Wahl für IoT-Anwendungen. In diesem Projekt konzentrieren wir uns auf die Wi-Fi-Funktionalität zur Steuerung des LED-Streifens. Die Benutzer können die Farben dynamisch auswählen, was ein visuell ansprechendes Erlebnis schafft. Für zusätzliche Klarheit zu diesem Projekt sollten Sie sich das Video unter (im Video bei 00:00) ansehen.
Hardware Erklärt
Die Hauptkomponenten für dieses Projekt umfassen den ESP32-Mikrocontroller und den WS2812-LED-Streifen. Der ESP32 ist ein leistungsstarker Mikrocontroller mit eingebauten Wi-Fi-Funktionen, die drahtlose Kommunikation und Steuerung ermöglichen.
Der WS2812 LED-Streifen besteht aus einzeln ansteuerbaren RGB-LEDs, die es ermöglichen, die Farbe jeder LED unabhängig einzustellen. Jede LED enthält einen Steuerkreis und eine RGB-LED in einem einzigen Gehäuse, was die Verdrahtung und Steuerung mehrerer LEDs vereinfacht.
Datenblattdetails
| Hersteller | Worldsemi |
|---|---|
| Teilenummer | WS2812B |
| Logik/IO-Spannung | 3,5-5,3 V |
| Betriebstromspannung | 5 V |
| Ausgangsstrom (pro Kanal) | 20 mA |
| Spitzenstrom (pro Kanal) | 60 mA |
| PWM-Frequenzrichtlinie | 400 Hz |
| Eingangslogik-Schwellenwerte | 0,3 × VDD (niedrig), 0,7 × VDD (hoch) |
| Spannungsabfall / RDS(on)/ Sättigung | 0,5 V |
| Thermische Grenzen | -40 bis +80 °C |
| Paket | 5050 SMD |
| Hinweise / Varianten | Verfügbar in verschiedenen Längen und Konfigurationen. |
- Stellen Sie eine ordnungsgemäße Stromversorgung sicher, um Beschädigungen der LEDs zu vermeiden.
- Verwenden Sie eine gemeinsame Erde zwischen dem ESP32 und dem LED-Streifen.
- Halten Sie die Datenleitungen kurz, um Signalverschlechterung zu vermeiden.
- Erwägen Sie, einen Kondensator (1000 µF) parallel zur Stromversorgung hinzuzufügen, um die Stabilität zu erhöhen.
- Verwenden Sie einen Widerstand (470 Ω) auf der Datenleitung für die Signalintegrität.
Verdrahtungsanleitungen

Um den ESP32 mit dem WS2812 LED-Streifen zu verbinden, schließen Sie die Komponenten wie folgt an: Zuerst verbinden Sie den 5V-Pin des LED-Streifens mit dem 5V-Ausgang des ESP32. Dann verbinden Sie den Erdungs (GND)-Pin des LED-Streifens mit einem GND-Pin am ESP32. Schließlich verbinden Sie den Daten-Pin des LED-Streifens (in der Regel als DI oder Data In bezeichnet) mit dem GPIO-Pin 13 am ESP32. Stellen Sie sicher, dass alle Verbindungen sicher sind, um eine ordnungsgemäße Funktionalität zu gewährleisten.
Im Video werden alternative Verkabelungsmethoden kurz erwähnt, aber die hier beschriebene Konfiguration ist die empfohlene Einstellung für optimale Leistung (im Video bei 03:00).
Codebeispiele und Anleitung
Der Code beginnt damit, die notwendigen Bibliotheken für die Steuerung des WS2812 LED-Streifens und die Einrichtung des Webservers einzubinden. Der LED-Pin wird definiert alsLED_PINund die Anzahl der LEDs im Streifen wird festgelegt mitNUM_LEDS.
#define LED_PIN 13 // NeoPixel LED strip
#define NUM_LEDS 8 // Number of LEDs
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
Dieser Snippet initialisiert die NeoPixel-Bibliothek und richtet den LED-Streifen am angegebenen Pin ein.Adafruit_NeoPixelObjekt,strip, ist das, was Sie verwenden werden, um die LED-Farben zu steuern.
Als Nächstes initialisiert der Code das Wi-Fi und richtet einen Webserver ein, um eingehende Anfragen zu bearbeiten. Die SSID und das Passwort für das Netzwerk werden festgelegt, sodass sich der ESP32 mit dem Wi-Fi verbinden kann.
const char *ssid = "your_SSID";
const char *password = "your_PASSWORD";
WebServer server(80);
In diesem Auszug ersetzenyour_SSIDundyour_PASSWORDmit Ihren aktuellen Wi-Fi-Anmeldeinformationen. Diese Verbindung ermöglicht es dem ESP32, mit Geräten im selben Netzwerk zu kommunizieren, was eine Fernsteuerung des LED-Streifens ermöglicht.
Die Hauptfunktion zum Ändern der LED-Farbe istsetColor(), welches jede LED durchläuft und ihre Farbe basierend auf den ausgewählten RGB-Werten einstellt.
void setColor() {
for (int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, valueR, valueG, valueB); // Set the color of the i-th LED
strip.show(); // Update the LED strip with the new colors
delay(10); // Wait for 10 milliseconds
}
}
Diese Funktion stellt sicher, dass jede LED im Streifen mit der ausgewählten Farbe aktualisiert wird. Die Verzögerung ermöglicht es den LEDs, die Farbe sanft zu wechseln. Während Sie mit der Weboberfläche interagieren, wird diese Funktion aufgerufen, um Ihre Farbwahl widerzuspiegeln.
Demonstration / Was zu erwarten ist
Wenn die Einrichtung abgeschlossen ist, sollten Sie über die IP-Adresse des ESP32 auf die Weboberfläche zugreifen können. Sie sehen einen Farbwähler, mit dem Sie eine beliebige Farbe auswählen können, die dann an den LED-Streifen gesendet wird. Wenn der ESP32 die Wi-Fi-Verbindung verliert, blinkt der Streifen in einer Warnfarbe, die auf das Problem hinweist (im Video bei 14:30).
Häufige Fehler sind falsche Verkabelungen, die dazu führen können, dass die LEDs nicht leuchten, oder die Verwendung falscher SSID/Passwort-Kombinationen, die verhindern, dass der ESP32 sich mit dem Netzwerk verbindet. Überprüfen Sie immer Ihre Verbindungen und Zugangsdaten.
Videotimestamps
- 00:00 Start
- 2:01 Einführung in das Projekt
- 3:09 Unterlagen
- 3:47 RGB-Farbe erklärt
- 7:47 Verdrahtung
- 8:40 Arduino-Code für WS2812 mit WIFI erklärt
- 19:35 Auswahl des ESP32-Boards und des COM-Ports in der Arduino IDE
- 21:17 LED-Streifen über WLAN steuern Demo
/*
* Steuern Sie eine RGB-LED über WiFi mit ESP32
*
* Vollständige video Anweisungen https://youtu.be/J_UFHk_T9aE
* 📚⬇️ Download und Ressourcen Seite https://robojax.com/RJT687
* Geschrieben von Ahmad Shamshiri am 18. Dezember 2023
*
* Sehen Sie die Videoanleitung für dieses Video:
*
* Ich habe die DHT-Bibliothek von Adafruit mit dem ESP8266 WebServer kombiniert, beide Links
* Adafruit DHT-Bibliothek auf GitHub: https://github.com/adafruit/DHT-sensor-library
* und
* ESP8266 auf GitHub: https://github.com/esp8266/Arduino
*
* Urheberrecht (c) 2015, Majenko Technologies
* Alle Rechte vorbehalten.
*
* Die Weiterverbreitung und Nutzung in Quell- und Binärformen, mit oder ohne Modifikationen,
* sind gestattet, sofern die folgenden Bedingungen erfüllt sind:
*
* Die Weiterverbreitung des Quellcodes muss den obigen Urheberrechtshinweis, diese
* Liste von Bedingungen und den folgenden Haftungsausschluss enthalten.
*
* Die Weiterverbreitung in binärer Form muss den obigen Urheberrechtshinweis, diese
* Liste von Bedingungen und den folgenden Haftungsausschluss in der Dokumentation und/oder
* anderen Materialien, die mit der Verbreitung bereitgestellt werden, wiedergeben.
*
* Weder der Name von Majenko Technologies noch die Namen seiner
* Mitwirkenden dürfen verwendet werden, um Produkte, die aus
* dieser Software abgeleitet sind, ohne vorherige ausdrückliche schriftliche Genehmigung zu befürworten oder zu fördern.
*
* DIESE SOFTWARE WIRD VOM URHEBERRECHTSINHABER UND DEN BEITRAGENDEN "WIE BESEHEN" UND
* ALLE AUSDRÜCKLICHEN ODER IMPLIZITEN GARANTIEN, EINSCHLIESSLICH, ABER NICHT BESCHRÄNKT AUF, DIE IMPLIZITEN
* GARANTIEN DER MARKTGÄNGIGKEIT UND EIGNUNG FÜR EINEN BESTIMMTEN ZWECK WERDEN ABGELEHNT. IN KEINEM FALL HAFTET DER URHEBERRECHTSINHABER ODER DIE BEITRAGENDEN FÜR
* IRGENDEINE DIREKTE, INDIREKTE, NEBENSÄCHLICHE, BESONDERE, EXEMPLARISCHE ODER FOLGESCHÄDEN
* (EINSCHLIESSLICH, ABER NICHT BESCHRÄNKT AUF, ERWERB VONERSATZGÜTERN ODER DIENSTLEISTUNGEN;
* NUTZUNGSVERLUST, DATEN ODER GEWINNE; ODER UNTERBRECHUNG DES GESCHÄFTSBETRIEBS) IN IRGENDEINER WEISE UND AUF
* JEDER HAFTUNGSTHEORIE, OB IM VERTRAG, STRIKTER HAFTUNG ODER DELIKT
* (EINSCHLIESSLICH FAHRLÄSSIGKEIT ODER ANDERES), DIE IN IRGENDEINER WEISE AUS DER NUTZUNG DIESER
* SOFTWARE ENTSTEHT, AUCH WENN AUF DIE MÖGLICHKEIT SOLCHER SCHÄDEN HINGEWIESEN WURDE.
*/
#include <Adafruit_NeoPixel.h> // Fügen Sie die Adafruit NeoPixel-Bibliothek hinzu
#define LED_PIN 13 // NeoPixel LED-Streifen
#define NUM_LEDS 8 // Anzahl der LEDs
// Erstellen Sie eine Instanz der Adafruit_NeoPixel-Klasse.
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
// anfängliche Farbe des LED-Streifens
int valueR = 178; // von 0 bis 255 für Rot
int valueG = 27; // von 0 bis 255 für Grün
int valueB = 84; // von 0 bis 255 für Blau
bool showSerialData = false;
String theColorR, theColorG, theColorB;
String theColor ="ff0000";
#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <ESPmDNS.h>
const char *ssid = "dars";
const char *password = "hhhhhhhhhhh";
WebServer server(80);
void showColorPicker() {
String page = "<!DOCTYPE html>\n";
page +="<html>\n";
page +="<body>\n";
page +="<div style=\"zoom: 300%;\">\n";
page +="<h2>Robojax RGB Color picker</h2>\n";
page +="<p id=\"result\"></p>\n";
page +="<form action=\"/color\">\n";
page +=" <label for=\"favcolor\">Select your favorite color:</label>\n";
page +=" <input type=\"color\" id=\"favcolor\" name=\"favcolor\" value=\"#";
page += theColor;
page +="\"><br><br>\n";
page +=" <input type=\"submit\" value=\"Set Color\" />\n";
page +="</form> \n</div>\n";
page +="</body>\n";
page +="</html>\n";
server.send(200, "text/html", page);
}
// from https://stackoverflow.com/questions/44683071/convert-string-as-hex-to-hexadecimal
uint64_t StrToHex(const char* str)
{
return (uint64_t) strtoull(str, 0, 16);
}
void getColor(){
// server.send(200, "text/plain", nachricht);
if(server.argName(0) == "favcolor")
{
String newColor = String(server.arg(0)); // Hole das GET-Argument 0 und konvertiere es in einen String.
theColor = newColor.substring(1); // Entfernen Sie das #-Symbol am Anfang der Farbe wie #B2a48d.
theColorR = newColor.substring(1, 3); // B2 aus #B2a48d extrahieren, zum Beispiel.
theColorG = newColor.substring(3, 5); // extrahiere a4 aus #B2a48d zum Beispiel
theColorB = newColor.substring(5, 7); // Extrahiere 8d aus #B2a48d, zum Beispiel.
valueR = StrToHex(theColorR.c_str()); // String in HEX für R konvertieren
valueG = StrToHex(theColorG.c_str()); // String in HEX für G konvertieren
valueB = StrToHex(theColorB.c_str()); // String in HEX für B umwandeln
if(showSerialData)
{
Serial.print("valueR: ");
Serial.println(valueR);
Serial.print("valueG: ");
Serial.println(valueG);
Serial.print("valueB: ");
Serial.println(valueB );
}
}
showColorPicker(); // sorge dafür, dass der Farbwähler angezeigt wird
// server.send(200, "text/plain", nachricht);
}
void setColor()
{
for (int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, valueR, valueG, valueB); // Setze die Farbe der i-ten LED auf rot.
strip.show(); // Aktualisieren Sie den LED-Streifen mit den neuen Farben.
delay(10); // Warte 100 Millisekunden
}
}
void noConnection()
{
for (int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, 255, 45, 0); // Setze die Farbe der i-ten LED auf rot.
strip.show(); // Aktualisieren Sie den LED-Streifen mit den neuen Farben.
delay(50); // Warte 100 Millisekunden
}
delay(200);
for (int i = NUM_LEDS-1; i >=0; i--) {
strip.setPixelColor(i, 0, 255, 180); // Setze die Farbe der i-ten LED auf rot.
strip.show(); // Aktualisieren Sie den LED-Streifen mit den neuen Farben.
delay(50); // Warte 100 Millisekunden
}
}
void handleNotFound() {
String message = "File Not Found\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += (server.method() == HTTP_GET) ? "GET" : "POST";
message += "\nArguments: ";
message += server.args();
message += "\n";
for (uint8_t i = 0; i < server.args(); i++) {
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}
server.send(404, "text/plain", message);
}
void setup_wifi() {
delay(10);
// Wir beginnen damit, eine WiFi-Netzwerkverbindung herzustellen.
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("");
// Warte auf Verbindung
while (WiFi.status() != WL_CONNECTED) {
noConnection();
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("Open: http: // ");
Serial.print(WiFi.localIP());
Serial.println(" to read temperature");
if (MDNS.begin("robojaxRGB")) {
Serial.println("MDNS responder started");
}
}
void setup(void) {
Serial.begin(115200);
strip.begin(); // Initialisiere den NeoPixel-Streifen
strip.show(); // Setze die Anfangsfarbe auf Schwarz
setup_wifi();
server.on("/", showColorPicker); // Zeige die Hauptseite mit Farbwahl.
// server.on("/color", setColor);//ändert die Farbe der WS2812 RGB-LED
server.on("/color", HTTP_GET, getColor);
server.on("/inline", []() {
server.send(200, "text/plain", "this works as well");
});
server.onNotFound(handleNotFound);
server.begin();
Serial.println("HTTP server started");
}
void loop(void) {
// Robojax.com
while (WiFi.status() != WL_CONNECTED) {
setup_wifi();
}
server.handleClient();
// showColorPicker();
setColor();
delay(300); // Ändern Sie dies in einen größeren Wert (1000 oder mehr), wenn Sie nicht sehr oft lesen müssen.
// Robojax.com Code für ESP32 und DHT11 DHT22
}
Common Course Links
Common Course Files
Ressourcen & Referenzen
Noch keine Ressourcen vorhanden.
Dateien📁
Keine Dateien verfügbar.