Samouczek ESP32 54/55 - Ustaw kolor paska LED WS2812 przez Wi-Fi | Zestaw edukacyjny IoT ESP32 od SunFounder
W tym samouczku nauczymy się, jak sterować kolorem paska LED WS2812 RGB za pomocą mikrokontrolera ESP32 przez Wi-Fi. Korzystając z próbnika kolorów, możesz wybierać różne kolory ze swojego urządzenia mobilnego lub komputera i wysyłać te informacje do paska LED. Ten projekt pokazuje możliwości ESP32, umożliwiając płynną interakcję z oświetleniem LED poprzez interfejs internetowy.
Mikrokontroler ESP32 jest wyposażony zarówno w Wi-Fi, jak i Bluetooth, co czyni go wszechstronnym wyborem do zastosowań IoT. W tym projekcie skupimy się na funkcjonalności Wi-Fi do sterowania paskiem LED. Użytkownicy będą mogli dynamicznie wybierać kolory, tworząc wizualnie angażujące doświadczenie. Aby uzyskać dodatkowe wyjaśnienia dotyczące tego projektu, koniecznie obejrzyj wideo (na wideo o 00:00).
Objaśnienie Sprzętu
Główne komponenty tego projektu to mikrokontroler ESP32 oraz pasek LED WS2812. ESP32 to wydajny mikrokontroler z wbudowaną obsługą Wi-Fi, umożliwiający bezprzewodową komunikację i sterowanie.
Pasek LED WS2812 składa się z indywidualnie adresowalnych diod LED RGB, co pozwala na ustawienie koloru każdej diody niezależnie. Każda dioda zawiera układ sterujący oraz diodę RGB w jednej obudowie, co upraszcza okablowanie i sterowanie wieloma diodami LED.
Szczegóły z Karty Katalogowej
| Producent | Worldsemi |
|---|---|
| Numer części | WS2812B |
| Napięcie logiki/IO | 3,5–5,3 V |
| Napięcie zasilania | 5 V |
| Prąd wyjściowy (na kanał) | 20 mA |
| Prąd szczytowy (na kanał) | 60 mA |
| Zalecana częstotliwość PWM | 400 Hz |
| Progi logiczne wejścia | 0,3 × VDD (niski), 0,7 × VDD (wysoki) |
| Spadek napięcia / RDS(on) / nasycenie | 0,5 V |
| Limity termiczne | –40 do +80 °C |
| Obudowa | 5050 SMD |
| Uwagi / warianty | Dostępny w różnych długościach i konfiguracjach. |
- Zapewnij odpowiednie zasilanie, aby uniknąć uszkodzenia diod LED.
- Użyj wspólnej masy między ESP32 a paskiem LED.
- Trzymaj linie danych krótko, aby zapobiec degradacji sygnału.
- Rozważ dodanie kondensatora (1000 µF) na zasilaniu dla stabilności.
- Użyj rezystora (470 Ω) na linii danych dla integralności sygnału.
Instrukcje Okablowania

Aby podłączyć ESP32 do paska LED WS2812, połącz komponenty w następujący sposób: Najpierw podłącz pin 5V paska LED do wyjścia 5V ESP32. Następnie podłącz pin masy (GND) paska LED do pinu GND na ESP32. Na koniec podłącz pin danych paska LED (zwykle oznaczony jako DI lub Data In) do pinu GPIO 13 na ESP32. Upewnij się, że wszystkie połączenia są pewne, aby zapewnić prawidłowe działanie.
Na wideo krótko wspomniano o alternatywnych metodach okablowania, ale opisana tutaj konfiguracja jest zalecanym rozwiązaniem dla optymalnej wydajności (na wideo o 03:00).
Przykłady Kodu i Omówienie
Kod zaczyna się od dołączenia niezbędnych bibliotek do sterowania paskiem LED WS2812 i skonfigurowania serwera internetowego. Pin LED jest zdefiniowany jako LED_PIN, a liczba diod w pasku jest ustawiona za pomocą NUM_LEDS.
#define LED_PIN 13 // Pasek LED NeoPixel
#define NUM_LEDS 8 // Liczba diod LED
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
Ten fragment inicjalizuje bibliotekę NeoPixel i konfiguruje pasek LED na określonym pinie. Obiekt Adafruit_NeoPixel, strip, będzie używany do sterowania kolorami diod LED.
Następnie kod inicjalizuje Wi-Fi i konfiguruje serwer internetowy do obsługi przychodzących żądań. Zdefiniowane są SSID i hasło sieci, umożliwiające ESP32 połączenie z Wi-Fi.
const char *ssid = "twoje_SSID";
const char *password = "twoje_HASLO";
WebServer server(80);
W tym fragmencie zastąp twoje_SSID i twoje_HASLO swoimi rzeczywistymi danymi logowania do Wi-Fi. To połączenie umożliwia ESP32 komunikację z urządzeniami w tej samej sieci, pozwalając na zdalne sterowanie paskiem LED.
Główną funkcją do zmiany koloru diod LED jest setColor(), która iteruje przez każdą diodę i ustawia jej kolor na podstawie wybranych wartości RGB.
void setColor() {
for (int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, valueR, valueG, valueB); // Ustaw kolor i-tej diody LED
strip.show(); // Zaktualizuj pasek LED o nowe kolory
delay(10); // Odczekaj 10 milisekund
}
}
Ta funkcja zapewnia, że każda dioda w pasku jest aktualizowana wybranym kolorem. Opóźnienie pozwala diodom LED płynnie zmieniać kolor. Podczas interakcji z interfejsem internetowym funkcja ta będzie wywoływana, aby odzwierciedlić Twoje wybory kolorów.
Demonstracja / Czego Się Spodziewać
Po zakończeniu konfiguracji powinieneś mieć możliwość uzyskania dostępu do interfejsu webowego za pomocą adresu IP ESP32. Zobaczysz selektor kolorów, który pozwala wybrać dowolny kolor, a następnie zostanie on wysłany do paska LED. Jeśli ESP32 straci połączenie Wi-Fi, pasek zamiga kolorem ostrzegawczym, sygnalizując problem (na filmie w 14:30).
Do typowych pułapek należą nieprawidłowe podłączenia, które mogą spowodować, że diody LED się nie zaświecą, lub użycie nieprawidłowych kombinacji SSID/hasła, które uniemożliwiają ESP32 połączenie z siecią. Zawsze dokładnie sprawdzaj swoje połączenia i dane uwierzytelniające.
Znaczniki czasowe filmu
- 00:00 Start
- 2:01 Wprowadzenie do projektu
- 3:09 Dokumentacja
- 3:47 Wyjaśnienie koloru RGB
- 7:47 Podłączenie
- 8:40 Wyjaśnienie kodu Arduino dla WS2812 z WIFI
- 19:35 Wybór płyty ESP32 i portu COM w Arduino IDE
- 21:17 Demo sterowania paskiem LED przez 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
Zasoby i odniesienia
Brak zasobów.
Pliki📁
Brak dostępnych plików.