Базовые схемы подключения: 'сухой контакт' и датчики с выходом напряжения
Введение в схемы подключения датчиков
В системах автоматизации контроллер принимает решения на основе данных, поступающих от датчиков. Способ, которым датчик передает информацию, определяет схему его физического подключения и логику обработки сигнала. В этом уроке мы рассмотрим два фундаментальных и наиболее распространенных типа сигналов: дискретный сигнал от "сухого контакта" и аналоговый сигнал от датчика с выходом напряжения. Понимание их различий — ключ к правильному проектированию и безошибочному монтажу системы.
Ключевые понятия
📋 Ключевые понятия:
- Сухой контакт (Dry Contact): Это тип сигнального выхода устройства (например, кнопки или реле), который представляет собой простую пару контактов, способных замыкаться или размыкаться. Ключевая особенность в том, что сам датчик не подает никакого напряжения или тока в сигнальную цепь — он "сухой". Он работает как простой выключатель, а распознавание его состояния (замкнут или разомкнут) является задачей контроллера.
- Датчик с выходом напряжения (Voltage Output Sensor): Это активное устройство, которое для своей работы требует внешнего питания. В ответ на измеряемую физическую величину (температуру, освещенность, влажность) датчик генерирует на своем сигнальном выходе напряжение, уровень которого пропорционален этой величине.
Области применения и сравнение
"Сухие контакты" являются стандартом де-факто для передачи бинарных, или двухуровневых, состояний. Их можно найти повсеместно:- Кнопки и выключатели: Каждое нажатие замыкает или размыкает цепь.
- Датчики открытия (герконы): Магнит на двери или окне управляет контактом, сигнализируя о состоянии "открыто" или "закрыто".
- Выходы реле: Промежуточные или силовые реле могут иметь дополнительные "сухие контакты" для передачи своего состояния в систему мониторинга.
- Выходы охранных датчиков и датчиков протечки: Большинство датчиков движения, дыма или протечки имеют релейный выход типа "сухой контакт", который замыкается или размыкается при срабатывании.
- Датчики освещенности: Выдают напряжение, пропорциональное количеству света (например, 0В в темноте, 10В при ярком солнце).
- Датчики температуры и влажности: Формируют напряжение, которое можно преобразовать в градусы Цельсия или проценты относительной влажности.
- Датчики давления или уровня CO2: Позволяют количественно оценить параметр среды.
Сравним эти два типа сигналов в таблице:
| Характеристика | "Сухой контакт" | Датчик с выходом напряжения |
| ----------------------- | ------------------------------------------------ | -------------------------------------------------- |
| Тип сигнала | Дискретный (бинарный) | Аналоговый (непрерывный) |
| Передаваемая информация | Два состояния: "включено/выключено", "замкнуто/разомкнуто" | Диапазон значений, пропорциональный измеряемой величине |
| Питание датчика | Не требуется (пассивный) | Требуется внешнее питание (активный) |
| Вход контроллера | Цифровой вход (DI) | Аналоговый вход (AI) |
| Пример задачи | "Включить свет, если дверь открыта" | "Поддерживать освещенность в комнате на уровне 500 люкс" |
Выбор между этими типами датчиков и, соответственно, входами контроллера полностью зависит от решаемой задачи автоматизации.
---
Схема "Сухой контакт": подключение к цифровым входам (DI)
Подключение датчиков типа "сухой контакт" — одна из самых базовых и частых операций при монтаже системы автоматизации. Схема подключения предельно проста, но требует понимания принципа работы цифровых входов контроллера.
> ⚠️ Внимание: Категорически запрещается подавать любое внешнее напряжение на входы контроллера, сконфигурированные для работы с "сухими контактами". Универсальные входы (UI) контроллера HI в режиме DI самостоятельно формируют необходимое сигнальное напряжение с помощью внутреннего подтягивающего резистора. Подача внешнего напряжения (например, 24В или 230В) на эти клеммы приведет к необратимому повреждению входного каскада контроллера.
Практическая схема подключения
Для подключения "сухого контакта" используются две клеммы контроллера: один из универсальных входов (например, `UI-01`) и клемма общей земли (`GND`).
- Устройство: Кнопка без фиксации или геркон на окне.
- Задача: Зарегистрировать факт нажатия кнопки или открытия окна.
//======== WIRING-DI-001: Подключение настенной кнопки ========
(Устройство: Кнопка) [Контроллер: HI-Core]
+-------+
Контакт 1 --| |----(провод 1)-----> Клемма UI-01
| |
Контакт 2 --| |----(провод 2)-----> Клемма GND
+-------+
Роль внутреннего подтягивающего резистора
Как мы рассматривали в уроке `COURSE-04-M01-L03`, посвященном моделям получения данных, цифровой вход должен иметь четко определенное состояние в любой момент времени. Когда контакты нашего датчика разомкнуты, вход `UI-01` ни к чему не подключен и его состояние неопределенно ("плавающий вход").
Чтобы решить эту проблему, контроллер HI при конфигурации входа в режим DI автоматически задействует внутренний подтягивающий резистор (pull-up resistor).
Таким образом, контроллер надежно определяет оба состояния, используя для этого всего два провода до датчика.
Конфигурация входа
Перед физическим подключением или после него необходимо настроить соответствующий универсальный вход в веб-интерфейсе контроллера:
Теперь контроллер готов принимать и обрабатывать дискретные сигналы от вашего датчика.
---
Обработка событий от "сухого контакта" в Node-RED
После физического подключения и настройки входа, нам необходимо обработать поступающие от него сигналы в среде Node-RED для запуска сценариев автоматизации.
Для работы с цифровыми входами контроллера HI используется специальный узел `hi-di` (или его аналог, например `rpi-gpio in` в базовой конфигурации).
Получение состояния
Узел `hi-di` настраивается на конкретный номер входа (например, UI-01). Он автоматически отслеживает его состояние и отправляет сообщение `msg` каждый раз, когда оно меняется.
ASCII-схема простого потока:[hi-di: "Кнопка в гостиной"] --- (событие) ---> [debug: "Состояние кнопки"]
- Узел `hi-di`: Настроен на "Вход 1".
- Когда кнопка нажимается (контакт замыкается), узел отправляет сообщение.
- Когда кнопка отпускается (контакт размыкается), узел отправляет другое сообщение.
Структура сообщения, как правило, очень проста. Для нашего примера с подтягивающим резистором (pull-up):
- При замыкании контакта на GND:
{
"payload": true,
"topic": "DI-01"
}
- При размыкании контакта:
{
"payload": false,
"topic": "DI-01"
}
Проблема "дребезга контактов"
При использовании механических кнопок и реле возникает физическое явление, известное как дребезг контактов (contact bounce). В момент замыкания или размыкания металлические контакты из-за упругости несколько раз соударяются друг с другом в течение нескольких миллисекунд, прежде чем зафиксировать стабильное положение.
Для контроллера это выглядит как сверхбыстрая серия событий: `true`, `false`, `true`, `false`, `true`... вместо одного чистого `true`. Если на это событие завязан сценарий-триггер (например, "переключить состояние света по нажатию"), дребезг вызовет многократное срабатывание сценария, и итоговое состояние света будет непредсказуемым.
Решение: Фильтрация с помощью узла `rbe`
Для борьбы с дребезгом и для фильтрации любых повторяющихся значений предназначен узел `rbe` (Report by Exception). Он пропускает сообщение дальше по потоку только в том случае, если его `msg.payload` отличается от `msg.payload` предыдущего сообщения.
Усовершенствованная схема с подавлением дребезга:[hi-di: "Кнопка в гостиной"] ---> [rbe] ---> [debug: "Чистое событие"]
* Первое `true` проходит через `rbe`, так как предыдущее состояние было `false`.
* Следующее `false` (от дребезга) проходит, так как оно отличается от `true`.
* Следующее `true` (от дребезга) проходит, так как оно отличается от `false`.
Проблема не решена полностью!
Более надежный способ — использовать узел `trigger` или `delay` в режиме "rate limit".
Схема с `delay`:
[hi-di: "Кнопка"] --(true/false)--> [delay: 50ms] --(только последнее)--> [rbe] --(чистое событие)--> [Дальнейшая логика]
* Узел `delay`: Настраивается в режим `Rate Limit` (ограничение частоты), чтобы пропускать только 1 сообщение за `50` миллисекунд. Он отбросит всю "пачку" сообщений от дребезга и пропустит только самое последнее.
* Узел `rbe`: После `delay` он нужен, чтобы, например, при удержании кнопки не генерировались постоянно сообщения `true`. Он пропустит только первое `true` и будет ждать, пока не придет `false`.
Этот простой паттерн является обязательным при обработке сигналов от любых механических контактов.
---
Датчики с выходом напряжения: подключение к аналоговым входам (AI)
Датчики с выходным напряжением — это сердце систем, регулирующих параметры среды. В отличие от "сухих контактов", они требуют питания и подключаются к аналоговым входам (AI) контроллера, способным измерять уровень напряжения.
Стандартные диапазоны и примеры
Универсальные входы контроллера HI поддерживают стандартные промышленные диапазоны напряжения, чаще всего 0-10В. Это означает, что они могут измерять любое напряжение в этом диапазоне с определенной точностью.
Примеры датчиков:
- Датчик освещенности: 0В (полная темнота) - 10В (яркое солнце).
- Датчик температуры: 0В (-50°C) - 10В (+150°C).
- Датчик уровня CO2: 0В (400 ppm) - 10В (2000 ppm).
Схема подключения (3-проводной датчик)
Большинство таких датчиков имеют три вывода:
- `V+` или `Vcc`: Вход питания (например, 24В DC).
- `GND`: Общая земля (минус питания).
- `Vout` или `Signal`: Сигнальный выход (0-10В).
//======== WIRING-AI-001: Подключение датчика освещенности 0-10В ========
[Блок питания: 24V DC] (Датчик) [Контроллер: HI-Core]
+24V -----------------> V+
GND -----------------+-> GND
|
|
(Сигнальный провод) <----+-- Vout -------------> Клемма AI-02
|
(Подключение общего GND) <--+----------------------> Клемма AI_GND (или GND)
> ℹ️ Информация: Критически важным является подключение вывода `GND` блока питания датчика к клемме `GND` аналогового входа контроллера. Без этого общего опорного уровня контроллер не сможет корректно измерить напряжение на сигнальном выходе датчика, и показания будут неверными или хаотичными.
Конфигурация входа
В веб-интерфейсе контроллера необходимо сконфигурировать соответствующий универсальный вход:
Теперь контроллер будет периодически измерять напряжение на этом входе и предоставлять его значение для использования в Node-RED.
---
Нормализация аналогового сигнала в Node-RED
Аналоговый вход отдает нам "сырое" значение в вольтах. Это техническая величина, малопонятная для пользователя и неудобная для логики верхнего уровня. Задача нормализации — преобразовать это напряжение в осмысленную физическую величину (люксы, проценты, градусы).
> 💡 Подсказка: Для передачи нормализованных значений в другие системы (например, в SCADA или мобильное приложение) через MQTT, используйте стандартизированные топики и числовые форматы без лишних текстовых обозначений (не '55 %', а просто `55`). Это упрощает дальнейшую обработку и визуализацию данных на принимающей стороне.
Получение сырого значения
Для чтения данных с аналогового входа используется узел `hi-ai`. Он настраивается на нужный вход и с заданной периодичностью отправляет измеренное напряжение.
Пример потока:[hi-ai: "Датчик света"] ---(событие)---> [debug: "Сырое напряжение"]
Сообщение от узла `hi-ai` будет выглядеть так:
{
"payload": 5.34,
"topic": "AI-02"
}
Это означает, что на входе `AI-02` сейчас напряжение 5.34В.
Масштабирование с помощью узла `range`
Для линейного преобразования диапазонов в Node-RED идеально подходит узел `range`. Он принимает на вход значение из одного диапазона и пропорционально масштабирует его в другой.
Пример задачи:У нас есть датчик освещенности с характеристикой: 0В = 0 люкс, 10В = 1000 люкс. Нам нужно преобразовать входящее напряжение в люксы.
Схема потока нормализации:[hi-ai: "Датчик света"] ---> [range: "Вольты в Люксы"] ---> [debug: "Освещенность"]
Настройка узла `range`:
- Действие (Action): `Масштабировать (Scale)`
- Входной диапазон (Input range):`0` – `10` (это наши вольты)
- Выходной диапазон (Result range): `0` – `1000` (это наши люксы)
Теперь, когда на вход узла `range` придет `msg` с `payload: 5.34`, на выходе мы получим:
{
"payload": 534,
"topic": "AI-02"
}
Чтобы сделать сообщение еще более информативным и соответствующим "Контракту сообщения", можно добавить узел `function` после `range`:
// Получаем нормализованное значение (люксы)
let lux = msg.payload;
// Формируем payload по стандартному контракту
msg.payload = {
value: parseFloat(lux.toFixed(1)),
unit: "lx",
source: "light-sensor-office-ceiling",
ts: Date.now()
};
// Устанавливаем топик для отправки в MQTT
msg.topic = "telemetry/office/room101/illuminance";
return msg;
Этот поток теперь выдает полностью готовые к использованию данные, которые можно отправлять в MQTT, сохранять в базу данных или использовать для управления диммерами освещения.
---
Итоги: когда использовать DI, а когда AI?
Правильный выбор типа входа — это основа для построения логичной и эффективной системы автоматизации. Подведем итоги в виде сводной таблицы.
| Тип сигнала | Примеры датчиков | Вход контроллера | Типовая задача автоматизации |
| ---------------------- | ------------------------------------------------------- | ---------------------- | ----------------------------------------------------------------- |
| Дискретный (On/Off) | Кнопка, геркон, выход датчика движения, датчик протечки | DI ('Сухой контакт') | Включить свет при открытии двери, запустить сценарий по нажатию кнопки, отправить тревожное SMS при протечке |
| Аналоговый (0-10В) | Датчик освещенности, датчик CO₂, датчик влажности, датчик температуры | AI (Выход напряжения) | Поддерживать яркость света на уровне 500 люкс, включить вентиляцию при CO₂ > 800 ppm, регулировать мощность увлажнителя. |
- Используйте цифровые входы (DI) для всех датчиков, которые сообщают о бинарных событиях: произошло/не произошло, открыто/закрыто, есть/нет.
- Используйте аналоговые входы (AI) для датчиков, которые измеряют плавные, непрерывные физические величины, позволяя системе не просто реагировать, а регулировать параметры среды.
Что дальше
Мы рассмотрели базовые схемы подключения для самых распространенных типов датчиков. Однако существует целый класс "умных" датчиков, которые передают данные в цифровом виде по специальным шинам данных.
> 🔗 Связанный материал: В следующем уроке `COURSE-04-M02-L01: Шина 1-Wire: подключение и адресация датчиков температуры` мы разберем, как подключать целые гирлянды датчиков температуры DS18B20 всего к одному входу контроллера, используя цифровой протокол 1-Wire.