Дата публикации
Обновлено
Свет в шкафу или витрине: датчик двери, светодиодная лента и задержка выключения
Подсветку шкафа, витрины или ниши можно сделать так, чтобы она включалась при открытии двери и выключалась с задержкой. Разбираем датчик двери, светодиодную ленту, MOSFET, питание 12 В, ручной режим и ошибки подключения.
Когда свет должен включаться сам
Автоматическая подсветка удобна в шкафу, витрине, гардеробной, нише или небольшом техническом отсеке. Дверь открывается – свет включается. После закрытия лента продолжает работать несколько секунд, а затем плавно гаснет.
Для простого варианта механический выключатель можно установить непосредственно в цепь питания ленты. Но контроллер дает больше возможностей:
- задержку выключения;
- плавное изменение яркости;
- ручной режим;
- защиту от ложных срабатываний;
- сервисное включение;
- ночную яркость;
- несколько датчиков дверей.
Система состоит из четырех основных частей:
- Датчик определяет состояние двери.
- Arduino или ESP32 обрабатывает сигнал.
- MOSFET коммутирует ток светодиодной ленты.
- Блок питания и DC-DC преобразователь питают всю систему.
В этой статье рассматривается обычная одноцветная светодиодная лента на 12 В. Для RGB-ленты потребуется три силовых канала, для RGBW – четыре. Адресные ленты WS2812B и похожие модели подключаются и управляются по другой схеме.
Arduino подходит для полностью автономной подсветки без беспроводных функций. ESP32 стоит выбирать, если в дальнейшем планируется управление через Wi-Fi, Bluetooth, веб-интерфейс или систему домашней автоматизации.
Датчик двери: геркон, концевик или датчик Холла
Для определения положения двери можно использовать геркон, механический концевик, датчик Холла или готовый модуль открытия.
| Датчик | Преимущества | Ограничения |
|---|---|---|
| Геркон с магнитом | Не требует нажатия, простой монтаж, не потребляет ток | Нужно правильно расположить магнит |
| Механический концевик | Понятная работа, легко проверить мультиметром | Изнашивается и требует точной установки |
| Датчик Холла | Нет механических контактов, подходит для частого срабатывания | Требует питания |
| Готовый модуль | Удобные контакты и иногда встроенная индикация | Нужно проверить напряжение и тип выхода |
Для шкафа чаще всего удобен геркон. Магнит устанавливается на дверцу, а сам датчик – на неподвижную часть корпуса. При закрытии двери магнит приближается к геркону и изменяет состояние его контактов.
Обозначения NO и NC относятся к состоянию контакта без воздействия магнита. Однако в готовых датчиках открытия маркировка может трактоваться иначе, поэтому перед монтажом датчик лучше проверить мультиметром.
Подробно устройство контакта разобрано в статье Принцип работы геркона. Бесконтактная альтернатива описана в статье Датчики Холла – виды и подключение.
Для простой схемы один вывод геркона подключается к GPIO, второй – к GND, а вход настраивается как INPUT_PULLUP. В таком варианте:
- замкнутый контакт дает LOW;
- разомкнутый контакт дает HIGH;
- обрыв провода также воспринимается как открытая дверь, поэтому свет останется включенным.
Если датчик соединен длинным проводом, внутренней подтяжки может быть недостаточно. Тогда устанавливают внешний резистор 4,7-10 кОм, а при сильных помехах добавляют небольшой конденсатор возле контроллера.
Принцип подтяжки подробно разобран в статье Pull-up и pull-down резисторы.
Расчет светодиодной ленты и блока питания
Светодиодная лента питается непосредственно от блока питания, а не от Arduino или ESP32. Перед выбором компонентов нужно определить мощность и ток ленты.
Ток рассчитывается по формуле:
I = P / U
где P – мощность ленты, U – напряжение питания.
Для ленты на 12 В расчет выглядит следующим образом:
| Мощность ленты | Длина | Общая мощность | Расчетный ток |
|---|---|---|---|
| 4,8 Вт/м | 1 м | 4,8 Вт | 0,4 А |
| 4,8 Вт/м | 2 м | 9,6 Вт | 0,8 А |
| 9,6 Вт/м | 1 м | 9,6 Вт | 0,8 А |
| 9,6 Вт/м | 2 м | 19,2 Вт | 1,6 А |
| 14,4 Вт/м | 1 м | 14,4 Вт | 1,2 А |
| 14,4 Вт/м | 2 м | 28,8 Вт | 2,4 А |
К полученному току добавляют потребление контроллера, DC-DC преобразователя и других модулей. Блок питания обычно выбирают с запасом около 20-30%, чтобы он не работал постоянно на пределе.
Например, два метра ленты мощностью 9,6 Вт/м потребляют около 1,6 А. Вместе с контроллером и запасом разумно использовать блок питания 12 В на 2,5-3 А.
Мощность, указанная на ленте, может отличаться от реального потребления. После сборки желательно измерить ток при максимальной яркости.
MOSFET как ключ для светодиодной ленты
Для одноцветной ленты на 12 В удобно использовать N-канальный MOSFET в схеме управления по минусу.
Подключение выглядит так:
- плюс блока питания 12 В идет непосредственно на плюс ленты;
- минус ленты подключается к стоку MOSFET;
- исток MOSFET подключается к GND;
- GPIO соединяется с затвором через резистор 100-330 Ом;
- между затвором и GND устанавливается резистор 10 кОм;
- GND блока питания, контроллера и MOSFET соединяются.
Резистор в цепи затвора ограничивает импульсный ток при переключении. Резистор 10 кОм удерживает MOSFET закрытым, пока контроллер запускается или GPIO находится в неопределенном состоянии.
При выборе транзистора нельзя ориентироваться только на параметр VGS(th). Это напряжение, при котором MOSFET только начинает проводить небольшой ток. Для светодиодной ленты нужно проверить, при каком напряжении затвора производитель нормирует сопротивление RDS(on).
Для ESP32 желательно выбирать MOSFET, у которого низкое RDS(on) указано при VGS 2,5 или 3,3 В. Для классической Arduino подходят модели, рассчитанные на управление от 4,5-5 В.
| Параметр MOSFET | Что проверить |
|---|---|
| VDS | Должно быть выше напряжения ленты с запасом |
| ID | Выше максимального тока нагрузки |
| RDS(on) | Указано при реальном напряжении GPIO |
| Корпус | Способен рассеивать рассчитанное тепло |
| Напряжение управления | 3,3 В для ESP32 или 5 В для Arduino |
Потери на открытом транзисторе приблизительно рассчитываются так:
P = I² × RDS(on)
Для быстрой сборки можно использовать готовый электронный MOSFET-ключ, рассчитанный на напряжение и ток ленты.
Подробный принцип подключения нагрузки разобран в статье Транзисторный ключ для нагрузки.
Задержка выключения после закрытия двери
Если выключать свет сразу после закрытия двери, небольшой люфт или кратковременное срабатывание датчика вызовет мигание. Задержка делает работу подсветки спокойнее.
Логика может быть следующей:
| Событие | Действие |
|---|---|
| Дверь открылась | Свет включается, таймер выключения отменяется |
| Дверь закрылась | Запоминается время закрытия |
| Задержка еще не закончилась | Свет продолжает работать |
| Дверь снова открылась | Таймер сбрасывается |
| Задержка закончилась | Свет плавно выключается |
В программе задержку лучше реализовать через millis(), а не через delay(). Функция delay() останавливает выполнение программы, поэтому контроллер в это время не сможет нормально обрабатывать кнопку, повторное открытие двери или другие события.
При использовании millis() программа продолжает работать. Контроллер только сравнивает текущее время с моментом закрытия двери.
Для шкафа обычно достаточно задержки 3-15 секунд. Для витрины или технического отсека можно установить более продолжительный интервал.
Дребезг самого датчика также нужно обрабатывать отдельно. Для геркона или концевика обычно достаточно программного фильтра 20-50 мс. Задержка выключения на несколько секунд не заменяет антидребезг, потому что это разные задачи.
Ручной режим для витрины или обслуживания
Автоматический режим удобен для шкафа, но в витрине или техническом отсеке свет иногда требуется оставить включенным независимо от двери.
Можно предусмотреть несколько режимов:
| Режим | Поведение |
|---|---|
| Автоматический | Свет управляется датчиком двери |
| Постоянно включен | Состояние двери игнорируется |
| Выключен | Лента не включается при открытии |
| Сервисный | Свет включается на заданное время |
Самый понятный вариант – трехпозиционный переключатель AUTO-OFF-ON. Его состояние видно без дисплея и не нужно запоминать после перезагрузки.
Для компактной панели можно использовать одну кнопку:
- короткое нажатие переключает автоматический и ручной режим;
- длительное нажатие полностью выключает подсветку;
- повторное нажатие возвращает автоматический режим.
При использовании кнопки необходимо обработать дребезг и фиксировать событие нажатия только один раз. Это подробно разобрано в статье Кнопка в Arduino и ESP32.
Для простой системы необязательно сохранять ручной режим во Flash-памяти. После отключения питания безопаснее вернуться в автоматический режим и заново прочитать состояние двери.
Питание 12 В для ленты и 5 В для контроллера
Удобнее всего питать систему от одного блока 12 В. Светодиодная лента подключается к нему напрямую, а для Arduino или ESP32 используется понижающий DC-DC преобразователь.
Схема питания:
- блок 12 В питает светодиодную ленту;
- отдельная ветвь 12 В идет на вход DC-DC;
- преобразователь формирует 5 В для платы Arduino или входа 5V совместимой платы ESP32;
- все земли соединяются в общей точке;
- MOSFET коммутирует только минус ленты.
| Узел | Питание |
|---|---|
| Светодиодная лента | 12 В от основного блока |
| Arduino Nano или Uno | 5 В от DC-DC |
| Отладочная плата ESP32 | 5 В на разрешенный вход платы |
| GPIO ESP32 | Логика 3,3 В |
| Геркон или концевик | Через вход контроллера с подтяжкой |
В линию питания ленты желательно установить предохранитель. Его номинал выбирают немного выше нормального рабочего тока, но ниже допустимого тока проводов и компонентов.
Для длинной ленты питание подают отдельными проводами достаточного сечения. Если яркость заметно уменьшается к концу, питание подключают с двух сторон или в нескольких точках.
Контроллер и ленту не следует последовательно питать через тонкие дорожки одного небольшого модуля. Им лучше сделать отдельные ветви от блока питания или распределительной точки.
Если при включении ленты ESP32 перезагружается, нужно проверить напряжение непосредственно возле платы, качество DC-DC, соединение GND и сечение проводов.
Выбор запаса подробно разобран в статье Почему блок питания греется.
Мягкое включение и настройка яркости
Плавное включение выполняется с помощью ШИМ. Контроллер быстро включает и выключает MOSFET, изменяя коэффициент заполнения импульсов. Светодиоды воспринимают это как изменение средней яркости.
Для шкафа не всегда требуется максимальная яркость. Белые стенки хорошо отражают свет, поэтому лента мощностью 14,4 Вт/м может оказаться слишком яркой.
| Настройка | Результат |
|---|---|
| Низкая яркость | Ночной режим и мягкий свет |
| Средняя яркость | Обычная подсветка шкафа |
| Максимальная яркость | Витрина или технический отсек |
| Плавное нарастание | Комфортное включение без резкой вспышки |
| Плавное снижение | Аккуратное выключение после задержки |
Для Arduino используется PWM-совместимый вывод и функция analogWrite(). В актуальном Arduino-ESP32 3.x можно использовать ledcAttach() и ledcWrite().
Частота должна быть достаточно высокой, чтобы мерцание не было заметно. Для ESP32 удобно выбрать несколько килогерц. При использовании камеры или видеосъемке частоту иногда приходится подбирать отдельно, чтобы избежать полос на изображении.
Подробно частота, разрешение и коэффициент заполнения разобраны в статье ШИМ-сигнал простыми словами.
Безопасное состояние после включения питания
После подачи питания контроллеру требуется время для запуска. До выполнения setup() состояние некоторых GPIO может быть неопределенным или зависеть от загрузочной логики платы.
Чтобы лента не вспыхивала при включении:
- между затвором MOSFET и GND устанавливают резистор 10 кОм;
- выбирают GPIO, который не используется для загрузочного режима;
- в начале setup() настраивают выход и сразу задают нулевую яркость;
- состояние датчика считывают только после настройки входа;
- ручной режим после старта переводят в заранее определенное состояние.
Если дверь при включении питания закрыта, лента должна оставаться выключенной. Если дверь открыта, свет можно включить после запуска программы.
Для простой системы ручной режим лучше не восстанавливать автоматически. После перезагрузки устройство возвращается в автоматический режим, считывает датчик и принимает решение по текущему состоянию двери.
Если режим все же сохраняется в памяти, нужно предусмотреть защиту от поврежденных данных и ограничить количество записей.
Монтаж и проверка в шкафу или витрине
Сначала систему собирают и проверяют на столе, затем устанавливают в корпус. После монтажа расстояния, температура и длина проводов меняются, поэтому окончательная проверка обязательна.
Светодиодную ленту желательно установить в алюминиевый профиль. Он выполняет сразу несколько задач:
- отводит тепло;
- защищает ленту от повреждений;
- выравнивает линию света;
- удерживает рассеиватель;
- упрощает крепление.
Датчик устанавливают так, чтобы дверь имела уверенные состояния «открыта» и «закрыта». Магнит не должен находиться на границе срабатывания геркона.
Проверить нужно следующие сценарии:
- дверь открывается медленно и быстро;
- дверь закрывается не до конца;
- дверь несколько раз открывается во время задержки;
- ручной режим включается и выключается;
- питание пропадает при открытой и закрытой двери;
- лента работает на максимальной яркости;
- контроллер не перезагружается;
- MOSFET, провода и разъемы не перегреваются;
- предохранитель и блок питания доступны для обслуживания.
Длинную ленту проверяют в течение 15-30 минут на максимальной яркости. Температуру MOSFET, проводов, клемм и профиля оценивают после выхода системы на рабочий режим.
Типичные ошибки автоматической подсветки
| Ошибка | Что происходит | Как исправить |
|---|---|---|
| Лента подключена к GPIO | Риск повреждения контроллера | Использовать MOSFET или готовый ключ |
| Нет общего GND | MOSFET не управляется стабильно | Соединить земли низковольтной схемы |
| Нет резистора затвора | Импульсная нагрузка на GPIO | Установить 100-330 Ом |
| Нет подтяжки затвора | Лента вспыхивает при запуске | Установить 10 кОм между Gate и GND |
| Выбор MOSFET только по VGS(th) | Транзистор греется | Проверить RDS(on) при 3,3 или 5 В |
| Датчик без подтяжки | Ложные срабатывания | Использовать INPUT_PULLUP или внешний резистор |
| Используется delay() | Кнопка и дверь не обрабатываются | Перейти на таймер через millis() |
| Слабый блок питания | Просадки и перезагрузки | Рассчитать ток и добавить запас |
| Тонкие провода | Падение яркости и нагрев | Использовать подходящее сечение |
| Нет предохранителя | Проводка не защищена при КЗ | Установить предохранитель в линии 12 В |
| Лента без профиля | Перегрев и неровный свет | Использовать алюминиевый профиль |
| Питание подано только с одного конца длинной ленты | Конец светит слабее | Добавить точки подачи питания |
| Перепутана логика геркона | Свет работает наоборот | Проверить контакт мультиметром |
| Не проверен запуск платы | Лента случайно включается | Добавить аппаратную подтяжку и проверить GPIO |
Большинство неисправностей можно найти обычным мультиметром. Сначала проверяют 12 В возле ленты, затем питание контроллера, состояние GPIO датчика и напряжение между затвором и истоком MOSFET.
Если MOSFET сильно греется, нужно проверить управляющее напряжение, распиновку, ток ленты и сопротивление открытого канала. Увеличение радиатора не исправит транзистор, который не открывается полностью.
Минимальная схема и готовый код
Для базовой системы понадобятся:
- Arduino Nano или ESP32;
- одноцветная лента 12 В;
- N-канальный logic-level MOSFET;
- резистор затвора 100-330 Ом;
- резистор Gate-GND 10 кОм;
- геркон с магнитом;
- кнопка ручного режима;
- блок питания 12 В;
- понижающий DC-DC преобразователь;
- предохранитель.
Контакт геркона подключается между входом и GND. Код рассчитан на вариант, в котором при закрытой двери контакт замкнут и GPIO читает LOW. При открытой двери вход становится HIGH.
Для Arduino используются выводы D4, D2 и D9. Для ESP32 – GPIO26, GPIO27 и GPIO25. Код поддерживает Arduino и актуальный Arduino-ESP32 3.x.
#if defined(ARDUINO_ARCH_ESP32)
const uint8_t DOOR_PIN = 26;
const uint8_t BUTTON_PIN = 27;
const uint8_t LED_PIN = 25;
#else
const uint8_t DOOR_PIN = 4;
const uint8_t BUTTON_PIN = 2;
const uint8_t LED_PIN = 9;
#endif
const unsigned long OFF_DELAY = 10000;
const unsigned long DEBOUNCE = 40;
const unsigned long FADE_INTERVAL = 8;
const uint8_t MAX_BRIGHTNESS = 200;
bool doorRaw;
bool doorOpen;
bool buttonRaw = HIGH;
bool buttonStable = HIGH;
bool manualOn = false;
bool delayActive = false;
unsigned long doorChangedAt = 0;
unsigned long buttonChangedAt = 0;
unsigned long closedAt = 0;
unsigned long fadeAt = 0;
uint8_t brightness = 0;
uint8_t targetBrightness = 0;
void writeBrightness(uint8_t value) {
#if defined(ARDUINO_ARCH_ESP32)
ledcWrite(LED_PIN, value);
#else
analogWrite(LED_PIN, value);
#endif
}
void setup() {
pinMode(DOOR_PIN, INPUT_PULLUP);
pinMode(BUTTON_PIN, INPUT_PULLUP);
#if defined(ARDUINO_ARCH_ESP32)
ledcAttach(LED_PIN, 5000, 8);
#else
pinMode(LED_PIN, OUTPUT);
#endif
writeBrightness(0);
doorRaw = digitalRead(DOOR_PIN) == HIGH;
doorOpen = doorRaw;
}
void loop() {
const unsigned long now = millis();
const bool newDoorRaw = digitalRead(DOOR_PIN) == HIGH;
if (newDoorRaw != doorRaw) {
doorRaw = newDoorRaw;
doorChangedAt = now;
}
if (now - doorChangedAt >= DEBOUNCE && doorOpen != doorRaw) {
doorOpen = doorRaw;
if (doorOpen) {
delayActive = false;
} else {
closedAt = now;
delayActive = true;
}
}
const bool newButtonRaw = digitalRead(BUTTON_PIN);
if (newButtonRaw != buttonRaw) {
buttonRaw = newButtonRaw;
buttonChangedAt = now;
}
if (now - buttonChangedAt >= DEBOUNCE &&
buttonStable != buttonRaw) {
buttonStable = buttonRaw;
if (buttonStable == LOW) {
manualOn = !manualOn;
}
}
if (delayActive && now - closedAt >= OFF_DELAY) {
delayActive = false;
}
const bool autoLight = doorOpen || delayActive;
targetBrightness =
(manualOn || autoLight) ? MAX_BRIGHTNESS : 0;
if (now - fadeAt >= FADE_INTERVAL) {
fadeAt = now;
if (brightness < targetBrightness) {
brightness++;
} else if (brightness > targetBrightness) {
brightness--;
}
writeBrightness(brightness);
}
}
Короткое нажатие кнопки включает или отключает постоянный ручной режим

Комментарии (0)