ГлавнаяАкадемияДатчики и входы: нормализация сигналов → Базовые схемы подключения: 'сухой контакт' и датчики с выходом напряжения

Базовые схемы подключения: 'сухой контакт' и датчики с выходом напряжения

Урок 3 · Датчики и входы: нормализация сигналов · 30 мин · theory

Введение в схемы подключения датчиков

В системах автоматизации контроллер принимает решения на основе данных, поступающих от датчиков. Способ, которым датчик передает информацию, определяет схему его физического подключения и логику обработки сигнала. В этом уроке мы рассмотрим два фундаментальных и наиболее распространенных типа сигналов: дискретный сигнал от "сухого контакта" и аналоговый сигнал от датчика с выходом напряжения. Понимание их различий — ключ к правильному проектированию и безошибочному монтажу системы.

Ключевые понятия

📋 Ключевые понятия:

Области применения и сравнение

"Сухие контакты" являются стандартом де-факто для передачи бинарных, или двухуровневых, состояний. Их можно найти повсеместно: Датчики с выходом напряжения применяются там, где важно знать не просто факт события, а его интенсивность или точное значение.

Сравним эти два типа сигналов в таблице:

| Характеристика | "Сухой контакт" | Датчик с выходом напряжения |

| ----------------------- | ------------------------------------------------ | -------------------------------------------------- |

| Тип сигнала | Дискретный (бинарный) | Аналоговый (непрерывный) |

| Передаваемая информация | Два состояния: "включено/выключено", "замкнуто/разомкнуто" | Диапазон значений, пропорциональный измеряемой величине |

| Питание датчика | Не требуется (пассивный) | Требуется внешнее питание (активный) |

| Вход контроллера | Цифровой вход (DI) | Аналоговый вход (AI) |

| Пример задачи | "Включить свет, если дверь открыта" | "Поддерживать освещенность в комнате на уровне 500 люкс" |

Выбор между этими типами датчиков и, соответственно, входами контроллера полностью зависит от решаемой задачи автоматизации.

---

Схема "Сухой контакт": подключение к цифровым входам (DI)

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

> ⚠️ Внимание: Категорически запрещается подавать любое внешнее напряжение на входы контроллера, сконфигурированные для работы с "сухими контактами". Универсальные входы (UI) контроллера HI в режиме DI самостоятельно формируют необходимое сигнальное напряжение с помощью внутреннего подтягивающего резистора. Подача внешнего напряжения (например, 24В или 230В) на эти клеммы приведет к необратимому повреждению входного каскада контроллера.

Практическая схема подключения

Для подключения "сухого контакта" используются две клеммы контроллера: один из универсальных входов (например, `UI-01`) и клемма общей земли (`GND`).

ASCII-схема подключения (`WIRING-DI-001`):
//======== WIRING-DI-001: Подключение настенной кнопки ========

(Устройство: Кнопка) [Контроллер: HI-Core]

+-------+

Контакт 1 --| |----(провод 1)-----> Клемма UI-01

| |

Контакт 2 --| |----(провод 2)-----> Клемма GND

+-------+

Роль внутреннего подтягивающего резистора

Как мы рассматривали в уроке `COURSE-04-M01-L03`, посвященном моделям получения данных, цифровой вход должен иметь четко определенное состояние в любой момент времени. Когда контакты нашего датчика разомкнуты, вход `UI-01` ни к чему не подключен и его состояние неопределенно ("плавающий вход").

Чтобы решить эту проблему, контроллер HI при конфигурации входа в режим DI автоматически задействует внутренний подтягивающий резистор (pull-up resistor).

  • Контакт разомкнут (кнопка не нажата): Внутренний резистор подтягивает напряжение на входе `UI-01` к внутреннему источнику питания (например, +3.3В). Контроллер считывает это высокое напряжение как логическую '1' (или `false` в терминах состояния "неактивно").
  • Контакт замкнут (кнопка нажата): Датчик замыкает вход `UI-01` напрямую на `GND`. Напряжение на входе падает до 0В. Контроллер считывает это низкое напряжение как логический '0' (или `true` в терминах состояния "активно").
  • Таким образом, контроллер надежно определяет оба состояния, используя для этого всего два провода до датчика.

    Конфигурация входа

    Перед физическим подключением или после него необходимо настроить соответствующий универсальный вход в веб-интерфейсе контроллера:

  • Перейдите в раздел конфигурации входов/выходов.
  • Найдите нужный вход (например, UI-01).
  • Установите его режим работы в "Цифровой вход (DI)" или "Сухой контакт".
  • При необходимости можно использовать опцию "Инверсия". Она меняет логику: разомкнутый контакт будет считаться активным состоянием (`true`), а замкнутый — неактивным (`false`). Это полезно для работы с датчиками, имеющими нормально-замкнутые (NC) контакты, например, в охранных шлейфах.
  • Сохраните конфигурацию.
  • Теперь контроллер готов принимать и обрабатывать дискретные сигналы от вашего датчика.

    ---

    Обработка событий от "сухого контакта" в Node-RED

    После физического подключения и настройки входа, нам необходимо обработать поступающие от него сигналы в среде Node-RED для запуска сценариев автоматизации.

    Для работы с цифровыми входами контроллера HI используется специальный узел `hi-di` (или его аналог, например `rpi-gpio in` в базовой конфигурации).

    Получение состояния

    Узел `hi-di` настраивается на конкретный номер входа (например, UI-01). Он автоматически отслеживает его состояние и отправляет сообщение `msg` каждый раз, когда оно меняется.

    ASCII-схема простого потока:
    [hi-di: "Кнопка в гостиной"] --- (событие) ---> [debug: "Состояние кнопки"]
    

    Структура сообщения, как правило, очень проста. Для нашего примера с подтягивающим резистором (pull-up):

        {
    

    "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: "Чистое событие"]
    
  • Первое нажатие (дребезг): `hi-di` генерирует `true, false, true`.
  • * Первое `true` проходит через `rbe`, так как предыдущее состояние было `false`.

    * Следующее `false` (от дребезга) проходит, так как оно отличается от `true`.

    * Следующее `true` (от дребезга) проходит, так как оно отличается от `false`.

    Проблема не решена полностью!

  • Правильное решение: `rbe` + `trigger` или `delay`:
  • Более надежный способ — использовать узел `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В. Это означает, что они могут измерять любое напряжение в этом диапазоне с определенной точностью.

    Примеры датчиков:

    Схема подключения (3-проводной датчик)

    Большинство таких датчиков имеют три вывода:

    ASCII-схема подключения (`WIRING-AI-001`):
    //======== WIRING-AI-001: Подключение датчика освещенности 0-10В ========
    
    

    [Блок питания: 24V DC] (Датчик) [Контроллер: HI-Core]

    +24V -----------------> V+

    GND -----------------+-> GND

    |

    |

    (Сигнальный провод) <----+-- Vout -------------> Клемма AI-02

    |

    (Подключение общего GND) <--+----------------------> Клемма AI_GND (или GND)

    > ℹ️ Информация: Критически важным является подключение вывода `GND` блока питания датчика к клемме `GND` аналогового входа контроллера. Без этого общего опорного уровня контроллер не сможет корректно измерить напряжение на сигнальном выходе датчика, и показания будут неверными или хаотичными.

    Конфигурация входа

    В веб-интерфейсе контроллера необходимо сконфигурировать соответствующий универсальный вход:

  • Выберите нужный вход (например, UI-02).
  • Установите его режим работы в "Аналоговый вход (AI)".
  • Выберите диапазон измерения, соответствующий вашему датчику: "0-10В".
  • Сохраните конфигурацию.
  • Теперь контроллер будет периодически измерять напряжение на этом входе и предоставлять его значение для использования в 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`:

    Теперь, когда на вход узла `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, регулировать мощность увлажнителя. |

    Что дальше

    Мы рассмотрели базовые схемы подключения для самых распространенных типов датчиков. Однако существует целый класс "умных" датчиков, которые передают данные в цифровом виде по специальным шинам данных.

    > 🔗 Связанный материал: В следующем уроке `COURSE-04-M02-L01: Шина 1-Wire: подключение и адресация датчиков температуры` мы разберем, как подключать целые гирлянды датчиков температуры DS18B20 всего к одному входу контроллера, используя цифровой протокол 1-Wire.