- Библиотеки
- Операторы
- Sketch
- Управляющие операторы
- Синтаксис
- Арифметические операторы
- Операторы сравнения
- Логические операторы
- Указатели доступа
- Битовые операторы
- Составные операторы
- Данные
- Типы данных
- Преобразование типов данных
- Область видимости переменных и квалификаторы
- Утилиты
- Цифровой ввод/вывод
- Аналоговый вход/выход
- Расширенный ввод/вывод
- Время
- Математические функции
- Тригонометрические функции
- Символы
- Случайные числа
- Биты и байты
- Внешние Прерывания
- Прерывания
- Функции передачи данных
- Функции
- Устройства
- Датчики
- WS2812
- Модули
WS2812
Что такое WS2812
WS2812 — это RGB-светодиоды с встроенным контроллером. Каждый светодиод можно управлять индивидуально по одной линии данных.
Особенности:
- управление по цифровому протоколу (1 провод);
- поддержка цепочки светодиодов (каждый передаёт сигнал дальше);
- возможность задать цвет (24 бита: R, G, B) и яркость.
Подключение WS2812 к Arduino
У светодиодной ленты/модуля WS2812 обычно 3 вывода:
- DIN — вход данных (подключается к Arduino);
- VCC — питание (обычно 5 В);
- GND — земля.
Схема подключения:
- Arduino 5V → VCC ленты (если питание небольшое, например 5–10 светодиодов; для длинных лент нужен внешний блок питания 5 В).
- Arduino GND → GND ленты.
- Arduino D6 (например) → DIN.
- Рекомендуется поставить резистор 330–470 Ом в линию данных и конденсатор 1000 мкФ / 6.3 В между +5 В и GND для защиты.
Скетч для управления WS2812
Для работы используется библиотека Adafruit NeoPixel.
Установить можно через Arduino IDE → Sketch → Include Library → Manage Libraries… → "Adafruit NeoPixel".
Пример кода:
#include <Adafruit_NeoPixel.h>
#define PIN 6 // пин Arduino для данных
#define NUMPIXELS 8 // количество светодиодов в ленте
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
pixels.begin(); // инициализация ленты
}
void loop() { // Зажигаем все светодиоды красным поочередно
for (int i = 0; i < NUMPIXELS; i++) {
pixels.setPixelColor(i, pixels.Color(255, 0, 0)); // Красный
pixels.show(); // обновляем
delay(200);
}
// Синий эффект
for (int i = 0; i < NUMPIXELS; i++) {
pixels.setPixelColor(i, pixels.Color(0, 0, 255)); // Синий
}
pixels.show();
delay(1000);
// Зелёный эффект
for (int i = 0; i < NUMPIXELS; i++) {
pixels.setPixelColor(i, pixels.Color(0, 255, 0)); // Зеленый
}
pixels.show();
delay(1000);
}
Как работает код
- NUMPIXELS — указываем число светодиодов.
- pixels.setPixelColor(n, pixels.Color(r,g,b)) — задаём цвет для конкретного светодиода.
- pixels.show() — отправляет данные на ленту.
- Можно делать анимации, переливы, бегущие огни и любые эффекты.
Популярные готовые эффекты
Бегущий огонь:
void theaterChase(uint32_t color, int wait) {
for (int a = 0; a < 10; a++) { // Повторить 10 циклов
for (int b = 0; b < 3; b++) {
strip.clear();
for (int c = b; c < strip.numPixels(); c += 3) {
strip.setPixelColor(c, color);
}
strip.show();
delay(wait);
}
}
}
// Использование:
// theaterChase(strip.Color(127, 127, 127), 100); // Белый бегущий огонь
Радужный эффект:
void rainbow(int wait) {
for (long firstPixelHue = 0; firstPixelHue < 5*65536; firstPixelHue += 256) {
for (int i = 0; i < strip.numPixels(); i++) {
int pixelHue = firstPixelHue + (i * 65536L / strip.numPixels());
strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue)));
}
strip.show();
delay(wait);
}
}
Плавное затухание цвета:
void fadeInOut(uint8_t r, uint8_t g, uint8_t b, int steps, int delayTime) {
for (int i = 0; i <= steps; i++) {
uint8_t brightness = map(i, 0, steps, 0, 255);
strip.fill(strip.Color(
(r * brightness) / 255,
(g * brightness) / 255,
(b * brightness) / 255
));
strip.show();
delay(delayTime);
}
for (int i = steps; i >= 0; i--) {
uint8_t brightness = map(i, 0, steps, 0, 255);
strip.fill(strip.Color(
(r * brightness) / 255,
(g * brightness) / 255,
(b * brightness) / 255 ));
strip.show();
delay(delayTime);
}
}
Цветовые функции
// Создание цвета из отдельных компонентов
uint32_t red = strip.Color(255, 0, 0);
uint32_t green = strip.Color(0, 255, 0);
uint32_t blue = strip.Color(0, 0, 255);
// Создание цвета из HSV (оттенок, насыщенность, значение)
uint32_t colorHSV = strip.ColorHSV(21845, 255, 255); // Синий цвет
uint32_t colorGamma = strip.gamma32(colorHSV); // С коррекцией гаммы
Краткая шпаргалка:
Команда | Описание |
strip.begin() | Инициализация ленты |
strip.show() | Отправка данных на ленту |
strip.setPixelColor(n, r, g, b) | Установка цвета диода n |
strip.fill(color) | Заполнение всей ленты цветом |
strip.clear() | Выключение всех диодов |
strip.setBrightness() | Установка яркости (0-255) |
strip.numPixels() | Количество светодиодов |
strip.Color(r, g, b) | Создание цвета |
strip.ColorHSV(h, s, v) | Создание цвета из HSV |