Дата публикации

Обновлено

Автор статьи: Редакция Clex.kz

137

Свет в шкафу или витрине: датчик двери, светодиодная лента и задержка выключения

Подсветку шкафа, витрины или ниши можно сделать так, чтобы она включалась при открытии двери и выключалась с задержкой. Разбираем датчик двери, светодиодную ленту, MOSFET, питание 12 В, ручной режим и ошибки подключения.

Не нашли ответ?Опишите свою ситуацию и задайте отдельный вопрос.Задать вопрос

Когда свет должен включаться сам

Автоматическая подсветка удобна в шкафу, витрине, гардеробной, нише или небольшом техническом отсеке. Дверь открывается – свет включается. После закрытия лента продолжает работать несколько секунд, а затем плавно гаснет.

Для простого варианта механический выключатель можно установить непосредственно в цепь питания ленты. Но контроллер дает больше возможностей:

  • задержку выключения;
  • плавное изменение яркости;
  • ручной режим;
  • защиту от ложных срабатываний;
  • сервисное включение;
  • ночную яркость;
  • несколько датчиков дверей.

Система состоит из четырех основных частей:

  1. Датчик определяет состояние двери.
  2. Arduino или ESP32 обрабатывает сигнал.
  3. MOSFET коммутирует ток светодиодной ленты.
  4. Блок питания и 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 или Uno5 В от DC-DC
Отладочная плата ESP325 В на разрешенный вход платы
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 или готовый ключ
Нет общего GNDMOSFET не управляется стабильноСоединить земли низковольтной схемы
Нет резистора затвораИмпульсная нагрузка на 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); } }

Короткое нажатие кнопки включает или отключает постоянный ручной режим

Свет в шкафу или витрине: датчик двери, светодиодная лента и задержка выключения
Не нашли ответ?Опишите свою ситуацию и задайте отдельный вопрос.Задать вопрос

Связанные категории

Email не публикуется и используется только для уведомления о модерации. Ссылки в комментариях запрещены. Перед размещением убедитесь, что комментарий не содержит оскорблений.

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