Tutorial ESP32 54/55 - Setează culoarea benzii LED WS2812 prin Wifi | Kitul de învățare IoT ESP32 de la SunFounder
În acest tutorial, vom învăța cum să controlăm culoarea unei benzi LED RGB WS2812 folosind un microcontroler ESP32 prin Wi-Fi. Utilizând un selector de culori, puteți alege diferite culori de pe dispozitivul mobil sau desktop și puteți trimite acea informație către banda LED. Acest proiect evidențiază capacitățile ESP32, permițând interacțiunea fără probleme cu iluminatul LED printr-o interfață web.
Microcontrolerul ESP32 este echipat atât cu Wi-Fi, cât și cu Bluetooth, fiind o alegere versatilă pentru aplicații IoT. În acest proiect, ne vom concentra pe funcționalitatea Wi-Fi pentru a controla banda LED. Utilizatorii vor putea alege culori dinamic, creând o experiență captivantă din punct de vedere vizual. Pentru clarificări suplimentare despre acest proiect, asigurați-vă că urmăriți videoclipul la (în videoclip la 00:00).
Hardware Explicat
Componentele principale pentru acest proiect includ microcontrolerul ESP32 și banda LED WS2812. ESP32 este un microcontroler puternic cu capacități Wi-Fi integrate, permițând comunicarea și controlul fără fir.
Banda LED WS2812 constă din LED-uri RGB adresabile individual, permițându-vă să setați culoarea fiecărui LED independent. Fiecare LED încorporează un circuit de control și un LED RGB într-un singur pachet, ceea ce simplifică cablarea și controlul mai multor LED-uri.
Detalii din Fișa Tehnică
| Producător | Worldsemi |
|---|---|
| Număr de piesă | WS2812B |
| Tensiune logică/IO | 3,5–5,3 V |
| Tensiune de alimentare | 5 V |
| Curent de ieșire (pe canal) | 20 mA |
| Curent de vârf (pe canal) | 60 mA |
| Ghidare frecvență PWM | 400 Hz |
| Praguri logice de intrare | 0,3 × VDD (jos), 0,7 × VDD (sus) |
| Cădere de tensiune / RDS(on) / saturație | 0,5 V |
| Limite termice | –40 până la +80 °C |
| Pachet | 5050 SMD |
| Note / variante | Disponibil în diverse lungimi și configurații. |
- Asigurați o sursă de alimentare adecvată pentru a evita deteriorarea LED-urilor.
- Utilizați o masă comună între ESP32 și banda LED.
- Păstrați liniile de date scurte pentru a preveni degradarea semnalului.
- Luați în considerare adăugarea unui condensator (1000 µF) pe sursa de alimentare pentru stabilitate.
- Utilizați un rezistor (470 Ω) pe linia de date pentru integritatea semnalului.
Instrucțiuni de Cablare

Pentru a conecta ESP32 la banda LED WS2812, conectați componentele după cum urmează: În primul rând, conectați pinul de 5V al benzii LED la ieșirea de 5V a ESP32. Apoi, conectați pinul de masă (GND) al benzii LED la un pin GND de pe ESP32. În cele din urmă, conectați pinul de date al benzii LED (de obicei etichetat ca DI sau Data In) la pinul GPIO 13 de pe ESP32. Asigurați-vă că toate conexiunile sunt sigure pentru a asigura funcționarea corectă.
În videoclip, sunt menționate pe scurt metode alternative de cablare, dar configurația descrisă aici este configurația recomandată pentru performanță optimă (în videoclip la 03:00).
Exemple de Cod & Parcurgere
Codul începe prin includerea bibliotecilor necesare pentru controlul benzii LED WS2812 și configurarea serverului web. Pinul LED este definit ca LED_PIN, iar numărul de LED-uri din bandă este setat cu NUM_LEDS.
#define LED_PIN 13 // Bandă LED NeoPixel
#define NUM_LEDS 8 // Număr de LED-uri
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
Acest fragment inițializează biblioteca NeoPixel și configurează banda LED pe pinul specificat. Obiectul Adafruit_NeoPixel, strip, este cel pe care îl veți folosi pentru a controla culorile LED.
În continuare, codul inițializează Wi-Fi și configurează un server web pentru a gestiona cererile primite. SSID-ul și parola pentru rețea sunt definite, permițând ESP32 să se conecteze la Wi-Fi.
const char *ssid = "your_SSID";
const char *password = "your_PASSWORD";
WebServer server(80);
În acest extras, înlocuiți your_SSID și your_PASSWORD cu datele reale de conectare Wi-Fi. Această conexiune permite ESP32 să comunice cu dispozitivele de pe aceeași rețea, permițând controlul de la distanță al benzii LED.
Funcția principală pentru schimbarea culorii LED este setColor(), care iterează prin fiecare LED și îi setează culoarea pe baza valorilor RGB selectate.
void setColor() {
for (int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, valueR, valueG, valueB); // Setează culoarea LED-ului i
strip.show(); // Actualizează banda LED cu noile culori
delay(10); // Așteaptă 10 milisecunde
}
}
Această funcție asigură că fiecare LED din bandă este actualizat cu culoarea selectată. Întârzierea permite LED-urilor să schimbe culoarea lin. Pe măsură ce interacționați cu interfața web, această funcție va fi apelată pentru a reflecta alegerile dvs. de culoare.
Demonstrație / Ce să Vă Așteptați
Când configurarea este finalizată, ar trebui să poți accesa interfața web prin adresa IP a ESP32. Vei vedea un selector de culori care îți permite să alegi orice culoare, care va fi apoi trimisă către banda LED. Dacă ESP32 pierde conexiunea Wi-Fi, banda va clipi cu o culoare de avertizare, indicând problema (în videoclip la 14:30).
Capcanele frecvente includ cablarea incorectă, care poate duce la nepornirea LED-urilor, sau utilizarea unor combinații incorecte SSID/parolă care împiedică ESP32 să se conecteze la rețea. Verifică întotdeauna conexiunile și acreditările.
Marcaje temporale video
- 00:00 Început
- 2:01 Introducere în proiect
- 3:09 Documentație
- 3:47 Culoarea RGB explicată
- 7:47 Cablare
- 8:40 Codul Arduino pentru WS2812 cu WIFI explicat
- 19:35 Selectarea plăcii ESP32 și a portului COM în Arduino IDE
- 21:17 Demonstrație control bandă LED prin wifi
/*
* Control RGB LED over wifi using ESP32
*
full video instrucions https://youtu.be/J_UFHk_T9aE
📚⬇️ Download and resource page https://robojax.com/RJT687
* Written by Ahmad Shamshiri on Dec 18, 2023
*
* Watch video instruciton for this video:
*
* I have combined DHT library of Adafruit with ESP8266 WebServer both links
* Adafruit DHT library on GitHub: https://github.com/adafruit/DHT-sensor-library
* and
* ESP8266 on GitHub : https://github.com/esp8266/Arduino
*
Copyright (c) 2015, Majenko Technologies
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or
other materials provided with the distribution.
* * Neither the name of Majenko Technologies nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <Adafruit_NeoPixel.h> // Include the Adafruit NeoPixel library
#define LED_PIN 13 // NeoPixel LED strip
#define NUM_LEDS 8 // Number of LEDs
// Create an instance of the Adafruit_NeoPixel class
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
//initial color of LED strip
int valueR = 178;//from 0 to 255 for Red
int valueG = 27;//from 0 to 255 for Green
int valueB = 84;//from 0 to 255 for Blue
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", message);
if(server.argName(0) == "favcolor")
{
String newColor = String(server.arg(0));//get the GET ardument 0 and convert it to string
theColor = newColor.substring(1);//remove the # sybmot from the begining of color like #B2a48d
theColorR = newColor.substring(1, 3);//extract B2 from #B2a48d for example
theColorG = newColor.substring(3, 5);//extract a4 from #B2a48d for example
theColorB = newColor.substring(5, 7);//extract 8d from #B2a48d for example
valueR = StrToHex(theColorR.c_str());//convert String to HEX for R
valueG = StrToHex(theColorG.c_str());//convert String to HEX for G
valueB = StrToHex(theColorB.c_str());//convert String to HEX for B
if(showSerialData)
{
Serial.print("valueR: ");
Serial.println(valueR);
Serial.print("valueG: ");
Serial.println(valueG);
Serial.print("valueB: ");
Serial.println(valueB );
}
}
showColorPicker();//make sure the color picker is shown
//server.send(200, "text/plain", message);
}
void setColor()
{
for (int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, valueR, valueG, valueB); // Set the color of the i-th LED to red
strip.show(); // Update the LED strip with the new colors
delay(10); // Wait for 100 milliseconds
}
}//
void noConnection()
{
for (int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, 255, 45, 0); // Set the color of the i-th LED to red
strip.show(); // Update the LED strip with the new colors
delay(50); // Wait for 100 milliseconds
}
delay(200);
for (int i = NUM_LEDS-1; i >=0; i--) {
strip.setPixelColor(i, 0, 255, 180); // Set the color of the i-th LED to red
strip.show(); // Update the LED strip with the new colors
delay(50); // Wait for 100 milliseconds
}
}
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);
// We start by connecting to a WiFi network
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("");
// Wait for connection
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(); // Initialize the NeoPixel strip
strip.show(); // Set initial color to black
setup_wifi();
server.on("/", showColorPicker);//show the main page with color picker
//server.on("/color", setColor);//changes teh color on 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);// change this to larger value (1000 or more) if you don't need very often reading
// Robojax.com code for ESP32 and DHT11 DHT22
}
Common Course Links
Common Course Files
Resurse și referințe
Încă nu sunt resurse.
Fișiere📁
Nu sunt disponibile fișiere.