Arduino и NeoPixel-оптопары: эффективное управление множеством реле
Компоненты и материалы
| LED-лента WS2812B (NeoPixel) 5В, 300 LED/м, 5050 RGB (кусок на 10 LED, используются 4) | ×1 |
| Резистор 27 кОм (для каждого LDR) | ×4 |
| Фоторезистор (LDR) — 4 шт. | ×4 |
| Релейный модуль 5В (4 канала или 4 отдельных) | ×4 |
| Лампа 230В (для демонстрации) | ×1 |
| Arduino UNO / NodeMCU ESP32 (любая Arduino-совместимая плата) | ×1 |
Инструменты
- Паяльник
- Обычные домашние/мастерские инструменты
Программное обеспечение
- Видео-демонстрация
О проекте
Проект посвящён управлению множеством реле (или других исполнительных механизмов) с одного выходного пина Arduino.
Решение подходит для типовых ситуаций, когда доступных выходных пинов Arduino недостаточно, а нужно управлять несколькими реле параллельно.
Принцип работы: используется LED-лента с NeoPixel (SMD5050 с контроллерами WS2812B). Каждый пиксель соединяется с фоторезистором (LDR), образуя самодельный оптопар. Таким образом создаётся преобразователь «последовательный в параллельный» (из 1 пина — во много).
Каждый отдельный LED адресуется с того же самого пина Arduino. Каждый LDR (в последовательном соединении с резистором 27 кОм) подключён к 5В реле. Таким образом множество комбинаций NeoPixel/LDR можно управлять с одного пина через библиотеку Adafruit NeoPixel. Вместо реле можно подключать другие исполнительные устройства, используя LDR как вход для любой схемы.
В проекте использован ESP32 (NodeMCU), но подойдёт и обычный Arduino Uno (или почти любая другая модель).
Шаг 1: Изготовление NeoPixel-оптопар
Материалы:
- Кусок LED-ленты на 10 WS2812 (отрезан от длинной ленты), используется 4
- Кусок тёмно-серой пены
- Полоска макетной платы
- Чёрный 덕т-tape (изолента)


Важно: расстояние между точками совпадает с расстоянием между LED.
Критически важно изолировать свет каждого LED от чужих LDR, чтобы избежать «оптического переговора» (light cross-talk). На практике это почти невозможно полностью, поэтому яркость LED в состоянии «вкл» установлена программно на низкий уровень.

Лента на 10 LED, но используется только 4 пикселя с 4 LDR (для простоты).
Шаг 2: Электронная схема
На макетной плате использован ESP32s (NodeMCU), но подойдёт любой Arduino.


Только 1 выходной пин управляет 4 реле параллельно. Это число может достигать 300! (столько LED в 5-метровой ленте).
ESP32 работает на 3,3 В (встроенный стабилизатор), а LED-лента 5050 — на 5 В. ESP32 питается от 5 В (USB от адаптера или пауэрбанка). NeoPixel получают 5 В прямо с пина 5V ESP32, реле тоже 5В. В примере 4 оптопары управляют 4 реле, каждое коммутирует лампу 230В.
Выходной пин — GPIO 21, реле управляются через пиксели 1, 2, 3, 4.
Шаг 3: Программное обеспечение
Функция loop() содержит несколько циклов for для демонстрации разных паттернов включения ламп через реле.
Для управления конкретным реле вызывается функция:
void ControlRelais(int RelaisNo, bool RelaisState) {
strip.setPixelColor(RelaisNo, RelaisState*15, RelaisState*15, RelaisState*15);
strip.show();
Serial.print(" RelaisNo ");
Serial.print(RelaisNo);
Serial.print(" = ");
Serial.println(RelaisState);
}
Функция просто включает или выключает конкретный LED. Номер LED соответствует номеру реле. LED светят на низком уровне — достаточно для срабатывания реле через LDR, и это исключает «оптический переговор».
Результат работы показан в видео.
Код
/* Управление множеством реле с одного пина Arduino через самодельные NeoPixel-оптопары
Автор: Pierre Pennings (декабрь 2018)
Лицензия: GPL3+ */
#include
#define NUM_LEDS 10
const int RelaisPin = 21; // GPIO 21 для ESP32
int RelaisNo = 0;
bool RelaisState = false;
int r = 0;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, RelaisPin, NEO_RGB + NEO_KHZ800);
void setup() {
Serial.begin(115200);
pinMode(RelaisPin, OUTPUT);
strip.begin();
for (int t = 0; t < 10; t++) {
strip.setPixelColor(t, 15, 15, 15); // тест всех LED при включении
strip.show();
delay(500);
strip.setPixelColor(t, 0, 0, 0);
}
}
void loop() {
for (int r = 1; r < 5; r++) { // включение реле 1→4
delay(500);
ControlRelais(r, true);
delay(500);
ControlRelais(r, false);
}
for (int k = 4; k > 0; k--) { // включение реле 4→1
delay(500);
ControlRelais(k, true);
delay(500);
ControlRelais(k, false);
}
for (int r = 1; r < 5; r++) { // кросс-паттерны
for (int k = 4; k > 0; k--) {
delay(500);
ControlRelais(r, true);
ControlRelais(k, true);
delay(500);
ControlRelais(r, false);
ControlRelais(k, false);
}
}
}
void ControlRelais(int RelaisNo, bool RelaisState) {
strip.setPixelColor(RelaisNo, RelaisState*15, RelaisState*15, RelaisState*15);
strip.show();
Serial.print(" RelaisNo ");
Serial.print(RelaisNo);
Serial.print(" = ");
Serial.println(RelaisState);
}
Схемы
Файл проекта Fritzing (neopixel_optocoupler_relais.fzz) доступен в разделе Schematics.
Производственный процесс
- Создание аудио-эффектов, управляемых датчиками, с набором Satellite CCRMA
- Панель управления полётным симулятором 2020 на Arduino Nano: LCD и CDI-дисплеи
- Панель переключателей и LED для Microsoft Flight Simulator 2020 на Arduino
- Интерактивный гироскопический LED-дисплей на NeoPixel Ring и Arduino
- Умные шторы: автоматическое управление светом на Arduino с солнечной энергией
- Управление светодиодом по Bluetooth с Arduino: простой DIY-гид
- Простой ИК-датчик препятствий на Arduino: ИК-светодиод и фотодиод
- Управление Roomba Create 2 через Arduino и Android: пошаговое руководство
- Пошаговое руководство: сборка умного четырёхногого робота на Arduino
- Точное управление сервоприводом через MPU6050 (Arduino, SG90, MG996R)