ГлавнаяАкадемияОсновы умного дома → Подключение датчиков температуры и влажности (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.

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

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

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

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

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

---

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

🔗 Связанный материал: Принципы выбора кабеля и базовые правила монтажа были рассмотрены в документе Стандарты схем подключения. Для шины 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/{имя_контрола}`

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

    `/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-топик и отображает данные на панели управления.
  • Рекомендации и лучшие практики

    Используйте экранированный кабель: В условиях сильных электромагнитных помех (рядом с силовыми кабелями, двигателями) используйте экранированный кабель 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) при работе с клеммными колодками контроллера и подключении устройств типа "сухой контакт" на соседние универсальные входы.

    Что дальше

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