Светодиодное кольцо CJMCU-2812B (WS2812B) на Arduino

Светодиодное кольцо CJMCU-2812B на Arduino: управление адресными светодиодами WS2812B

📅 Дата публикации: 13 мая 2026 ⏱️ Время чтения: ~8 минут

Это вторая часть проверки сборки схемы на макетной плате. В данном случае рассмотрим прошивку светодиодного кольца CJMCU-2812B. Кольцо состоит из RGB пикселей WS2812B.

📌 Первая часть (телеметрические датчики): Датчики CJMCU BME680 и AHT20+BMP280 на Arduino

1. Обзор адресных светодиодов WS2812B

Пиксель WS2812B
Отдельный пиксель WS2812B
Светодиодное кольцо CJMCU-2812B
Модуль CJMCU-2812B (12 пикселей)

📊 Характеристики WS2812B

ПараметрЗначение
Напряжение питания5 ± 0.5 В
Потребление тока (один цветной светодиод)~20 мА
Потребление тока (весь пиксель RGB)~60 мА
📄 Datasheet: WS2812B_datasheet_EN.pdf

2. Подключение к ESP32-C3 и меры предосторожности

⚠️ ВАЖНЫЕ МОМЕНТЫ ПОДКЛЮЧЕНИЯ:
  • Ни в коем случае не подавайте питание 3.3В — светодиоды работают от 5В. При питании от 3.3В они могут не загореться или работать нестабильно.
  • Земля (GND) должна быть общей для ESP32-C3 и светодиодного кольца.
  • Рекомендуется установить резистор 470 Ом между пином DI (на кольце) и GPIO (на ESP32-C3) для защиты ESP от обратного тока и помех.

🔌 Таблица подключения

CJMCU-WS2812B-12ESP32-C3 (Zero)
5V5V
GNDGND
DI (Data Input)GPIO2 (через резистор 470 Ом)
💡 Примечание: Ножка DO (Data Output) служит для последовательного подключения дополнительных таких же колец или лент — выход DO одного модуля подключается ко входу DI следующего.
Схема сборки на макетной плате
Схема подключения светодиодного кольца к ESP32-C3 на макетной плате

3. Установка библиотеки Adafruit NeoPixel

Библиотека Adafruit NeoPixel предназначена для работы со светодиодными кольцами NeoPixel Ring, разработки и производства Adafruit.

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

  1. Откройте Arduino IDE
  2. Перейдите в меню Скетч → Включить библиотеку → Управление библиотеками
  3. В строке поиска введите Adafruit NeoPixel
  4. Найдите библиотеку Adafruit NeoPixel (автором Adafruit) и нажмите Установить
💡 Примечание: Библиотека поддерживает WS2812B, WS2811, SK6812 и другие адресные светодиоды.

4. Пример кода: простое мигание (Blink)

Стандартный скетч Blink — кольцо загорается фиолетовым на полсекунды и выключается на такой же интервал.

// Подключаем библиотеку Adafruit NeoPixel. #include "Adafruit_NeoPixel.h" // Указываем, какое количество пикселей у нашей ленты. #define LED_COUNT 12 // Указываем, к какому порту подключен вход ленты DIN. #define LED_PIN 2 // Создаем переменную strip для управления нашей лентой. Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800); void setup() { // Инициализируем ленту. strip.begin(); } void loop() { // Включаем все светодиоды. for (int i = 0; i < LED_COUNT; i++) { strip.setPixelColor(i, strip.Color(128, 0, 255)); // Фиолетовый цвет } // Передаем цвета ленте. strip.show(); // Ждем 500 мс. delay(500); // Выключаем все светодиоды. for (int i = 0; i < LED_COUNT; i++) { strip.setPixelColor(i, strip.Color(0, 0, 0)); // Черный цвет, т.е. выключено. } // Передаем цвета ленте. strip.show(); // Ждем 500 мс. delay(500); }
Видео: работа светодиодного кольца (Blink)

5. Пример кода: различные эффекты

Более сложный скетч с переключением эффектов каждые 10 секунд: радуга, бегущая дуга, мерцание, двухцветная волна.

#include <Adafruit_NeoPixel.h> // Настройки #define LED_PIN 2 // Пин данных (можно сменить на GPIO 2, 3, 4, 5) #define LED_COUNT 12 // Количество светодиодов в кольце #define BRIGHTNESS 50 // Яркость 0-255 (рекомендую 30-100 для комфорта) // Создаём объект ленты Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800); // Переменные для эффектов int hue = 0; // Тон цвета (0-65535 для wheel) int position = 0; // Позиция бегущей дуги unsigned long lastUpdate = 0; int updateInterval = 30; // мс между обновлениями (чем меньше, тем быстрее) // Эффект 1: Радуга, вращающаяся по кругу void rainbowCycle(int wait) { for (int i = 0; i < LED_COUNT; i++) { // Сдвиг цвета для каждого светодиода, создающий вращение int colorPos = (i * 65536 / LED_COUNT + hue) % 65536; strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(colorPos, 255, BRIGHTNESS))); } strip.show(); hue += 256; // Меняем оттенок для движения if (hue >= 65536) hue -= 65536; delay(wait); } // Эффект 2: Бегущая дуга с плавным переходом void runningArc(int wait) { // Очищаем все пиксели for (int i = 0; i < LED_COUNT; i++) { strip.setPixelColor(i, strip.Color(0, 0, 0)); } // Рисуем дугу из 3-4 светодиодов int arcLength = 3; for (int i = 0; i < arcLength; i++) { int ledIndex = (position - i + LED_COUNT) % LED_COUNT; // Плавное затухание хвоста int brightness = BRIGHTNESS * (arcLength - i) / arcLength; // Цвет меняется в зависимости от позиции uint32_t color = strip.ColorHSV( (position * 65536 / LED_COUNT + i * 5000) % 65536, 255, brightness ); strip.setPixelColor(ledIndex, color); } strip.show(); position = (position + 1) % LED_COUNT; delay(wait); } // Эффект 3: Мерцание случайными цветами (огоньки) void sparkle(int wait) { // Случайный светодиод int led = random(LED_COUNT); // Случайный яркий цвет uint32_t color = strip.ColorHSV(random(65536), 255, BRIGHTNESS); strip.setPixelColor(led, color); strip.show(); delay(wait); // Выключаем strip.setPixelColor(led, strip.Color(0, 0, 0)); strip.show(); delay(wait); } // Эффект 4: Заполнение двумя цветами (красный-синий) void dualColor(int wait) { static int step = 0; step = (step + 1) % (LED_COUNT * 2); for (int i = 0; i < LED_COUNT; i++) { if ((i + step) % 4 < 2) { // Красная зона strip.setPixelColor(i, strip.Color(BRIGHTNESS, 0, 0)); } else { // Синяя зона strip.setPixelColor(i, strip.Color(0, 0, BRIGHTNESS)); } } strip.show(); delay(wait); } // Эффект 5: Волна по кругу void wave(int wait) { for (int i = 0; i < LED_COUNT; i++) { // Синусоидальная яркость: sin(angle + time) float angle = (i * 2 * PI / LED_COUNT) + (millis() / 1000.0); int brightness = (sin(angle) + 1) / 2 * BRIGHTNESS; // 0..BRIGHTNESS // Меняем цвет с волной яркости int hue = (i * 65536 / LED_COUNT + millis() * 50) % 65536; strip.setPixelColor(i, strip.ColorHSV(hue, 255, brightness)); } strip.show(); delay(wait); } void setup() { Serial.begin(115200); Serial.println("Запуск светового кольца WS2812B на ESP32-C3"); strip.begin(); // Инициализация strip.setBrightness(BRIGHTNESS); // Яркость strip.show(); // Очищаем все пиксели randomSeed(analogRead(0)); // Инициализация случайных чисел } void loop() { // Переключаем эффекты каждые 10 секунд static unsigned long lastChange = 0; static int effect = 0; if (millis() - lastChange > 10000) { // Меняем эффект каждые 10 сек effect = (effect + 1) % 5; lastChange = millis(); Serial.print("Эффект: "); Serial.println(effect); } // Запускаем текущий эффект switch(effect) { case 0: rainbowCycle(30); break; case 1: runningArc(50); break; case 2: sparkle(80); break; case 3: dualColor(150); break; case 4: wave(30); break; } }
Видео: различные эффекты (радуга, дуга, мерцание, волна)
✅ Готово! Теперь вы можете управлять светодиодным кольцом CJMCU-2812B, создавать собственные эффекты и интегрировать подсветку в свои проекты.
Мы используем cookie-файлы. Это нужно для лучшей работы сайта. Продолжая пользоваться сайтом, вы соглашаетесь с этим.