Перевод статьи ESP32: WS2812B Addressable RGB LEDs (Neopixels) – Arduino IDERui 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: ленты, кольца, платы-палочки

WS2812B выпускают в виде лент, колец и плат.

Питание ленты WS2812B#

Ленту следует питать от источника 5 В. При 5 В каждый светодиод на полной яркости потребляет около 50 мА. То есть на каждые 30 светодиодов лента может брать до 1,5 А. Подбирайте источник под потребности ленты — подойдёт адаптер AC/DC на 5 В 2 А.

Если используете внешний источник питания, не забудьте соединить его землю с пином GND ESP32.

В этом руководстве мы управляем линейкой из 8 светодиодов, поэтому внешний источник не нужен — используем пин VIN ESP32.

Что нужно из железа#

  • плата ESP32 — любая модель;
  • лента/кольцо на адресных RGB-светодиодах WS2812B;
  • соединительные провода.

Подключение WS2812B к ESP32#

Подключение простое — нужен всего один цифровой пин (DIN).

WS2812BESP32
GNDGND
DINЛюбой цифровой пин (например, GPIO 2)*
4–7 ВVIN 5V

* можно использовать любые другие подходящие GPIO — сверьтесь с распиновкой ESP32.

Подать 5 В на пин VDC, GND на GND, а цифровой пин — на DIN (данные). Мы подключим данные к GPIO 2.

Схема подключения ленты WS2812B к ESP32: GPIO 2 на DIN

Схема: GPIO 2 → DIN, питание и земля.

Можно спаять несколько колец, палочек или лент — они будут работать как одно целое. На каждой плате есть пины DIN и DOUT, что упрощает соединение.

Последовательное соединение нескольких модулей WS2812B через DIN/DOUT

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

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

Палочка на 8 светодиодах и другие необходимые компоненты

Палочка на 8 светодиодах WS2812B.

Установка библиотеки FastLED#

Есть несколько библиотек для работы с WS2812B на ESP32. Мы используем FastLED. Установка:

  • откройте менеджер библиотек Arduino IDE;
  • найдите FastLED;
  • установите библиотеку FastLED от Daniel Garcia.
Установка библиотеки FastLED в менеджере библиотек Arduino IDE

Установка 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: каждый светодиод — своим цветом.

Палочка на 8 светодиодах: каждый горит своим цветом

Пример 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: все светодиоды заливаются одним цветом.

Палочка на 8 светодиодах: все горят синим

Пример 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: эффект бегущего огня по ленте

Пример 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: эффект радуги.

Палочка на 8 светодиодах с анимацией радуги

Пример 4 в работе.

Итог#

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

Спасибо за чтение.