
Создаём интерактивный светящийся стол на Arduino с адресной лентой WS2812B, кнопкой переключения режимов и множеством световых эффектов.
Представьте журнальный стол, поверхность которого разделена на квадратные ячейки, и каждая ячейка может светиться любым цветом. Нажатие скрытой кнопки переключает световые паттерны: радуга, бегущие огни, пульсация, случайные вспышки. Именно такой проект мы соберём на Arduino и адресной светодиодной ленте WS2812B.
Проект вдохновлён реальной конструкцией светящегося стола, где LED-ленты размещены в деревянной раме под матовым оргстеклом с разделительной решёткой. Мы сосредоточимся на электронной части, которую можно встроить в любую мебель или даже использовать как отдельную световую панель.
Целевая аудитория: ученики 6-10 классов.
Время на проект: 2-3 занятия по 45 минут.

Кнопка переключения режимов:
Светодиодная лента WS2812B:
Установите конденсатор 1000 мкФ между VCC и GND ленты рядом с первым светодиодом. Он защищает от скачков тока при включении. Обратите внимание на стрелки на ленте -- данные передаются только в одном направлении: подключайте к концу с надписью DIN.
При использовании более 30 светодиодов на полной яркости не запитывайте ленту от пина 5V Arduino -- используйте внешний блок питания.

Установите библиотеку FastLED через менеджер библиотек Arduino IDE. Она поддерживает ленты WS2812B, имеет удобные функции для работы с цветом в формате HSV и множество встроенных эффектов.
```cpp
#include <FastLED.h>
// Настройки ленты
#define LED_PIN 6 // Пин данных
#define NUM_LEDS 60 // Количество светодиодов
#define BRIGHTNESS 180 // Яркость (0-255)
#define LED_TYPE WS2812B
#define COLOR_ORDER GRB
// Кнопка переключения режимов
#define BUTTON_PIN 2
CRGB leds[NUM_LEDS]; // Массив светодиодов
// Переменные для кнопки
volatile int mode = 0; // Текущий режим
volatile bool modeChanged = false;
#define NUM_MODES 6 // Количество режимов
// Переменные для эффектов
uint8_t hue = 0; // Текущий оттенок
unsigned long lastUpdate = 0; // Время последнего обновления
void setup() {
Serial.begin(9600);
// Инициализация ленты с задержкой для стабилизации
delay(500);
FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS);
FastLED.setBrightness(BRIGHTNESS);
FastLED.clear();
FastLED.show();
// Кнопка с прерыванием
pinMode(BUTTON_PIN, INPUT);
attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), buttonISR, RISING);
Serial.println("Диско-стол запущен. Режим: 0");
}
// Обработчик прерывания кнопки
void buttonISR() {
static unsigned long lastPress = 0;
// Антидребезг: игнорируем нажатия чаще 300 мс
if (millis() - lastPress > 300) {
mode = (mode + 1) % NUM_MODES;
modeChanged = true;
lastPress = millis();
}
}
void loop() {
if (modeChanged) {
modeChanged = false;
FastLED.clear();
Serial.print("Режим: ");
Serial.println(mode);
}
// Выбор эффекта по номеру режима
switch (mode) {
case 0: effectRainbow(); break;
case 1: effectColorWipe(); break;
case 2: effectPulse(); break;
case 3: effectSparkle(); break;
case 4: effectChase(); break;
case 5: effectFire(); break;
}
FastLED.show();
hue++; // Плавный сдвиг оттенка
}
// Режим 0: бегущая радуга
void effectRainbow() {
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = CHSV(hue + (i * 256 / NUM_LEDS), 255, 255);
}
delay(20);
}
// Режим 1: заполнение цветом по одному светодиоду
void effectColorWipe() {
static int pos = 0;
static uint8_t wipeHue = 0;
leds[pos] = CHSV(wipeHue, 255, 255);
FastLED.show();
delay(50);
pos++;
if (pos >= NUM_LEDS) {
pos = 0;
wipeHue += 60; // Следующий цвет
}
}
// Режим 2: дыхание (пульсация яркости)
void effectPulse() {
// Синусоидальное изменение яркости
uint8_t brightness = beatsin8(30, 30, 255);
fill_solid(leds, NUM_LEDS, CHSV(hue, 255, brightness));
delay(10);
}
// Режим 3: случайные вспышки (блёстки)
void effectSparkle() {
// Затухание всех светодиодов
fadeToBlackBy(leds, NUM_LEDS, 40);
// Случайная вспышка
if (random8() < 80) {
int pos = random16(NUM_LEDS);
leds[pos] = CHSV(random8(), 200, 255);
}
delay(30);
}
// Режим 4: бегущие огни
void effectChase() {
static int pos = 0;
fadeToBlackBy(leds, NUM_LEDS, 100);
// Три точки, равномерно распределённые по ленте
for (int i = 0; i < 3; i++) {
int p = (pos + i * NUM_LEDS / 3) % NUM_LEDS;
leds[p] = CHSV(hue + i * 80, 255, 255);
}
pos = (pos + 1) % NUM_LEDS;
delay(40);
}
// Режим 5: эффект огня
void effectFire() {
// Случайное тепло для каждого светодиода
static byte heat[NUM_LEDS];
// Охлаждение
for (int i = 0; i < NUM_LEDS; i++) {
heat[i] = qsub8(heat[i], random8(0, 30));
}
// Подъём тепла вверх
for (int i = NUM_LEDS - 1; i >= 2; i--) {
heat[i] = (heat[i-1] + heat[i-2] + heat[i-2]) / 3;
}
// Случайные искры у основания
if (random8() < 160) {
int y = random8(3);
heat[y] = qadd8(heat[y], random8(180, 255));
}
// Преобразование тепла в цвет
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = HeatColor(heat[i]);
}
delay(30);
}
`
Прерывания для кнопки. Кнопка подключена к пину D2, который поддерживает аппаратные прерывания на Arduino Uno. При нажатии вызывается функция buttonISR(), которая увеличивает номер режима. Антидребезг реализован проверкой интервала 300 мс между нажатиями. Благодаря прерыванию переключение работает мгновенно, даже если основной цикл занят отрисовкой эффекта.
Шесть режимов. Конструкция switch-case в loop() выбирает текущий эффект. Радуга использует сдвиг по оттенку HSV. Пульсация меняет яркость по синусоиде через функцию beatsin8(). Блёстки случайно зажигают светодиоды на фоне постоянного затухания через fadeToBlackBy(). Эффект огня моделирует распространение тепла по массиву.
Цветовая модель HSV. Библиотека FastLED работает с цветом в формате Hue-Saturation-Value (оттенок, насыщенность, яркость). Это удобнее RGB для создания плавных переходов: достаточно увеличивать значение Hue, и цвет будет плавно меняться от красного через жёлтый, зелёный, синий и обратно к красному.
Защита ленты. Резистор 470 Ом на линии данных предотвращает повреждение первого светодиода от скачков напряжения. Конденсатор 1000 мкФ сглаживает пиковые токи при одновременном включении всех светодиодов на полной яркости.
В среде Alashed CodeStudio можно виртуально моделировать поведение LED-ленты, тестируя эффекты до загрузки на плату. А компоненты из каталога Alashed Hardware -- ленты WS2812B, блоки питания, кнопки и резисторы -- подобраны для совместимости и поставляются с инструкциями на русском языке.
Подключите школу к пилоту. Генерируйте КМЖ за 2 минуты, ведите CodeStudio уроки, заказывайте оборудование — всё в одном месте.