ESP32 Урок 54/55 - Установка цвета светодиодной ленты WS2812 через Wi-Fi | Обучающий набор ESP32 IoT от SunFounder
В этом руководстве мы научимся управлять цветом светодиодной ленты WS2812 RGB с помощью микроконтроллера ESP32 через Wi-Fi. Используя палитру цветов, вы сможете выбирать различные цвета с мобильного устройства или компьютера и отправлять эту информацию на светодиодную ленту. Этот проект демонстрирует возможности ESP32, позволяя легко взаимодействовать со светодиодным освещением через веб-интерфейс.
Микроконтроллер ESP32 оснащен как Wi-Fi, так и Bluetooth, что делает его универсальным выбором для приложений Интернета вещей. В этом проекте мы сосредоточимся на функциональности Wi-Fi для управления светодиодной лентой. Пользователи смогут динамически выбирать цвета, создавая визуально привлекательный опыт. Для получения дополнительной информации об этом проекте обязательно посмотрите видео (на видео в 00:00).
Объяснение аппаратного обеспечения
Основными компонентами этого проекта являются микроконтроллер ESP32 и светодиодная лента WS2812. ESP32 — это мощный микроконтроллер со встроенными возможностями Wi-Fi, обеспечивающий беспроводную связь и управление.
Светодиодная лента WS2812 состоит из отдельных адресуемых RGB-светодиодов, что позволяет устанавливать цвет каждого светодиода независимо. Каждый светодиод содержит схему управления и RGB-светодиод в одном корпусе, что упрощает подключение и управление несколькими светодиодами.
Детали из технического описания
| Производитель | Worldsemi |
|---|---|
| Номер детали | WS2812B |
| Логическое/IO напряжение | 3,5–5,3 В |
| Напряжение питания | 5 В |
| Выходной ток (на канал) | 20 мА |
| Пиковый ток (на канал) | 60 мА |
| Рекомендуемая частота ШИМ | 400 Гц |
| Входные логические пороги | 0,3 × VDD (низкий), 0,7 × VDD (высокий) |
| Падение напряжения / RDS(on) / насыщение | 0,5 В |
| Тепловые пределы | –40 до +80 °C |
| Корпус | 5050 SMD |
| Примечания / варианты | Доступен в различных длинах и конфигурациях. |
- Обеспечьте правильное питание, чтобы не повредить светодиоды.
- Используйте общий провод заземления между ESP32 и светодиодной лентой.
- Держите линии данных короткими, чтобы предотвратить ухудшение сигнала.
- Рассмотрите возможность добавления конденсатора (1000 мкФ) на источник питания для стабильности.
- Используйте резистор (470 Ом) на линии данных для целостности сигнала.
Инструкции по подключению

Чтобы подключить ESP32 к светодиодной ленте WS2812, соедините компоненты следующим образом: сначала подключите контакт 5 В светодиодной ленты к выходу 5 В ESP32. Затем подключите контакт заземления (GND) светодиодной ленты к контакту GND на ESP32. Наконец, подключите контакт данных светодиодной ленты (обычно обозначается как DI или Data In) к контакту GPIO 13 на ESP32. Убедитесь, что все соединения надежны, чтобы обеспечить правильную работу.
В видео кратко упоминаются альтернативные методы подключения, но описанная здесь настройка является рекомендуемой конфигурацией для оптимальной производительности (на видео в 03:00).
Примеры кода и пояснения
Код начинается с включения необходимых библиотек для управления светодиодной лентой WS2812 и настройки веб-сервера. Контакт светодиода определяется как LED_PIN, а количество светодиодов в ленте задается с помощью NUM_LEDS.
#define LED_PIN 13 // NeoPixel светодиодная лента
#define NUM_LEDS 8 // Количество светодиодов
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
Этот фрагмент инициализирует библиотеку NeoPixel и настраивает светодиодную ленту на указанном контакте. Объект Adafruit_NeoPixel, strip, — это то, что вы будете использовать для управления цветами светодиодов.
Далее код инициализирует Wi-Fi и настраивает веб-сервер для обработки входящих запросов. Определяются SSID и пароль для сети, что позволяет ESP32 подключиться к Wi-Fi.
const char *ssid = "your_SSID";
const char *password = "your_PASSWORD";
WebServer server(80);
В этом фрагменте замените your_SSID и your_PASSWORD на ваши реальные учетные данные Wi-Fi. Это подключение позволяет ESP32 взаимодействовать с устройствами в той же сети, обеспечивая удаленное управление светодиодной лентой.
Основная функция для изменения цвета светодиода — setColor(), которая перебирает каждый светодиод и устанавливает его цвет на основе выбранных значений RGB.
void setColor() {
for (int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, valueR, valueG, valueB); // Установить цвет i-го светодиода
strip.show(); // Обновить светодиодную ленту с новыми цветами
delay(10); // Подождать 10 миллисекунд
}
}
Эта функция гарантирует, что каждый светодиод в ленте обновляется выбранным цветом. Задержка позволяет светодиодам плавно менять цвет. Когда вы взаимодействуете с веб-интерфейсом, эта функция будет вызываться для отражения ваших цветовых выборов.
Демонстрация / Что ожидать
Когда настройка завершена, вы должны иметь возможность получить доступ к веб-интерфейсу через IP-адрес ESP32. Вы увидите выбор цвета, который позволяет выбрать любой цвет, который затем будет отправлен на светодиодную ленту. Если ESP32 потеряет соединение с Wi-Fi, лента мигнет предупреждающим цветом, указывая на проблему (на видео в 14:30).
Распространенные ошибки включают неправильное подключение, которое может привести к тому, что светодиоды не загорятся, или использование неверных комбинаций SSID/пароля, которые мешают ESP32 подключиться к сети. Всегда перепроверяйте свои соединения и учетные данные.
Временные метки видео
- 00:00 Начало
- 2:01 Введение в проект
- 3:09 Документация
- 3:47 Объяснение RGB-цвета
- 7:47 Подключение
- 8:40 Объяснение кода Arduino для WS2812 с WIFI
- 19:35 Выбор платы ESP32 и COM-порта в Arduino IDE
- 21:17 Демонстрация управления светодиодной лентой через Wi-Fi
/*
* Управление RGB LED по Wi-Fi с использованием ESP32
*
* Полные видеоинструкции https://youtu.be/J_UFHk_T9aE
* 📚⬇️ Скачайте и получите страницу ресурсов https://robojax.com/RJT687
* Автор: Ахмад Шамшир на 18 декабря 2023 года
*
* Смотрите видеоинструкцию к этому видео:
*
* Я объединил библиотеку DHT от Adafruit с WebServer ESP8266, оба ссылки
* Библиотека DHT от Adafruit на GitHub: https://github.com/adafruit/DHT-sensor-library
* и
* ESP8266 на GitHub: https://github.com/esp8266/Arduino
*
* Авторские права (c) 2015, Majenko Technologies
* Все права защищены.
*
* Перераспределение и использование в исходной и двоичной формах, с модификацией или без, разрешены при соблюдении следующих условий:
*
* Перераспределение исходного кода должно сохранять вышеуказанное уведомление о авторских правах, этот
* список условий и следующий отказ от ответственности.
*
* Перераспределение в двоичной форме должно воспроизводить вышеуказанное уведомление о авторских правах, этот
* список условий и следующий отказ от ответственности в документации и/или
* других материалах, предоставленных с распространением.
*
* Ни название Majenko Technologies, ни имена ее
* участников не могут использоваться для одобрения или продвижения продуктов, производных от
* этого программного обеспечения, без специального предварительного письменного разрешения.
*
* ЭТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ ДЕРЖАТЕЛЯМИ АВТОРСКИХ ПРАВ И УЧАСТНИКАМИ "КАК ЕСТЬ" И
* ЛЮБЫЕ ЯВНЫЕ ИЛИ ПОДРАЗУМЕВАЕМЫЕ ГАРАНТИИ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ПОДРАЗУМЕВАЕМЫЕ
* ГАРАНТИИ ТОРГОВОЙ ПРИГОДНОСТИ И ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ ОТКЛОНЯЮТСЯ. В НИКАКОМ СЛУЧАЕ НИ ДЕРЖАТЕЛЬ АВТОРСКИХ ПРАВ, НИ УЧАСТНИКИ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ЗА
* ЛЮБЫЕ ПРЯМЫЕ, НЕПРЯМЫЕ, СЛУЧАЙНЫЕ, ОСОБЫЕ, ПРИМЕРНЫЕ ИЛИ ПОСЛЕДУЮЩИЕ УБЫТКИ
* (ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ЗАКУПКОЙ ЗАМЕЩЕНИЯ ТОВАРОВ И УСЛУГ;
* ПОТЕРЯ ИСПОЛЬЗОВАНИЯ, ДАННЫХ ИЛИ ПРИБЫЛИ; ИЛИ ПРЕРВАНИЯ БИЗНЕСА) УЧАСТКИ ВСЕХ УРОВНЕЙ, И ПО
* ЛЮБОЙ ТЕОРИИ ОТВЕТСТВЕННОСТИ, БУДЬ У НАС ГРАЖДАНСКАЯ, СТРОГАЯ ОТВЕТСТВЕННОСТЬ ИЛИ ДЕЛИКТ
* (ВКЛЮЧАЯ НЕОБЯЗАТЕЛЬНОСТЬ ИЛИ ИНЫЕ) ВОЗНИКАЮЩИЕ В ЛЮБОЙ ФОРМЕ В РЕЗУЛЬТАТЕ ИСПОЛЬЗОВАНИЯ ЭТОГО
* ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ, ДАЖЕ ЕСЛИ БЫЛИ УВЕДОМЛЕНЫ О ВОЗМОЖНОСТИ ТАКИХ УБЫТКОВ.
*/
#include <Adafruit_NeoPixel.h> // Включите библиотеку Adafruit NeoPixel.
#define LED_PIN 13 // Неоновая светодиодная лента
#define NUM_LEDS 8 // Количество светодиодов
// Создайте экземпляр класса Adafruit_NeoPixel
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
// начальный цвет светодиодной ленты
int valueR = 178; // от 0 до 255 для Красного
int valueG = 27; // от 0 до 255 для Зелёного
int valueB = 84; // от 0 до 255 для синего
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 0 и преобразуйте его в строку
theColor = newColor.substring(1); // уберите символ # в начале цвета, например #B2a48d
theColorR = newColor.substring(1, 3); // извлечь B2 из #B2a48d, например
theColorG = newColor.substring(3, 5); // извлечь a4 из #B2a48d, например
theColorB = newColor.substring(5, 7); // извлечь 8d из #B2a48d, например
valueR = StrToHex(theColorR.c_str()); // преобразовать строку в HEX для R
valueG = StrToHex(theColorG.c_str()); // преобразовать строку в шестнадцатеричный формат для G
valueB = StrToHex(theColorB.c_str()); // преобразовать строку в HEX для B
if(showSerialData)
{
Serial.print("valueR: ");
Serial.println(valueR);
Serial.print("valueG: ");
Serial.println(valueG);
Serial.print("valueB: ");
Serial.println(valueB );
}
}
showColorPicker(); // убедитесь, что палитра цветов отображается
// server.send(200, "text/plain", message);
}
void setColor()
{
for (int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, valueR, valueG, valueB); // Установите цвет i-го светодиода на красный.
strip.show(); // Обновите светодиодную ленту новыми цветами.
delay(10); // Подождите 100 миллисекунд.
}
}
void noConnection()
{
for (int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, 255, 45, 0); // Установите цвет i-го светодиода на красный.
strip.show(); // Обновите светодиодную ленту новыми цветами.
delay(50); // Подождите 100 миллисекунд.
}
delay(200);
for (int i = NUM_LEDS-1; i >=0; i--) {
strip.setPixelColor(i, 0, 255, 180); // Установите цвет i-го светодиода на красный.
strip.show(); // Обновите светодиодную ленту новыми цветами.
delay(50); // Подождите 100 миллисекунд.
}
}
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);
// Мы начинаем с подключения к WiFi сети.
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("");
// Ожидание соединения
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(); // Инициализируйте ленту NeoPixel
strip.show(); // Установите начальный цвет на черный.
setup_wifi();
server.on("/", showColorPicker); // показать главную страницу с выбором цвета
// server.on("/color", setColor);//изменяет цвет на WS2812 RGB светодиоде
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); // измените это на большее значение (1000 или больше), если вам не нужно часто читать
// Код Robojax.com для ESP32 и DHT11 DHT22
}
Common Course Links
Common Course Files
Ресурсы и ссылки
Ресурсов пока нет.
Файлы📁
Нет доступных файлов.