
Собираем настольную LED-лампу на Arduino Nano с лентой WS2812B: радужные эффекты, мерцание и плавные переходы. Простой проект с красивым результатом. Полный код и инструкция.
Большинство Arduino-проектов остаются на макетной плате -- собрал, показал, разобрал. LED-лампа на адресных светодиодах -- редкое исключение. Это проект, который можно оформить в корпус и действительно использовать: как ночник, настольный светильник или декоративный элемент. А главное -- это один из самых простых проектов с эффектным визуальным результатом.
В основе лампы -- отрезок ленты WS2812B (36 светодиодов) и Arduino Nano. Библиотека FastLED позволяет создавать десятки световых эффектов: вращающуюся радугу, мерцание с блёстками, плавные переходы между цветами. Всё управляется одним проводом данных.
Проект подходит для учеников 5--8 классов. Его можно собрать за один урок, а корпус изготовить из подручных материалов или напечатать на 3D-принтере.

Стоимость электронных компонентов -- около 4 000--6 000 тенге. Лента WS2812B продаётся метрами; для этого проекта достаточно 60 см.
Адресные светодиоды WS2812B управляются по одному проводу -- каждый светодиод принимает свои данные и передаёт остальные следующему.
Подключение ленты WS2812B к Arduino Nano:
| Лента WS2812B | Подключение |
|---|---|
| 5V (красный) | 5V от блока питания |
| GND (белый/чёрный) | GND Arduino + GND блока питания |
| DIN (зелёный) | Пин D6 через резистор 330 Ом |
Конденсатор 1000 мкФ устанавливается между 5V и GND максимально близко к ленте. Он защищает светодиоды от скачков напряжения при включении. Соблюдайте полярность: длинная ножка конденсатора -- плюс.
Важно: GND Arduino и GND блока питания должны быть соединены. Без общей земли сигнал управления не будет работать корректно.
При 36 светодиодах на максимальной яркости потребление может достигать 2А, поэтому питание ленты берётся напрямую от блока питания, а не от пина 5V Arduino.

Установите библиотеку FastLED через менеджер библиотек Arduino IDE: меню Скетч -- Подключить библиотеку -- Управление библиотеками -- найдите "FastLED" и нажмите "Установить".
FastLED -- мощная библиотека для работы с адресными светодиодами. Она поддерживает множество типов лент (WS2812B, WS2811, APA102 и другие) и содержит встроенные функции для работы с цветом в форматах RGB и HSV.
```cpp
#include <FastLED.h>
// Настройки
#define LED_PIN 6 // Пин данных ленты
#define NUM_LEDS 36 // Количество светодиодов
#define BRIGHTNESS 150 // Яркость (0-255)
#define LED_TYPE WS2812B // Тип ленты
#define COLOR_ORDER GRB // Порядок цветов
// Массив для хранения цвета каждого светодиода
CRGB leds[NUM_LEDS];
// Переменная для текущего эффекта
int currentEffect = 0;
const int totalEffects = 4;
// Счётчик кадров для анимаций
uint8_t hueOffset = 0;
void setup() {
// Небольшая задержка для стабилизации питания
delay(500);
// Инициализация ленты
FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS);
FastLED.setBrightness(BRIGHTNESS);
// Гасим все светодиоды при старте
FastLED.clear();
FastLED.show();
Serial.begin(9600);
Serial.println("LED-лампа запущена");
}
// Эффект 1: Вращающаяся радуга
// Каждый светодиод получает свой оттенок, смещённый относительно соседа
void rainbow() {
for (int i = 0; i < NUM_LEDS; i++) {
// Вычисляем оттенок: базовое смещение + позиция светодиода
leds[i] = CHSV(hueOffset + (i * 256 / NUM_LEDS), 255, 255);
}
FastLED.show();
hueOffset++; // Сдвигаем радугу на каждом кадре
}
// Эффект 2: Радуга с блёстками
// Случайные светодиоды вспыхивают белым поверх радуги
void rainbowWithGlitter() {
rainbow(); // Сначала рисуем обычную радугу
// С вероятностью 1/5 добавляем белую вспышку
if (random8() < 50) {
leds[random16(NUM_LEDS)] += CRGB::White;
}
FastLED.show();
}
// Эффект 3: Плавное дыхание одним цветом
// Яркость плавно нарастает и убывает
void breathe() {
// Используем синусоиду для плавного изменения яркости
uint8_t breath = beatsin8(12, 30, 255); // 12 ударов/мин, от 30 до 255
CRGB color = CHSV(hueOffset / 4, 200, breath);
fill_solid(leds, NUM_LEDS, color);
FastLED.show();
hueOffset++; // Медленно меняем цвет
}
// Эффект 4: Мерцание свечи
// Тёплый оранжевый свет с случайными колебаниями яркости
void candleFlicker() {
for (int i = 0; i < NUM_LEDS; i++) {
// Случайная яркость для каждого светодиода
uint8_t flicker = random8(140, 255);
// Тёплый оранжевый: высокий красный, средний зелёный, нулевой синий
leds[i] = CRGB(flicker, flicker / 3, 0);
}
FastLED.show();
delay(60); // Частота мерцания
}
void loop() {
// Каждые 15 секунд переключаем эффект
EVERY_N_SECONDS(15) {
currentEffect = (currentEffect + 1) % totalEffects;
Serial.print("Эффект: ");
Serial.println(currentEffect);
}
// Запускаем текущий эффект
switch (currentEffect) {
case 0:
rainbow();
break;
case 1:
rainbowWithGlitter();
break;
case 2:
breathe();
break;
case 3:
candleFlicker();
break;
}
// Ограничиваем частоту обновления (примерно 60 кадров/сек)
FastLED.delay(1000 / 60);
}
`
Цветовая модель HSV. Библиотека FastLED позволяет задавать цвет в формате HSV (оттенок, насыщенность, яркость). Оттенок -- число от 0 до 255, где 0 -- красный, 96 -- зелёный, 160 -- синий. Меняя только оттенок, мы получаем все цвета радуги. Это намного удобнее, чем подбирать три значения RGB вручную.
Радужный эффект. Каждый светодиод получает оттенок, равномерно распределённый по цветовому кругу. Переменная hueOffset сдвигается на каждом кадре, заставляя радугу вращаться. Формула hueOffset + (i * 256 / NUM_LEDS) гарантирует, что вся радуга умещается ровно на длину ленты.
Функции FastLED. beatsin8 генерирует синусоидальное значение с заданной частотой -- идеально для эффекта дыхания. random8 -- быстрый генератор случайных чисел. fill_solid заливает всю ленту одним цветом. EVERY_N_SECONDS -- макрос для выполнения кода с заданным интервалом без использования delay.
Мерцание свечи. Каждый светодиод получает случайную яркость в диапазоне 140--255. Зелёный канал составляет треть от красного, синий -- ноль. Это создаёт тёплый оранжевый тон. Случайные колебания яркости имитируют живое пламя.
Для рассеивания света лучше всего подходит матовый материал. Несколько вариантов:
Arduino Nano и провода прячутся в основание лампы. Для автономной работы подключите блок питания 5V через разъём, выведенный на корпус.
NUM_LEDS -- код автоматически подстроится под любую длину ленты.Arduino Nano, ленты WS2812B и все необходимые компоненты входят в наборы Alashed Hardware, подготовленные для школьных проектов. Писать и загружать код удобно через Alashed CodeStudio -- онлайн-среду, которая работает прямо в браузере и не требует установки Arduino IDE на каждый компьютер в классе.
Подключите школу к пилоту. Генерируйте КМЖ за 2 минуты, ведите CodeStudio уроки, заказывайте оборудование — всё в одном месте.