ESP32 и адресные RGB-светодиоды WS2812B (Neopixels) в Arduino IDE
Перевод статьи ESP32: WS2812B Addressable RGB LEDs (Neopixels) – Arduino IDE — Rui Santos & Sara Santos, Random Nerd Tutorials.
В этом руководстве показано, как управлять адресными RGB-светодиодами WS2812B (они же Neopixels) с ESP32 через Arduino IDE. Вы научитесь подключать WS2812B к ESP32 и управлять ими с помощью библиотеки FastLED.
В примерах мы управляем лентой из адресных RGB-светодиодов WS2812B, но всё работает с любой лентой, кольцом или платой на светодиодах WS2812B.
Что понадобится заранее#
Прежде чем продолжать, убедитесь, что установлена Arduino IDE с поддержкой плат ESP32. Если ещё нет:
Знакомимся с RGB-светодиодами WS2812B (Neopixels)#
WS2812B — это адресные RGB-светодиоды, которые можно соединять последовательно и управлять каждым по отдельности всего одним цифровым пином микроконтроллера. В каждый светодиод встроена микросхема, которая всё это и обеспечивает. Значит, можно управлять множеством светодиодов, задействовав всего один цифровой пин ESP32.

Внутри светодиода WS2812B — управляющая микросхема.

WS2812B выпускают в виде лент, колец и плат.
Питание ленты WS2812B#
Ленту следует питать от источника 5 В. При 5 В каждый светодиод на полной яркости потребляет около 50 мА. То есть на каждые 30 светодиодов лента может брать до 1,5 А. Подбирайте источник под потребности ленты — подойдёт адаптер AC/DC на 5 В 2 А.
Если используете внешний источник питания, не забудьте соединить его землю с пином GND ESP32.
В этом руководстве мы управляем линейкой из 8 светодиодов, поэтому внешний источник не нужен — используем пин VIN ESP32.
Что нужно из железа#
- плата ESP32 — любая модель;
- лента/кольцо на адресных RGB-светодиодах WS2812B;
- соединительные провода.
Подключение WS2812B к ESP32#
Подключение простое — нужен всего один цифровой пин (DIN).
| WS2812B | ESP32 |
|---|---|
| GND | GND |
| DIN | Любой цифровой пин (например, GPIO 2)* |
| 4–7 В | VIN 5V |
* можно использовать любые другие подходящие GPIO — сверьтесь с распиновкой ESP32.
Подать 5 В на пин VDC, GND на GND, а цифровой пин — на DIN (данные). Мы подключим данные к GPIO 2.

Схема: GPIO 2 → DIN, питание и земля.
Можно спаять несколько колец, палочек или лент — они будут работать как одно целое. На каждой плате есть пины DIN и DOUT, что упрощает соединение.

Последовательное соединение модулей через DIN/DOUT.
В нашем примере используем палочку с 8 светодиодами.

Палочка на 8 светодиодах WS2812B.
Установка библиотеки FastLED#
Есть несколько библиотек для работы с WS2812B на ESP32. Мы используем FastLED. Установка:
- откройте менеджер библиотек Arduino IDE;
- найдите FastLED;
- установите библиотеку FastLED от Daniel Garcia.

Установка FastLED.
Пример №1 — управление каждым светодиодом WS2812B по отдельности#
Следующий код задаёт свой цвет каждому светодиоду. Загрузите его на плату — он заработает сразу.
/*
Rui Santos & Sara Santos - Random Nerd Tutorials
Complete project details at https://RandomNerdTutorials.com/esp32-ws2812b-neopixels-arduino/
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/
#include <FastLED.h>
#define NUM_LEDS 8
#define DIN_PIN 2
#define BRIGHTNESS 80 // Brightness (0-255)
#define DELAY_MS 500
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<WS2812B, DIN_PIN, GRB>(leds, NUM_LEDS);
FastLED.setBrightness(BRIGHTNESS);
FastLED.clear();
}
void loop() {
leds[0] = CRGB(255, 0, 0); // Red » (R=255, G=0, B=0)
FastLED.show();
delay(DELAY_MS);
leds[1] = CRGB(0, 255, 0); // Green » (R=0, G=255, B=0)
FastLED.show();
delay(DELAY_MS);
leds[2] = CRGB(0, 0, 255); // Blue » (R=0, G=0, B=255)
FastLED.show();
delay(DELAY_MS);
leds[3] = CRGB(255, 165, 0); // Orange » (R=255, G=165, B=0)
FastLED.show();
delay(DELAY_MS);
leds[4] = CRGB(128, 0, 128); // Purple » (R=128, G=0, B=128)
FastLED.show();
delay(DELAY_MS);
leds[5] = CRGB(255, 255, 0); // Yellow » (R=255, G=255, B=0)
FastLED.show();
delay(DELAY_MS);
leds[6] = CRGB(255, 255, 255); // White » (R=255, G=255, B=255)
FastLED.show();
delay(DELAY_MS);
leds[7] = CRGB(0, 0, 0); // Off/Black » (R=0, G=0, B=0)
FastLED.show();
delay(DELAY_MS);
FastLED.clear();
delay(DELAY_MS);
}
Как работает код#
Разберём первый пример.
Подключение библиотеки. Сначала подключаем библиотеку FastLED.h — она нужна для управления светодиодами WS2812B.
#include <FastLED.h>
Глобальные переменные. Задаём общее число светодиодов в ленте или кольце.
#define NUM_LEDS 8
Пин данных (DIN_PIN) подключён к GPIO 2 ESP32.
#define DIN_PIN 2
Задаём яркость всех светодиодов (от 0 до 255).
#define BRIGHTNESS 80
Задержка анимации в миллисекундах (500 мс = 0,5 с).
#define DELAY_MS 500
Создаём массив leds, хранящий цвета всех 8 светодиодов. CRGB — тип цвета в FastLED (красный, зелёный, синий).
CRGB leds[NUM_LEDS];
setup(). Инициализируем ленту через FastLED, передавая: тип светодиодов = WS2812B, пин данных = DIN_PIN, порядок цветов = GRB (у большинства WS2812B порядок GRB, а не RGB).
FastLED.addLeds<WS2812B, DIN_PIN, GRB>(leds, NUM_LEDS);
Задаём общий уровень яркости и гасим все светодиоды при старте.
FastLED.setBrightness(BRIGHTNESS);
FastLED.clear();
loop(). Цикл выполняется непрерывно. Сначала он задаёт первому светодиоду (индекс 0) красный цвет.
leds[0] = CRGB(255, 0, 0);
Эта строка только задаёт цвет. Чтобы физические светодиоды действительно поменяли цвет, нужно вызвать метод show().
FastLED.show();
Дальше по очереди задаём цвета остальным светодиодам, а в конце гасим все вызовом clear().
Демонстрация#

Пример 1: каждый светодиод — своим цветом.

Пример 1 в работе.
Пример №2 — управление всеми светодиодами WS2812B сразу#
Следующий код задаёт один цвет всем светодиодам одной командой.
/*
Rui Santos & Sara Santos - Random Nerd Tutorials
Complete project details at https://RandomNerdTutorials.com/esp32-ws2812b-neopixels-arduino/
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/
#include <FastLED.h>
#define NUM_LEDS 8
#define DIN_PIN 2
#define BRIGHTNESS 80 // Brightness (0-255)
#define DELAY_MS 500
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<WS2812B, DIN_PIN, GRB>(leds, NUM_LEDS);
FastLED.setBrightness(BRIGHTNESS);
FastLED.clear();
}
void loop() {
fill_solid(leds, NUM_LEDS, CRGB(255, 0, 0)); // Color » Red
FastLED.show();
delay(DELAY_MS);
fill_solid(leds, NUM_LEDS, CRGB(0, 255, 0)); // Color » Green
FastLED.show();
delay(DELAY_MS);
fill_solid(leds, NUM_LEDS, CRGB(0, 0, 255)); // Color » Blue
FastLED.show();
delay(DELAY_MS);
fill_solid(leds, NUM_LEDS, CRGB(255, 255, 255)); // Color » White
FastLED.show();
delay(DELAY_MS);
}
Обзор кода#
Инициализация почти такая же, как в примере №1, но вместо управления каждым светодиодом мы задаём всем один цвет одной командой. Для этого служит функция fill_solid(), принимающая массив цветов, число светодиодов и нужный цвет:
fill_solid(leds, NUM_LEDS, CRGB(255, 0, 0));
FastLED.show();
delay(DELAY_MS);
Демонстрация#

Пример 2: все светодиоды заливаются одним цветом.

Пример 2 в работе.
Пример №3 — эффект «бегущего огня» (chase/cycle)#
Следующий код создаёт эффект «бегущего огня»: по очереди зажигается один светодиод, движущийся по всей ленте, пока остальные погашены.
/*
Rui Santos & Sara Santos - Random Nerd Tutorials
Complete project details at https://RandomNerdTutorials.com/esp32-ws2812b-neopixels-arduino/
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/
#include <FastLED.h>
#define NUM_LEDS 8
#define DIN_PIN 2
#define BRIGHTNESS 80 // Brightness (0-255)
#define DELAY_MS 50 // Chase effect speed
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<WS2812B, DIN_PIN, GRB>(leds, NUM_LEDS);
FastLED.setBrightness(BRIGHTNESS);
FastLED.clear();
}
void loop() {
// Chase effect from left to right
for (int i = 0; i < NUM_LEDS; i++) {
FastLED.clear(); // Clear LEDs
leds[i] = CRGB(0, 0, 255); // Light current position
FastLED.show();
delay(DELAY_MS); // Chase effect speed
}
// Reverse the chase effect direction
for (int i = NUM_LEDS - 1; i >= 0; i--) {
FastLED.clear();
leds[i] = CRGB(0, 0, 255);
FastLED.show();
delay(DELAY_MS);
}
}
Обзор кода#
Код похож на предыдущие; разберём только сам эффект. Этот цикл зажигает по одному синему светодиоду за раз, двигая его по ленте от первого к последнему с короткой задержкой между шагами. Затем повторяет то же в обратном направлении.
for (int i = 0; i < NUM_LEDS; i++) {
FastLED.clear();
leds[i] = CRGB(0, 0, 255);
FastLED.show();
delay(DELAY_MS);
}
Демонстрация#

Пример 3: «бегущий огонь» по ленте.
Пример №4 — эффект радуги#
Следующий код создаёт эффект радуги — цвета плавно движутся по всем светодиодам.
/*
Rui Santos & Sara Santos - Random Nerd Tutorials
Complete project details at https://RandomNerdTutorials.com/esp32-ws2812b-neopixels-arduino/
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/
#include <FastLED.h>
#define NUM_LEDS 8
#define DIN_PIN 2
#define SATURATION 255 // Saturarion (0-255)
#define BRIGHTNESS 255 // Brightness (0-255)
#define DELAY_MS 20
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<WS2812B, DIN_PIN, GRB>(leds, NUM_LEDS);
FastLED.setBrightness(BRIGHTNESS);
FastLED.clear();
}
void loop() {
for (int i = 0; i < NUM_LEDS; i++) {
// Set LED i to a moving rainbow color effect: i*10 creates color spread across LEDs
// millis()/20 makes the rainbow slowly animate over time with full saturation and full brightness
leds[i] = CHSV(i * 10 + millis() / 20, SATURATION, BRIGHTNESS);
}
FastLED.show();
delay(DELAY_MS);
}
Обзор кода#
Разберём только новый код в loop(). Он присваивает светодиоду в позиции i сдвигающийся цвет радуги, создавая динамичную анимацию.
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = CHSV(i * 10 + millis() / 20, SATURATION, BRIGHTNESS);
}
FastLED.show();
delay(DELAY_MS);
CHSV()— создаёт цвет в модели HSV (тон, насыщенность, яркость);i * 10— меняет тон для каждого светодиода, «размазывая» цвета вдоль ленты;millis() / 20— добавляет смещение по времени, из-за чего цвета радуги медленно движутся;SATURATION(255) — полная насыщенность;BRIGHTNESS(255) — полная яркость.
Демонстрация#

Пример 4: эффект радуги.

Пример 4 в работе.
Итог#
В этом руководстве вы научились управлять адресными RGB-светодиодами WS2812B (кольцами, лентами или палочками). Благодаря библиотеке FastLED управление ими из Arduino-кода — дело простое. Теперь эти приёмы можно применять в своих проектах — например, собрать веб-сервер с кнопками для удалённого управления светодиодами.
Спасибо за чтение.