Главная → Академия → Основы умного дома → Подключение датчиков температуры и влажности (1-Wire)

Подключение датчиков температуры и влажности (1-Wire)

Урок 2 · Основы умного дома · 30 мин · theory

Введение в протокол 1-Wire

Протокол 1-Wire — это последовательная шина данных, разработанная компанией Dallas Semiconductor, которая позволяет осуществлять связь между одним ведущим устройством (master) и одним или несколькими ведомыми устройствами (slave) по единственному проводу (плюс общий провод/земля). Это делает его чрезвычайно популярным в системах автоматизации для задач, не требующих высокой скорости передачи данных, но где важны простота монтажа и низкая стоимость.

> 💡 Подсказка: Максимальная длина шины 1-Wire сильно зависит от топологии, качества кабеля и количества устройств. На практике, при использовании кабеля типа "витая пара" (например, UTP/FTP Cat.5e) и соблюдении правил монтажа, можно добиться стабильной работы на длинах до 50-70 метров. Для более длинных линий может потребоваться использование специальных усилителей шины или переход на более помехозащищенные интерфейсы, такие как RS-485.

Принцип работы и ключевые особенности

Протокол работает по принципу master-slave. Контроллер (master-устройство) инициирует все коммуникации на шине, отправляя команды и запросы данных. Ведомые устройства (slave), такие как датчики, отвечают только тогда, когда к ним обращается master.

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

  • Уникальный 64-битный адрес (ROM ID): Каждое устройство 1-Wire имеет уникальный, прошитый на заводе 64-битный идентификатор. Этот адрес позволяет мастеру однозначно обращаться к любому из десятков датчиков, подключенных к одной и той же двухпроводной линии. Первые 8 бит адреса определяют тип (семейство) устройства. Например, для популярных датчиков температуры DS18B20 код семейства — `0x28`.
  • Архитектура шины: Все устройства подключаются параллельно к одной линии данных (DQ) и общему проводу (GND). Master-устройство "подтягивает" линию данных к высокому уровню напряжения (обычно +3.3V или +5V) через резистор. Для передачи данных устройства "притягивают" линию к земле, формируя логические нули и единицы.
  • Паразитное питание (Parasitic Power): Одной из уникальных особенностей протокола является возможность работы устройств без отдельного провода питания. В этом режиме ведомое устройство получает энергию для работы, заряжая внутренний конденсатор от линии данных, когда та находится в высоком (свободном) состоянии. Это упрощает монтаж до всего двух проводов (Data и GND). Однако этот режим более чувствителен к длине линии и количеству устройств.

Преимущества и области применения

Простота и низкая стоимость сделали 1-Wire стандартом де-факто для ряда задач в системах "умный дом" и автоматизации зданий.

Преимущества:
  • Простота монтажа: Требуется всего два или три провода.
  • Низкая стоимость: Датчики (особенно DS18B20) очень доступны.
  • Гибкая топология: Позволяет подключать множество устройств на одну шину.
  • Уникальная идентификация: Нет необходимости в ручной настройке адресов, как в Modbus.
Типичные области применения:
  • Измерение температуры: Наиболее частое применение. Датчики DS18B20 используются для мониторинга температуры в помещениях, температуры теплоносителя в системах отопления, полов с подогревом.
  • Измерение влажности: Комбинированные датчики, такие как DHT22 (в специальной обвязке для 1-Wire), позволяют измерять и температуру, и влажность.
  • Идентификация: Использование ключей iButton (Touch Memory) в системах контроля доступа.
  • Подсчет импульсов: Специализированные счетчики с выходом 1-Wire.

Для контроллеров нашей платформы, поддержка 1-Wire является встроенной функцией, позволяющей напрямую подключать и опрашивать десятки датчиков без дополнительного оборудования.

---

Физическое подключение датчиков к контроллеру

Правильное физическое подключение — залог стабильной работы шины данных. Ошибки на этом этапе являются самой частой причиной неисправностей.

> ⚠️ Внимание: Неправильное подключение (переполюсовка питания и данных) может привести к необратимому выходу из строя как самих датчиков, так и порта контроллера. Всегда выполняйте монтажные работы при полностью обесточенном оборудовании. Перед подачей питания еще раз сверьтесь со схемой.

Идентификация клемм на контроллере

На корпусе контроллера клеммы, предназначенные для работы с шиной 1-Wire, четко промаркированы. Как мы рассматривали в уроке [COURSE-01-M03-L01], универсальные входы (UI) могут быть настроены на разные режимы. Для 1-Wire используются специализированные или назначаемые порты.

  • D (Data): Линия данных. К этой клемме подключаются выводы DQ всех датчиков на шине.
  • GND (Ground): Общий провод, "земля".
  • 5V (Power): Выход питания +5В для датчиков. Используется при подключении по трехпроводной схеме.

Схемы подключения датчика DS18B20

Датчик температуры DS18B20 является самым распространенным устройством 1-Wire. Рассмотрим два варианта его подключения.

1. Стандартная (3-проводная) схема — Рекомендуется

Этот метод наиболее надежен, особенно для длинных линий и большого количества датчиков.

| Клемма контроллера | Провод (Цвет по стандарту) | Вывод датчика DS18B20 | Назначение |

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

| `5V` | Красный | `VDD` | Питание |

| `D` | Желтый | `DQ` | Линия данных |

| `GND` | Черный | `GND` | Общий провод |

2. Схема с паразитным питанием (2-проводная)

Упрощает монтаж, но менее надежна. Используется, когда прокладка третьего провода невозможна или нецелесообразна.

| Клемма контроллера | Провод (Цвет по стандарту) | Вывод датчика DS18B20 | Назначение |

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

| `D` | Желтый | `DQ` | Линия данных |

| `GND` | Черный | `GND` и `VDD` (соединены вместе) | Общий провод |

Топологии шины: "Линия" и "Звезда"

  • "Линия" (Daisy-chain): Это предпочтительная топология. Кабель идет последовательно от контроллера к первому датчику, от него ко второму и так далее. Такой монтаж минимизирует длину "отводов" и снижает отражение сигнала, повышая стабильность шины.

    [Контроллер] --<кабель>-- (Датчик 1) --<кабель>-- (Датчик 2) --<...>-- (Датчик N)

  • "Звезда" (Star): В этой топологии все кабели от датчиков сходятся в одной точке (например, в клеммной коробке или прямо на клеммах контроллера). Такая схема допустима, но крайне не рекомендуется для линий с общей длиной "лучей" более 20-30 метров. Длинные "лучи" звезды действуют как антенны, что приводит к искажению сигнала и сбоям в работе шины.

Если без топологии "звезда" не обойтись, старайтесь делать "лучи" как можно короче.

🔗 Связанный материал: Принципы выбора кабеля и базовые правила монтажа были рассмотрены в документе Стандарты схем подключения. Для шины 1-Wire рекомендуется использовать кабель "витая пара" UTP/FTP, используя одну пару для данных и земли.

---

Конфигурация шины в веб-интерфейсе

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

1. Активация поддержки 1-Wire

Сначала нужно убедиться, что соответствующий системный драйвер активирован.

  • Откройте веб-интерфейс контроллера в браузере.
  • Перейдите в раздел Configs -> Hardware Modules.
  • В списке системных драйверов найдите опцию, отвечающую за 1-Wire. Обычно она называется "Internal 1-Wire bus" или "1-Wire (w1-gpio)".
  • Установите для нее значение "enabled".
  • Нажмите кнопку Save вверху страницы. Контроллер может потребовать перезагрузки для применения настроек.
  • 2. Проверка обнаружения датчиков в системе

    После перезагрузки контроллер автоматически просканирует шину 1-Wire и обнаружит все подключенные устройства. Убедиться в этом можно через консоль, подключившись к контроллеру по SSH.

    Выполните команду для просмотра списка обнаруженных устройств:

    ls /sys/bus/w1/devices/
    

    Вывод команды должен содержать список каталогов. Среди них будут каталоги, имена которых начинаются с `28-`. Это и есть ваши датчики DS18B20, идентифицированные по их уникальным 64-битным адресам.

    Пример вывода:

    28-00000a1b2c3d  28-00000a4e5f6g  w1_bus_master1
    

    Здесь система обнаружила два датчика.

    3. Сопоставление устройств в веб-интерфейсе

    Теперь, когда система "увидела" датчики на низком уровне, необходимо, чтобы их распознала служба, отвечающая за публикацию данных в MQTT.

  • Перейдите в раздел Devices в веб-интерфейсе.
  • Вы увидите новое устройство, обычно с именем `wb-w1` или похожим.
  • Разверните его. Внутри вы увидите список "контролов" (Controls), соответствующих каждому найденному датчику. Имя контрола будет совпадать с уникальным адресом датчика, например `28-00000a1b2c3d`.
  • На этом этапе вы можете задать для каждого датчика более понятное имя (description), например, "Температура в гостиной" или "Температура обратки котла". Это поможет в дальнейшем не запутаться при настройке логики.

    ---

    Получение данных через MQTT

    Красота платформы в том, что после описанной выше настройки, контроллер начинает автоматически опрашивать датчики и публиковать их показания в локальный MQTT-брокер. Вам не нужно писать код для опроса шины 1-Wire.

    Структура MQTT-топиков

    Служба `wb-mqtt-serial` (или ее аналоги) формирует MQTT-топики по стандартному шаблону. Для устройств на шине 1-Wire он выглядит следующим образом:

    `/devices/{имя_устройства}/controls/{имя_контрола}`

    • {имя_устройства}: По умолчанию `wb-w1`.
    • {имя_контрола}: Уникальный 64-битный адрес датчика, например `28-00000a1b2c3d`.

    Таким образом, полный топик для получения значения с датчика температуры будет выглядеть так:

    `/devices/wb-w1/controls/28-00000a1b2c3d`

    ℹ️ Информация: Если вы подключите датчик, то обнаружите, что к его адресу добавляется `/on`. Например: `/devices/wb-w1/controls/28-00000a1b2c3d/on`. Это является особенностью реализации и не несет смысловой нагрузки. Для чтения данных подписываться нужно на топик без `/on`. А значение публикуется именно в этот субтопик. Поэтому для подписки в Node-RED удобнее использовать wildcard: `/devices/wb-w1/controls/28-00000a1b2c3d/#`.

    Формат данных (Payload)

    Сообщение (payload), публикуемое в данный топик, представляет собой строку с числовым значением температуры в градусах Цельсия.

    Пример сообщения в топике `/devices/wb-w1/controls/28-00000a1b2c3d/on`:

    23.5
    

    Для чтения этих данных в любой системе (например, в Node-RED) достаточно подписаться на соответствующий MQTT-топик.

    {
    

    "topic": "/devices/wb-w1/controls/28-00000a1b2c3d/on",

    "qos": 0,

    "retain": true,

    "payload": "23.5"

    }

    Обратите внимание на флаг `retain: true`. Это означает, что MQTT-брокер хранит последнее полученное значение. Даже если вы подпишетесь на топик позже, вы немедленно получите актуальные данные, не дожидаясь следующего опроса датчика. Это ключевой аспект для построения логики с состоянием, как мы обсуждали ранее.

    ---

    Пример: Визуализация температуры в Node-RED

    Давайте создадим простой поток, который будет считывать температуру с нашего датчика и отображать ее на панели управления (Dashboard).

    > 🔗 Связанный материал: Более сложные сценарии, включая усреднение показаний, создание уведомлений при выходе температуры за заданные пределы, запись истории в базу данных и управление отоплением, рассматриваются в курсе COURSE-03: Углубленное программирование в Node-RED.

    Пошаговое создание потока

    Предполагается, что у вас установлен пакет `node-red-dashboard`.

  • Добавьте узел `mqtt in`:
  • * Перетащите узел `mqtt in` из палитры на рабочее поле.

    * Дважды кликните на него для настройки.

    * В поле `Server` выберите локальный брокер (обычно `localhost:1883`).

    * В поле `Topic` укажите топик вашего датчика, используя wildcard для удобства: `/devices/wb-w1/controls/28-00000a1b2c3d/#`.

    * В поле `Output` выберите `a parsed JSON object`, если хотите получать всю структуру сообщения, или `a string`, если вас интересует только `payload`. Для простоты выберем `a string`.

    * `QoS`: `0`.

  • Добавьте узел `function` (опционально, но рекомендуется):
  • * Этот узел будет преобразовывать строковое значение в числовое, что является хорошей практикой.

    * Соедините выход узла `mqtt in` со входом узла `function`.

    * В коде узла напишите:

        // Преобразуем входящую строку в число с плавающей точкой

    msg.payload = parseFloat(msg.payload);

    // Устанавливаем статус узла для быстрой диагностики

    node.status({fill:"green", shape:"dot", text:"T: " + msg.payload + " °C"});

    return msg;

    Это действие является элементом паттерна "Визуальный статус" и помогает мгновенно видеть в редакторе последнее полученное значение.

  • Добавьте узел `ui_gauge`:
  • * Перетащите узел `ui_gauge` из палитры (секция `dashboard`).

    * Соедините выход узла `function` с его входом.

    * Настройте узел:

    * `Group`: Выберите или создайте группу на вкладке дашборда.

    * `Label`: "Температура в гостиной".

    * `Value format`: `{{value | number:1}} °C` (это отформатирует число, оставив один знак после запятой).

    * `Range`: Установите реалистичный диапазон, например, от 0 до 40.

  • Разверните проект:
  • * Нажмите красную кнопку Deploy.

    * Перейдите на вкладку дашборда (обычно по адресу `http://:1880/ui`).

    Вы увидите графический индикатор (gauge), показывающий текущую температуру с вашего датчика. Он будет обновляться автоматически при поступлении новых данных по MQTT.

    ---

    Итоги и лучшие практики

    В этом уроке мы прошли полный цикл работы с датчиками по шине 1-Wire: от физического подключения проводов до создания простого виджета для визуализации данных.

    Краткий обзор процесса:
  • Физическое подключение: Соединили датчик с контроллером по 2-х или 3-х проводной схеме, соблюдая полярность.
  • Конфигурация: Активировали поддержку 1-Wire в системе и убедились, что датчик обнаружен.
  • Интеграция с MQTT: Нашли топик, в который контроллер автоматически публикует данные с датчика.
  • Визуализация: Создали поток в Node-RED, который подписывается на MQTT-топик и отображает данные на панели управления.
  • Рекомендации и лучшие практики

    • Документируйте адреса: При монтаже на объекте с большим количеством датчиков обязательно создайте таблицу, в которой будет сопоставлен уникальный 64-битный адрес каждого датчика с его физическим расположением (например, `28-00000a1b2c3d` — "Гостиная, у окна"). Это сэкономит вам часы времени при дальнейшей настройке и диагностике.
    Используйте экранированный кабель: В условиях сильных электромагнитных помех (рядом с силовыми кабелями, двигателями) используйте экранированный кабель FTP, подключая экран к клемме GND только со стороны контроллера*.
    • Проверяйте контакты: Большинство проблем с "отваливающимися" датчиками связано с плохим контактом в клеммниках.

    Базовая диагностика

    Если датчик не появляется в системе или данные не обновляются:

  • Проверьте контакты: Убедитесь, что провода надежно зажаты в клеммах.
  • Проверьте настройки: Убедитесь, что поддержка 1-Wire включена в `Hardware Modules`.
  • Используйте консоль: Подключитесь по SSH и выполните команду `owdir` или `ls /sys/bus/w1/devices/`. Если датчика там нет, проблема на физическом уровне.
  • Перезапустите службу: Иногда помогает перезапуск службы `wb-mqtt-serial` командой `systemctl restart wb-mqtt-serial`.
  • Изолируйте проблему: Если на шине много датчиков, попробуйте отключить все, кроме одного, и проверить его работоспособность. Затем подключайте остальные по одному.
  • 🔗 Связанный материал: Напоминаем о необходимости сверяться с документацией предыдущих уроков (COURSE-01-M03-L01 и COURSE-01-M03-L02) при работе с клеммными колодками контроллера и подключении устройств типа "сухой контакт" на соседние универсальные входы.

    Что дальше

    В следующем уроке мы рассмотрим подключение исполнительных устройств — реле, и научимся управлять нагрузками, такими как освещение и розетки, на основе данных, полученных от датчиков.