Редкаясамоделка на тему «умного дома» обходится без термометров. В интернете есть масса инструкций по подключению, но при этом обычно ограничиваются «классическим», учебно‑демонстрационным вариантом, наверняка его все видели:

Берется какая‑нибудь ардуиноподобная плата, или что‑то из серии ESP, один из выводов GPIO настраивается в прошивке как линия 1-wire, а микросхема DS1820 подключается примерно так:

И в общем всё работает. Но есть нюанс: вообще говоря, по стандарту, обычного напряжения питания для микропроцессоров 3.3в, для 1-wire мало. Работать оно будет, но это учебный пример, когда всё собирается на макетной плате, вот прямо тут рядом: прочитали данные, порадовались и хватит.

Но ведь на одну линию 1-wire можно посадить до 128 разных устройств, причем не только термометры, а саму линию растянуть на сотню метров — например, чтобы собирать данные о температуре отовсюду, от подвала до чердака. Да, для этого хватит всего одной ножки GPIO микроконтроллера.

Однако если вы попробуете сделать это по той схеме — скорее всего ничего не получится. Чтобы понять почему — немного теории, на пальцах:

Все данные передаются по линии 1-wire буквально по одному проводу (относительно земляного, т. е. по 1 паре). И питание датчиков — тоже по ней.
Для этого «в покое» на линии должно поддерживаться рабочее напряжение, порядка 5–6в. Оно поступает в датчики, заряжая их внутренние конденсаторы.
Микроконтроллер запрашивает данные, «прижимая» линию до 0: в зависимости от длительности «прижатий» и «отпусканий» датчики расценивают это как разные команды, например те же термометры могут переходить в режим измерения температуры, после чего начинают сами точно так же «прижимать» линию к 0, передавая побитно свой уникальный адрес и биты данных.

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

Конечно, можно запитать датчики отдельным проводом — но это уже не 1 пара, а трехпроводка, причем питать желательно штатными 5 вольтами, но тогда возникает опасность попадания 5 вольт на GPIO микроконтроллера. Если бы GPIO работал только на вход — можно было бы просто поставить делитель на двух резисторах, но он ведь и на выход должен работать, «прижимая» 5в к 0, а подавать на него эти 5в нельзя. Особенно для ESP, не любят они этого.

Поэтому умные люди придумали вот такую конструкцию подключения линии:

Транзистор включен так, что не позволит напряжению на ножке GPIO подняться выше напряжения питания, но при этом не помешает «прижать» линию к 0, если микроконтроллер попробует это сделать.

Резисторах R1 и стабилитрон D1 снизят относительно высокое напряжение до «комфортных» 1-wire 5v, С1 защитит от помех, а R2 позволит датчикам и микроконтроллеру «прижимать» 5в к 0.
Сложность тут в том, что R2 должен иметь достаточно большое сопротивление, чтобы можно было легко «зажать» линию, но достаточно небольшое чтобы быстро восстановить заряды датчиков.

При этом на самих 1-wire устройствах вывод питания вообще не нужен, и для снижения помех лучше замкнуть его на «землю». Питание будет идти по линии данных.
Но иногда, на длинных линиях, этого недостаточно — тогда можно применить вот такую схему:

Питание с линии данных через диод заряжает конденсатор, а конденсатор питает датчик.
Примерно так же оно и устроено внутри, только теперь мы «увеличили» емкость конденсатора, и нам по‑прежнему достаточно 1 пары проводов.

И это всё действительно работает. Можно завести в систему Умного дома всего одно устройство для считывания шины, а саму шину развести, ну например, коаксиалом, телефонным шнуром или той же витой парой, и собирать данные из разных мест.
Правда, тут можно наткнуться на особенности работы штатной ардуиновской библиотеки — она плохо подходит для опроса большого числа датчиков, но это уже другая тема, чисто программная.

Комментарии (42)


  1. kkuznetzov
    18.01.2025 03:46

    Очень странные схемы.

    1. Не хватает защиты линии. Поставить какой-нибудь защитный диод и последовательный резистор.

    2. Не жирно ли 10 мкФ на второй схеме? Думаю хватит сильно меньше. Даже, что то вроде 0.47 мкФ.


    1. JBFW Автор
      18.01.2025 03:46

      Стабилизация, напряжение прыгать не должно. А 10 мкФ потому что "какой был", обычный мелкий электролит.

      Если разрабатывать как фабричное изделие - другое дело, может и хватило бы 0.47


  1. sergyk2
    18.01.2025 03:46

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


  1. randomsimplenumber
    18.01.2025 03:46

    Как раз датчики температуры лучше беспроводные. Угадать, где его лучше разместить - сложно, перенести - ещё сложнее. Измерять температуру можно и не каждую секунду,


    1. JBFW Автор
      18.01.2025 03:46

      У беспроводных проблемы с батарейкой, она заканчивается. И надо пойти ее поменять.

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


      1. Kirillko312
        18.01.2025 03:46

        Можно запитать его где-то рядом с местом измерения, а данные отдавать по вайфаю


        1. JBFW Автор
          18.01.2025 03:46

          Тогда он уже не беспроводной, а еще один с проводами )

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


  1. slog2
    18.01.2025 03:46

    А не лучше ли выкинуть R1 D1 C1 и запитать схему от 5в ? Никакой необходимости в 12в не видно. А защиты проца от длинной линии очень не хватает.


    1. JBFW Автор
      18.01.2025 03:46

      Скажем так, особенность конструкции в целом.

      Нужно бесперебойное питание всякой прочей аппаратуры в доме, роутеров-камер и прочего, что также требует аккумуляторов, в итоге вышло что есть Большой Аккумулятор на 12в (а мог бы быть и на 24), и вот эти 12 вольт идут как стандартное питание, оно уже есть по умолчанию.

      Для питания всяких ESP оно понижается до 3.3, но тут нужно больше, поэтому просто беру 12.


  1. Jury_78
    18.01.2025 03:46

    тогда можно применить вот такую схему

    Напряжение на конденсаторе будет еще меньше 3,3В.


    1. serafims
      18.01.2025 03:46

      Шина же 5 В, диод съест 0.7 В, будет вплоть до 4.3 В после долгого простоя шины, разве не так?


      1. JBFW Автор
        18.01.2025 03:46

        0.6 если обычный диод, 0.1 если Шоттки

        Так-то ему и 4 хватит, вопрос в длительности, насколько хватит, 10 мкФ хватит с запасом


        1. Jury_78
          18.01.2025 03:46

          У Шоттки 0,1В ? Это у каких? Обычно 0,3В.


          1. HardWrMan
            18.01.2025 03:46

            Ну, не 0.1, конечно, но 0,156 вполне себе у быстрых шоттки норма. Применяются в импульсных БП.


      1. Jury_78
        18.01.2025 03:46

        у ESP 3.3V


        1. JBFW Автор
          18.01.2025 03:46

          Вон там схема с транзистором для чего, по вашему?
          Как раз для того чтобы поднять напряжение шины до 5, и согласовать это с питанием ESP 3.3


    1. JBFW Автор
      18.01.2025 03:46

      Нет, 5 - 0.6(0.1) = 4 с чем-нибудь.

      Там оно как: сам процесс измерения - 200-300 мс, потом передача, и всё это время датчик работает на внутреннем конденсаторе, у которого небольшая ёмкость. Когда питание было всего 3.3 - оно тоже работает, но очень быстро напряжение падает. Внешний конденсатор даст достаточно времени, работа стабильнее, и 4 вольт хватит


  1. Gudd-Head
    18.01.2025 03:46

    Я думал, тут будет про восстановление фронтов с помощью микросхемы сброса.


    1. JBFW Автор
      18.01.2025 03:46

      Проблема фронтов - это другая проблема, тут про питание датчиков...


  1. HardWrMan
    18.01.2025 03:46

    Я бы не назвал данный каскад усилителя с общим затвором "умным" решением. Простым - да, умным - нет.

    Если GPIO работает в режиме OD тогда при лог.1 каскад должен быть в режиме истокового повторителя и ограничить напряжение на истоке до напряжения на затворе. Только это гаоантированно работает лишь с полевыми транзисторами с неизолированным затвором. Как оно будет на полевом транзисторе с изолированным затвором - мало кто знает. Эти транзисторы больше для ключевых (дискретных) режимов а не линейных.

    Когда GPIO будет давить исток к земле, то весь ток с шины пойдёт в ногу GPIO. А в статье про доинную шину. Длинная шина это и индуктивность и, самое главное, ёмкость. А ещё датчик может закоротить на Vcc. И привет ноге.

    Правильная схема будет что-то типа управляемого генератора тока. Я такие собирал для K-Line, можно даже оптическую развязку сделать.


    1. JBFW Автор
      18.01.2025 03:46

      Вы усложняете.
      Датчик не может закоротить на Vcc, потому что у него нет ничего кроме шины данных и земли, некуда коротить, разве что на землю. Это не страшно, просто работать ничего не будет.
      Режим работы тут как раз дискретный, и работает оно вполне понятно как.

      Вот то, что емкость линии может влиять на возможность "прижатия" - это да.
      Но тут ведь какое дело - если емкость линиии настолько велика, что МК не может ее "прижать", или у него отгорает ножка - то как ее сможет прижать микросхема датчика?
      Тогда и она не сможет, а значит, смысла во всей этой линии просто нет, такая линия будет просто неработоспособна.

      Это вообще не "Универсальное решение на все случаи жизни!" - я просто привел пример как оно сделано и работает. Возможно, у кого-то оно так работать не будет.


      1. HardWrMan
        18.01.2025 03:46

        Датчик не может закоротить на Vcc, потому что у него нет ничего кроме шины данных и земли, некуда коротить, разве что на землю.

        Ну, видимо, вы ещё не встречали датчики, побитые статикой.


        1. JBFW Автор
          18.01.2025 03:46

          Так статикой, или на Vcc? )

          Там всего 2 линии, Vcc среди них нет - как датчик закоротит одну из линий на Vcc, если Vcc нет?
          Это 1-wire, это не линия связи между разными устройствами со своим питанием, типа K-line.


          1. HardWrMan
            18.01.2025 03:46

            Статика (в том числе и наведённая на линию) выбивала кристалл так, что он коротил ноги. Бывало что к VCC, бывало что к GND. А бывало что и туда и туда, защита выбивала питание.


            1. JBFW Автор
              18.01.2025 03:46

              Это понятно. Статикой можно выбить что угодно.
              Речь о том что там НЕТ Vcc. Вообще нет.

              Есть 2 провода и 3-хногая микросхема, которая к ним подключена. К ней больше ничего не подключено внешнего, как ее ни выбивай и не закорачивай она эти два провода может только замкнуть между собой.
              Это 1-wire.


              1. HardWrMan
                18.01.2025 03:46

                Вы про фантомное питание? Последняя картинка в статье. Там да, проблемы этой не будет. А вот при подключении по первой картинке - будет. Разница лишь в длине линии: при её длине выше определённого предела фантомное питание не обеспечит работоспособность датчика(-ов).


                1. JBFW Автор
                  18.01.2025 03:46

                  О том и речь, что по 1 картинке - это пример из инструкций по подключению ds1820 к Arduino, и он хорошо работает при компактных размерах, "на столе".

                  А вот другие варианты - другое дело. И питание там не фантомное, самое обычное, просто надо понимать как оно там работает и как это можно увеличивать.

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


                  1. HardWrMan
                    18.01.2025 03:46

                    А вот другие варианты - другое дело. И питание там не фантомное, самое обычное, просто надо понимать как оно там работает и как это можно увеличивать.

                    Когда питание подаётся вместе с сигналом оно называется фантомным. Что для микрофонов что для 1wire. Заметьте, что в случае 1wire это питание закорачивается на массу, поэтому требует развязки и буферного элемента (в вашем случае диод и конденсатор).


  1. romanetz_omsk
    18.01.2025 03:46

    У MAX/Dallas была аппнота по этой теме. 47 нанофарад ёмкости линии выдерживает 1-wire мастер, по их рекомендациям реализованный. Полкилометра витухи (91 пф/м)


  1. rexen
    18.01.2025 03:46

    Таки в статье не хватает фоток реализованного. Автор теории накидал, а вот сколько метров у него линия в реальности, например?


    1. JBFW Автор
      18.01.2025 03:46

      Как вы себе представляете "фотки" кабеля, лежащего в гипсокартонных коробах и закладных трубах? )

      Обычная витая пара, соединения на скрутках, с ответвлениями. Проложена где просто в коробе, где через гофру или ПНД - вот например к колодцу ПНД закопана, чтобы не раздавило, а в стене удобнее гофру прокладывать.


  1. ahdenchik
    18.01.2025 03:46

    "Длинная линия" в электронике это линия, длина которой превышает длину распространяющейся в ней волны


  1. firehacker
    18.01.2025 03:46

    Абсолютно безосновательное заявление о ненужности пина питания. Актуально только для DS1820-PAR — версии чипа для чисто паразитного питания, там он действительно не подключен внутри чипа.

    Следующая итерация улучшения ситуации, которую ожидал, но не увидел в статье — это активный pull-up — не с помощью резистора, а с помощью constant current source — для борьбы с паразитной ёмкостью длинной линии и медленным нарастанием при отпускании пуллдауна. Тогда оно будет не по экспоненте, а линейным.

    Отдельный разговор это то, что если на шину посадить целую гряду термодатчиков -PAR-подверсии, то оно вообще работать не будет: нужно на время замера делать strong pull-up, иначе на все чипы тока не хватит.


    1. firehacker
      18.01.2025 03:46

      До полутора миллиампер доходит ток потребления одного чипа во время измерения температуры согласно даташиту.

      Даже если бы предложенный пуллап в 470 ом был подключен к +5V-шине с бесконечно низким выходным импедансом, уже при токе 6 mA падение на пуллапе составит 470*0.006=2.82V.

      Более чем на 1/2 упадет напряжение питание при одновременном запуске измерения всего лишь на 4 чипах, Карл! На четырёх! Хотя на шину их можно посадить сотню.

      Но это при условии что та нода, к которой подключен верхний конец пуллапа, имеет нулевой output impedance. А пуллап по факту подключен к средней точки делителя резистор-стабилитрон, и выходной импеданс этой ноды далеко не ноль. Почему было там 7805 не поставить вместо этой порнографии со стабилитроном? В итоге наверное даже два-три одновременно запущенных на измерение чипа на шине уложат шину

      Что за шляпу предлагает нам автор?


      1. firehacker
        18.01.2025 03:46

        Совсем забыл: там же стоит конденсатор 10 uF у каждого датчика, чтобы обеспечить каждый датчик энергией. Так вот, если предположить, что во время измерения термодатчик потребляет ток 1.5 mA вне зависимости от напряжения питания, достаточно 16 миллисекунл чтобы разрядить конденсатор 10 uF с изначальных 5V до 2.5V (минимальное напряжение для работы чипа — 3V, то есть на 2.5V чип уже не будет работать). Между тем, процедура замера температуры длится как минимум 94 миллисекунды (в самом грубом 9-битном режиме), а в худшем случае — 750 миллисекунд (в 12-битном режиме).

        Так что этот конденсатор — мёртвому припарка. Заряд из «локального» конденсатора чип очень быстро высосет, а с шины взять нужный ток несколько устройство одновременно не смогут из-за подтягивающего резистора.

        Если интересно, можно даже просимулировать. Симулировать будем с упрощениями:

        • Термодатчик потребляет 1.5 mA вне зависимости от напряжения питания

        • Диодом перед «локальным» конденсатором пренебрегаем.

        • Пуллап сделан к «супермощной» +5V-шине, а не к маломощной RD-цепочке.

        4 термодатчика, одновременно делающих преобразование:

        просадят напряжение на шине до минимально допустимого (+3V) уже за 24 мс — что в четыре раза меньше, чем требуется чипу для совершения термопреобразования с минимальной точностью (94 мс). Вывод: чипы перестанут работать раньше, чем смогут сделать какой-то замер.

        3 термодатчика, одновременно делающих преобразоание:

        просадят напряжение на шине до минимально допустимого где-то за 40 мс — опять же, раньше, чем процесс измерения завершится, в итоге измерения не состоятся вообще.

        2 термодатчика, одновременно делающих преобразование:

        смогут закончить начатое измерение термпературы при любой настроенной точности (от 8 бит до 12 бит — 94...750 мс)

        Но это пуллап к идеальной +5V-шине. Без учёта «стабилитронного» подхода.


        1. JBFW Автор
          18.01.2025 03:46

          Один вопрос: вы это ДЕЛАТЬ пробовали сами, или только в программе посчитали? )

          - ваш Паваротти - хрень полная!
          - а где ты его слушал?!
          - да мне сосед вчера напел...

          Там всё совершенно не так как вы рассчитываете, потому что реальность далека от упрощений. Да и работает оно немного не так как вы думаете...
          Оставайтесь с нами, напишу )


        1. garageman
          18.01.2025 03:46

          Мастер шины, типично, не запускает преобразования на нескольких термометрах одновременно.


          1. JBFW Автор
            18.01.2025 03:46

            Вот именно.

            Но штатная ардуиновская библиотека запускает (потому что в куче примеров по программированию МК с 1-wire именно так написано, "для всех сразу")


            1. garageman
              18.01.2025 03:46

              Ну, это же пример... Просто скелет для понимания принципа.
              Соверешенно аналогичное, спрашивают меня про демо-скрипт в 20 строчек: "А как он будет реагировать на <возможная ошибка>?".
              Ну и даю ссылку на боевую реализациюю, в которой те ж 20 строк и еще 300 - проверки и обработки нештатного поведения.


              1. HardWrMan
                18.01.2025 03:46

                боевую реализациюю, в которой те ж 20 строк и еще 300 - проверки и обработки нештатного поведения

                Жиза. Помню, какую анальную эквилибристику надо делать для обработки ошибок и внештатных состояний у I2C контроллера в STM32... Там ещё из ерраты 2 абзаца кода надо учитывать...


                1. garageman
                  18.01.2025 03:46

                  А если говорить про "штатную" реализацию в ардуино IDE i2c - то там, ЕМНИП можно так и остаться в while библиотеки при отсутствии адресуемого на линии. Ну или если устройство пропустило команду.


                  1. HardWrMan
                    18.01.2025 03:46

                    Кошмар!