🎓 Дипломный проект
Светодиодное кольцо CJMCU-2812B на Arduino: управление адресными светодиодами WS2812B
📅 Дата публикации: 13 мая 2026
⏱️ Время чтения: ~8 минут
Это вторая часть проверки сборки схемы на макетной плате. В данном случае рассмотрим прошивку светодиодного кольца CJMCU-2812B. Кольцо состоит из RGB пикселей WS2812B.
📌 Первая часть (телеметрические датчики): Датчики CJMCU BME680 и AHT20+BMP280 на Arduino
Содержание статьи
1. Обзор адресных светодиодов WS2812B
📊 Характеристики 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-12 | ESP32-C3 (Zero) |
|---|---|
| 5V | 5V |
| GND | GND |
| DI (Data Input) | GPIO2 (через резистор 470 Ом) |
💡 Примечание: Ножка DO (Data Output) служит для последовательного подключения дополнительных таких же колец или лент — выход DO одного модуля подключается ко входу DI следующего.
3. Установка библиотеки Adafruit NeoPixel
Библиотека Adafruit NeoPixel предназначена для работы со светодиодными кольцами NeoPixel Ring, разработки и производства Adafruit.
Установка библиотеки:
- Откройте Arduino IDE
- Перейдите в меню Скетч → Включить библиотеку → Управление библиотеками
- В строке поиска введите
Adafruit NeoPixel - Найдите библиотеку 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);
}
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, создавать собственные эффекты и интегрировать подсветку в свои проекты.