Чтение дискретных входов: датчики протечки, открытия, кнопки
Типы дискретных сигналов и их физическое подключение
В основе автоматизации лежит способность контроллера получать информацию от внешнего мира. Один из самых базовых, но критически важных типов информации — это дискретный сигнал. В отличие от аналогового, который может принимать любое значение в заданном диапазоне (например, температура от 0 до 100°C), дискретный сигнал имеет всего два состояния: «включено»/«выключено», «замкнуто»/«разомкнуто», «истина»/«ложь» (1/0).
Основные типы дискретных сигналов
Для подключения к контроллеру HI используются два основных типа беспотенциальных сигналов:
> ⚠️ Внимание: Входы контроллера, настроенные на прием дискретных сигналов, рассчитаны на беспотенциальные контакты. Подача на них внешнего напряжения (например, 12V или 230V) приведет к необратимому повреждению порта.
Типовые датчики и устройства с дискретным выходом
На объектах автоматизации вы столкнетесь со следующим оборудованием:
- Датчики открытия/закрытия (Герконы): Магнитоконтактные извещатели, устанавливаемые на двери и окна. Состоят из двух частей: геркона (герметизированные контакты) и магнита. При приближении магнита контакты замыкаются или размыкаются.
- Датчики протечки воды: Содержат два электрода. При попадании на них воды электрическая цепь между ними замыкается (сопротивление падает), что и фиксируется контроллером.
- Датчики движения (PIR-сенсоры): Большинство профессиональных датчиков движения имеют релейный выход (сухой контакт) для сигнала тревоги.
- Кнопки и выключатели: Классические настенные выключатели (без фиксации) являются простейшим примером устройства с сухим контактом.
Схемы подключения
Подключение всех этих устройств к универсальным входам (UI) контроллера HI принципиально одинаково. Один контакт устройства подключается к сигнальной клемме входа (например, `UI-05`), а второй — к общей земле (`GND`).
- Схема `WIRING-SENS-007`: Подключение датчика открытия двери (геркона)
//======== WIRING-SENS-007: Main Door Contact Sensor ========
// Используется кабель 2x0.5 мм²
(SENS:Door:Main-Door) [CTRL:HI-Core]
Контакт 1 --------- UI-05
Контакт 2 --------- GND
- Схема `WIRING-SENS-011`: Подключение датчика протечки воды
//======== WIRING-SENS-011: Bathroom Leak Sensor ========
// Датчик устанавливается на полу в потенциальном месте утечки
(SENS:Leak:Bathroom) [CTRL:HI-Core]
Электрод 1 --------- UI-06
Электрод 2 --------- GND
Нормально-разомкнутый (NO) vs. Нормально-замкнутый (NC)
Ключевой характеристикой любого дискретного датчика является тип его контактов в «нормальном», неактивном состоянии.
| Тип контакта | Описание | Логика работы | Преимущества и недостатки |
| ------------------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Нормально-разомкнутый (NO) | Normally Open. Контакты разомкнуты, когда датчик не активен. Цепь замыкается при срабатывании. | Дверь закрыта -> контакт разомкнут. Дверь открыта -> контакт замкнут. | Простота: Логика интуитивно понятна. Недостаток: Обрыв кабеля не будет зафиксирован и будет воспринят как нормальное состояние. Идеально для кнопок. |
| Нормально-замкнутый (NC) | Normally Closed. Контакты замкнуты, когда датчик не активен. Цепь размыкается при срабатывании. | Дверь закрыта -> контакт замкнут. Дверь открыта -> контакт разомкнут. | Безопасность: Обрыв кабеля или неисправность датчика приведут к размыканию цепи и будут немедленно зафиксированы как тревога. Стандарт для охранных систем. |
| Переключающий контакт (COM/NO/NC) | Имеет три вывода: общий (COM), NO и NC. Позволяет выбрать нужную логику при подключении. | Позволяет реализовать любую из вышеописанных логик. | Универсальность: Один датчик подходит для разных задач. Используется в большинстве профессиональных датчиков движения и других модулей. |
> 💡 Подсказка: Для систем безопасности (датчики открытия, движения, пожарные извещатели) всегда используйте NC (нормально-замкнутую) логику. Это гарантирует, что система обнаружит не только вторжение, но и попытку саботажа (перерезание провода).
---
Настройка входов и чтение состояния в Node-RED
После физического подключения датчика к клеммам контроллера необходимо настроить соответствующий универсальный вход (UI) и создать поток в Node-RED для обработки его сигналов.
> 🔗 Связанный материал: Конфигурация универсальных входов и детальное описание их режимов работы подробно рассмотрены в уроке `COURSE-06-M07-L01`.
Конфигурация входа
Первым шагом является перевод универсального входа из режима по умолчанию в режим «Дискретный вход» (Digital Input, DI). Это делается через веб-интерфейс контроллера или специальный узел конфигурации в Node-RED. В этом режиме вход активирует внутренний подтягивающий резистор (`pull-up`) и начинает отслеживать замыкание на `GND`.
Использование ноды `hi-input`
Для получения данных с физических портов в нашей платформе используется специализированный узел `hi-input` из палитры `node-red-contrib-hi`.
Теперь, при изменении состояния датчика (например, при открытии двери с герконом), узел `hi-input` будет генерировать новое сообщение.
Структура сообщения и обработка логики
Узел `hi-input` формирует сообщение со стандартной структурой, где `msg.payload` содержит булево значение:
- `true`: вход замкнут на `GND`.
- `false`: вход "подтянут" к питанию (разомкнут).
Рассмотрим, как это соотносится с NO и NC логикой:
| Тип датчика | Состояние объекта | Состояние контакта | `msg.payload` | Интерпретация |
|-------------|-------------------|--------------------|---------------|---------------------------------------------|
| NO | Дверь закрыта | Разомкнут | `false` | Нормальное состояние |
| NO | Дверь открыта | Замкнут | `true` | Тревога |
| NC | Дверь закрыта | Замкнут | `true` | Нормальное состояние |
| NC | Дверь открыта | Разомкнут | `false` | Тревога |
Как видно из таблицы, логика NC-датчика является инвертированной: `false` означает тревогу, а `true` — норму. Для удобства дальнейшей обработки эту логику следует привести к стандартному виду, где `true` всегда означает тревогу или активное состояние.
Пример: Инвертирование логики для NC-датчика протечки
Задача: Датчик протечки с NC-контактом подключен к `UI-06`. При возникновении протечки контакт размыкается, и `hi-input` выдает `false`. Необходимо преобразовать этот сигнал в сообщение о тревоге. Поток (Flow):[hi-input: UI-06] -> [change: Invert Logic] -> [switch: Is Alarm?] -> ...
Настройка узла `change` "Invert Logic":
Этот узел будет инвертировать входящий `payload`.
- Установить `msg.payload`
- в значение `true` если `msg.payload` это `false`
- иначе, установить `msg.payload` в `false`
Более элегантный и семантически верный подход — не просто инвертировать значение, а сразу формировать осмысленное сообщение.
Код для узла `function` "Format Alarm":// Вход: msg.payload от NC-датчика (true = норма, false = тревога)
if (msg.payload === false) {
// Тревога! Контакт разомкнулся.
node.status({ fill: "red", shape: "dot", text: "ALARM: Leak Detected!" });
// Формируем сообщение по "Контракту сообщения"
msg.payload = {
value: true, // Сигнал тревоги
source: "leak-sensor-bathroom",
ts: Date.now(),
meta: {
description: "Обнаружена протечка в ванной комнате"
}
};
msg.topic = "alarms/water_leak/bathroom";
return msg;
} else {
// Нормальное состояние. Можно остановить поток или отправить сообщение "ОК".
node.status({ fill: "green", shape: "dot", text: "OK: No leaks" });
// Для снижения нагрузки на систему, сообщение о нормальном состоянии
// можно не отправлять дальше или отправлять по другой ветке.
return null; // Останавливаем поток, если нас интересуют только тревоги.
}
Этот подход преобразует простое `true`/`false` в богатое информацией событие, готовое для отправки в систему уведомлений, записи в лог или активации исполнительных механизмов (например, закрытия клапана).
---
Фильтрация дребезга и обработка событий от кнопок
ильтрация дребезга и обработка событий от кнопок
При работе с механическими контактами, особенно кнопками, возникает проблема дребезга контактов (contact bounce). В момент нажатия или отпускания кнопки ее контакты вибрируют, создавая не одно, а целую серию очень быстрых замыканий и размыканий в течение нескольких миллисекунд. Для контроллера это выглядит как множество событий `true`/`false`, что может привести к непредсказуемому поведению логики (например, свет будет быстро включаться и выключаться).
> 💡 Подсказка: Комбинация нод `rbe` и `trigger` — стандартный и самый надежный способ обработки нажатий кнопок в Node-RED для избежания ложных срабатываний и реализации сложной логики (короткое/длинное нажатие).
Фильтрация дубликатов с помощью узла `rbe`
Узел `rbe` (Report-by-Exception) служит входным фильтром, который отсекает "шум" дребезга. Он пропускает сообщение дальше только в том случае, если его `msg.payload` изменился по сравнению с предыдущим.
Подробная теория настройки паттернов фильтрации и использования узла `rbe` для очистки данных разобрана в уроке M05-L02 («Фильтрация данных и Debounce»).
В контексте физической кнопки `rbe` критически важен: он гарантирует, что на каждое физическое действие (нажатие или отпускание) система получит ровно один логический сигнал `true` или `false`, игнорируя микро-колебания контактов в момент замыкания.
Реализация логики кнопки: короткое и длинное нажатие
Стандартная задача для умного дома — реализовать разное поведение на короткое и длинное нажатие кнопки. Например, короткое нажатие включает/выключает свет, а длинное — запускает сценарий "Я ухожу". Это реализуется с помощью узла `trigger`.
Поток для обработки кнопки:`[hi-input: Button] -> [rbe] -> [switch: Pressed/Released?] -> [trigger] -> ...`
* Если `msg.payload` === `true`, сообщение идет на вход узла `trigger`.
Если `msg.payload` === `false`, сообщение идет на сброс* узла `trigger`.
* `Send`: `{"payload": "short"}` (отправить это немедленно).
* `then wait for`: `1 second` (подождать 1 секунду).
* `then send`: `{"payload": "long"}` (затем отправить это).
* `Handle "reset" message`: `reset the trigger` (если придет сообщение о сбросе, отменить ожидание).
Как это работает:- Короткое нажатие:
2. `switch` направляет `true` на вход `trigger`.
3. `trigger` немедленно отправляет сообщение `{"payload": "short"}`.
4. Вы отпускаете кнопку (< 1 сек). `hi-input` -> `rbe` отправляет `false`.
5. `switch` направляет `false` на вход сброса `trigger`.
6. `trigger` сбрасывается и отменяет отправку "long" сообщения.
7. Результат: на выходе только одно сообщение — `"short"`.
- Длинное нажатие:
2. `switch` направляет `true` на вход `trigger`.
3. `trigger` немедленно отправляет `"short"`.
4. Вы продолжаете удерживать кнопку > 1 сек.
5. По истечении 1 секунды `trigger` отправляет второе сообщение `{"payload": "long"}`.
6. Вы отпускаете кнопку. `trigger` получает сброс, но это уже не имеет значения.
7. Результат: на выходе два сообщения — сначала `"short"`, затем `"long"`.
Дальнейшая логика строится на обработке этих сообщений с помощью еще одного узла `switch`.
> ℹ️ Информация: Чтобы избежать реакции на короткое нажатие при длинном, можно использовать более сложную конфигурацию `trigger` или добавить узел `gate` (рассмотрен в уроке M05-L04), который будет блокировать сообщение "short", если за ним следует "long".
Итоги: от физического сенсора к надежной автоматизации
Мы прошли полный путь от физического подключения датчика до создания надежной и функциональной логики в Node-RED. Этот процесс можно разбить на четыре ключевых этапа, каждый из которых критически важен для конечного результата.
> ⚠️ Внимание: Никогда не подавайте внешнее напряжение на входы, сконфигурированные как "сухой контакт". Это может привести к выходу из строя порта контроллера. Используйте только беспотенциальные контакты — выходы реле, контакты кнопок, герконов и т.д.
Соблюдение этих принципов позволяет строить системы, которые не только работают корректно в штатных условиях, но и предсказуемо ведут себя при возникновении ошибок или нештатных ситуаций, что является признаком профессионального инжиниринга.
Что дальше
В следующем уроке мы перейдем от простых дискретных сигналов к более сложным — аналоговым. Вы узнаете, как подключать и считывать данные с датчиков, которые передают информацию в виде изменяющегося напряжения (0-10V) или тока (4-20mA), и как калибровать их показания в Node-RED для получения точных физических величин, таких как уровень CO2, освещенность или давление.