Подключаем длинную линию 1-wire к Ардуино

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

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

923a9900c25068fd003e34e271e2365f.png

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

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

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

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

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

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

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

c8044c743eeabaa88ee45a549b26d9a1.png

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

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

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

1c341e8caba7284136c53fa1e8419566.png

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

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

© Habrahabr.ru