Основные тезисы или о чем эта статья
Очередная статья о ShIoTiny — визуально программируемом контроллере на базе чипа ESP8266. В статье описаны особенности подключения датчиков различных типов к бинарным входам контроллера ShIoTiny. Кроме того, имеются ответы на ряд популярных вопросов читателей предыдущих статей серии.
Предыдущие статьи серии
ShIoTiny: малая автоматизация, интернет вещей или «за полгода до отпуска»
ShIoTiny: узлы, связи и события или особенности рисования программ
ShIoTiny: вентиляция влажного помещения (проект-пример)
Бинарные прошивки, схема контроллера и документация
Вступление или ответы на вопросы
Все мои статьи на тему ShIoTiny, кроме первой, появились на свет из вопросов читателей, рискнувших попробовать мою прошивку.
Дело в том, что отвечать подробно и всем сразу — я не имею возможности. Хобби есть хобби и посвятить ему столько времени сколько работе, домашним делам или детям — редко кому удается. Не удается и мне. Да и вопросы из писем по сути можно свести к нескольким. Поэтому проще написать статью, подробно охватывающую несколько вопросов, чем писать десяток писем.
Множество вопросов касается того, как подключить датчики различного типа и как с ними работать. Это и не удивительно: работа с выходными реле довольно проста. А что только не хотят подключить ко входам! Тут вариантов масса. Этому и посвящена сегодняшняя статья и будет, скорее всего, посвящена следующая: очень обширная тема — подключение датчиков.
Но, прежде чем перейти к жизнеописанию удивительного мира датчиков, позволю себе использовать хабр как СМИ чтобы ответить на самые популярные вопросы, которые задают мне в письмах.
Ответы на самые популярные вопросы читателей
Наверное самый популярный вопрос — «а почему у вас нет поддержки ШИМ/DS1821/RTC… и так далее?». Отвечаю. Потому что, когда я проектировал именно ShIoTiny — мне это было не надо. Что касается ШИМ, то его просто некуда вывести на плате ShIoTiny. Для подключения RTC не осталось ног. И так далее. Но если проект достаточно успешно будет развиваться — я сделаю другое устройство с такой же идеологией программирования, но с другим набором периферии. Конечно, кое-какие дополнительные чипы я поддержу и в ShIoTiny, как поддержал, например, буквально вчера датчик температуры DS1820/22. Но нельзя объять необъятное и впихнуть невпихуемое. Память контроллера, как и мое время — не безграничны.
Следующий по популярности вопрос — «планируете ли вы серийно выпускать ShIoTiny?». Отвечу подробно. В данный момент у меня есть еще несколько плат и если кому интересно — пишите, вышлю. Если они к тому времени останутся, конечно. Серийно (имеется ввиду 50-100 штук) выпускать опять же в данный момент не планирую. Просто нет такого спроса, а выпустить скажем 50 плат — это не так то просто для хобби и встанет в большую для меня сумму. Будет много желающих получить готовую плату — ситуация может измениться. Так что если не все, то многое зависит от мнения и желания общества.
Еще один вопрос, задаваемый весьма часто: «где взять исходники?». Отвечаю. В данный момент — нигде. По некоторым причинам выложить их я пока не могу и не знаю смогу ли в обозримом будущем.
И, наконец, вопросы по MQTT и UDP multicast. По этим вопросам я надеюсь сделать отдельную статью, потому что особенностей много. Кое-что по MQTT есть в предыдущей статье про систему вентиляции, но там все описано в общих чертах. И еще — читайте инструкцию. Там есть многие ответы, хоть это пока и черновик.
На этом закончим с популярными вопросами и займемся, наконец, тем, ради чего и писалась эта статья — удивительным, прекрасным, пугающим и загадочным миром датчиков.
Датчик — что это и зачем оно?
Любая надпись на неизвестном языке — всего лишь сложный узор для того, кто никогда не видел букв или иероглифов. Для слепых не существует картин. Для глухих — музыки. К чему это я? А к тому, что информация — это условное отображение предмета или явления на каком-либо материальном носителе. Информации без материального носителя не существует. Равно как не существует информация и без того, кто способен ее понять.
Поэтому, если мы хотим, чтобы наш ShIoTiny не был «слепым», «глухим» и «неграмотным» — мы должны научить его «воспринимать» и «понимать» информацию об окружающем мире и на ее основе принимать те или иные решения по управлению нужным нам оборудованием.
Информация об окружающем мире существует в самых разнообразных представлениях и на различных материальных носителях: колебания воздуха — звук и поток фотонов — свет; концентрация водяных паров в воздухе и температура земли; наличие или отсутствие массы и ее величина. И так далее. Все это может нести для нас нужную для принятия решений информацию.
Но наш микроконтроллер ESP8266 — основа ShIoTiny — понимает только два вида информации — цифровые бинарные сигналы 0В — 3В и аналоговые сигналы в диапазоне от 0В до 1В.
Следовательно, нам требуются «переводчики» с языка того или иного физического явления или физической величины на язык электрических сигналов, понятных микроконтроллеру ESP8266. Такие «переводчики» и называются датчиками.
Строго говоря, в нашем случае, датчик — это техническое средство, которое преобразует информацию об окружающем мире в понятные электронным компонентам контроллера ShIoTiny электрические сигналы.
Датчики бывают разные. Их тысячи и тьмы. Но если начать разбираться, то все не так страшно. Во-первых, нас интересуют только датчики, которые на выходе генерируют электрический сигнал. Во-вторых, мы ограничимся только популярными типами датчиков. И, в-третьих, на практике не так уж много типов генерируемых датчиками сигналов.
С «во-первых» — все понятно. Подключить непосредственно к ShIoTiny датчик, выдающий информацию в механическом, гидравлическом или пневматическом виде — физически невозможно.
С «во-вторых» — тоже все ясно. Вряд ли кто-то будет подключать к ShIoTiny специфические датчики-уловители быстрых частиц или измерители pH в расплаве радиоактивного лития. Ну а если кто и будет — я думаю, что его квалификация куда выше моей и статья эта ему скорее всего не понадобится. А вот температура воды или воздуха, давление воздуха или воды, влажность, освещенность, уровень жидкости или состояние двери (открыта-закрыта) — это все как раз очень даже может измеряться контролером ShIoTiny в бытовых системах управления.
Разберемся с «в-третьих». Какие электрические сигналы обычно бывают на выходе распространенных типов датчиков? Можно выделить три основных вида сигналов на выходах датчиков:
Бинарные сигналы. То есть сигналы, имеющие лишь два уровня — логический 0 или логическую 1. Электрические параметры не важны — их всегда можно преобразовать к нужным уровням.
Аналоговые сигналы. То есть ток или напряжение, изменяющиеся в зависимости от измеряемого параметра в заданном диапазоне значений.
Цифровые сигналы. Это датчики, которые общаются с микроконтроллерами по определенному протоколу.
Вот, пожалуй, и все варианты, которые можно подключить к ShIoTiny. Разумеется, что есть еще датчики с частотным выходом, фазовым выходом и датчики со всякими экзотическими выходными сигналами. Но так как к ShIoTiny их подключить напрямую нереально — то не будем о них сейчас и говорить.
Бинарные входы ShIoTiny
Начнем с простейшего — с бинарных входов ShIoTiny. Они обозначены Input1, Input2 и Input3. Так как эти входы абсолютно идентичны — будем рассматривать вход Input1. Все, что говорится об этом входе — точно так же справедливо и для двух других бинарных входов — Input2 и Input3.
Схема бинарного входа ShIoTiny приведена на рисунке. Сразу оговорюсь, схема с небольшим изъяном — надо было резистор 10К подключать до резистора 1К. Но на работу устройства это не влияет и это прекрасно. Итак, зачем так много элементов в схеме бинарного входа? Такой вопрос мне тоже задавали. Попробую на него ответить.
Бинарный вход в ShIoTiny работает на «сухой» и «мокрый» контакты. Кроме того, в схеме предусмотрена защита от перенапряжения (то есть, если на вход Input1, например, попадет 5 Вольт вместо 3х Вольт).
Защита бинарного входа
Защита от перенапряжения, которая сделана на всех бинарных входах ShIoTiny, разумеется не спасет контроллер от выгорания, если подать на его вход сетевое напряжение ~220В. Но от попадания на входы Input1,2,3 +5В или даже +12В — такая защита вполне спасает.
Работает такая защита очень просто и может применяться не только с ESP8266, но и с другими микроконтроллерами.
Рассмотрим два варианта работы защиты: при подаче на вход Input1 напряжения +5В и -5В относительно нулевого провода («земли»).
Когда напряжение на входе Input1 находится в норме — защитные диоды D1 и D2 закрыты, так как они включены в обратном направлении.
Как только напряжение на входе Input1 превысит +3В (например мы замкнули вход Input1 на +5В), тут же диод D1 открывается и притягивает вход контроллера GPIO к питанию +3В, не давая подняться напряжению на входе GPIO ESP8266 выше 3В. Реально, напряжение будет чуть выше 3В (3.2В или 3.3В) — но это не важно. Вход микроконтроллера не сгорит и это главное.
Как только напряжение на входе Input1 станет отрицательным (например мы замкнули вход на -5В), тут же диод D2 открывается и притягивает вход Input1 к «земле» 0В, не давая опуститься напряжению на входе GPIO ESP8266 ниже 0В. Реально, напряжение будет чуть ниже 0В (-0.2В или -0.3В) — но это опять же не важно. Вход микроконтроллера не сгорит.
Резистор 1К — ограничитель тока, чтобы не было короткого замыкания при работе защиты. Токи через него небольшие. Например, в нашем примере, если мы подадим на вход Input1 +5В, то ток через резистор 1К будет около 2мА. При отрицательном напряжении -5В на входе Input1 ток через резистор 1К будет около 5мА.
Если кто не понимает, почему диоды открываются и закрываются, то рекомендую почитать книгу «Электроника шаг за шагом» Р. А. Свореня. В интернете она есть, например, тут. Начинающим особенно советую — язык этой книги прост и примеров масса.
Какие бывают контакты
Итак, с защитой разобрались. Перейдем к другому фундаментальному вопросу — подключение бинарного входа ShIoTiny к бинарным датчикам.
Как мы уже говорили — бинарные датчики это такие датчики, выход которых имеет два состояния — ноль и единицу. Но это логически. А физически может быть два варианта выходов бинарного датчика: «сухой контакт» и «мокрый контакт». Рассмотрим что это такое и с чем это едят.
«Сухой контакт» — это контакт, который не имеет собственного источника напряжения. То есть просто два любых металлических проводника, которые можно замкнуть между собой и разомкнуть их. Под это определение попадают масса датчиков — кнопки, выключатели, поплавковые датчики уровня жидкости, герконы (датчики магнитного поля) и так далее. На электрических схемах нормально разомкнутые «сухие контакты» обычно обозначаются так, как показано на рисунке.
Нормально разомкнутые — это значит, разомкнутые при отсутствии внешнего воздействия — кнопка не нажата, выключатель не включен, у геркона нет поблизости магнита…
Есть также и нормально замкнутые «сухие контакты». На электрических схемах они обычно обозначаются так, как показано на рисунке.
В противоположность нормально разомкнутым, нормально замкнутые «сухие контакты» в отсутствии внешнего воздействия — замкнуты.
И те и другие «сухие контакты» можно спокойно подключать ко входам Input1,2,3 контроллера ShIoTiny. Подключаются датчики с выходом типа «сухой контакт» к бинарным входам ShIoTiny так, как показано на рисунке.
Если «сухой контакт» Input1 замкнут, то на вход контроллера подается напряжение примерно ноль вольт (точнее — 0.3Вольта из-за ошибки в схеме), так как «сухой контакт» замыкает на землю вход контроллера через делитель, образованный сопротивлениями 1К и 10К. При этом узел Input1 выставит на своем выходе единицу.
И наоборот, если сухой контакт Input1 разомкнут, то на вход контроллера подается напряжение примерно три вольта, так как вход контроллера подтянут к напряжению питания через резистор 10К. При этом узел Input1 выставит на своем выходе ноль.
Все это подробное описание — для любопытных. В сухом остатке имеем следующее: если мы подключили ко входу Input1 датчик с выходом типа «сухой контакт», то когда контакт разомкнут — на выходе узла Input1 будет ноль, а когда контакт замкнут — на выходе того же узла будет единица. Аналогично и для входов и узлов Input2 и Input3.
Перейдем к «мокрым контактам».
«Мокрый контакт» — это контакт, имеющий собственный источник напряжения хотя бы в одном своем положении. Например, выход другого контроллера или логической схемы; линия питания лампочки и так далее. Вариантов тут может быть масса. Но почти все они непосредственно или с помощью нескольких деталей позволяют согласовать бинарные входы Input1,2,3 с выходом устройства — «мокрым контактом».
Начнем с простейшего — согласование входа Input1 с выходом датчика или микросхемы типа «открытый коллектор» или «открытый сток».
По сути, в нашем случае, эта схема полностью аналогична подключению датчика с выходом типа «сухой контакт». Только роль контакта выполняет транзистор.
Схема такого подключения показана на рисунке. Суть понятия «открытый коллектор» или «открытый сток» состоит в том, что эмиттер (или исток) выходного транзистора подключен к «земле» (часто прямо внутри микросхемы), а коллектор (или сток) — подключен к «ноге» микросхемы и больше ни к чему.
Как работает эта схема понятно и новичку (не воображаемому газу, а человеку!). Как только транзистор внутри микросхемы открывается — он замыкает вход Input1 на землю и далее все работает по аналогии с «сухим» контактом.
К сожалению, далеко не все микросхемы и датчики имеют такой замечательный выход с открытым коллектором или стоком. Многие, если не большинство микросхем и датчиков имеют активный выход. Это значит, что когда у нас на выходе логическая единица — то выход «подтянут» к напряжению питания, а когда логический нуль — выход «подтянут» к земле. Выход такой микросхемы показан на рисунке ниже. Разумеется всё упрощённо.
Как нам быть, если микросхема или датчик, которую мы хотим подключить ко входу Input1, имеет такой активный выход?
Варианта тут два и зависят они от значения напряжения питания микросхемы или датчика Vcc.
Если напряжение питания микросхемы или датчика Vcc такое же как и у ESP8266 (то есть 3 Вольта) — то можно просто подключить этот выход ко входу Input1, что собственно и показано на предыдущем рисунке.
А как быть если питание датчика или микросхемы скажем +5В или +12В? В нашем случае, можно поступить довольно просто, включив диод Шоттки, как показано на рисунке ниже.
И еще один нюанс: все схемы с «мокрым» контактом у нас дают инверсный сигнал. То есть когда на выходе датчика или микросхемы логическая единица, то узел Input1 будет выставлять на выходе нуль. И наоборот. Но это исправляется программно — достаточно вставить узел-инвертор на схему. Все это показано на рисунке.
Вот, собственно и все основное, что надо знать о подключении датчиков к бинарным входам Input1,2,3.
Разумеется, что теоретически могут быть и другие варианты, но я показал самые простые и распространенные способы подключения датчиков с выходами типа "сухой контакт" и низковольтными активными выходами.
Трепет контактов
Контакты трепещут. Не от страха перед создателем устройства, а от того, что они упруги. Когда вы нажимаете кнопку — контакты могут замкнуться-разомкнуться 5-7 раз, прежде, чем стабильно замкнутся. Такое же явление возникает и при отпускании кнопок. И называется это явление — "дребезг контактов".
Дребезг контактов — проклятие всех механических контактных датчиков — переключателей, кнопок, герконов и так далее. Неприятен дребезг тем, что вызывает ложные нажатия или ложные отпускания кнопки или контакта.
Бороться с этим неприятным явлением можно по-разному. Наверное самый старый способ борьбы — триггерный. При этом способе применяется кнопка с переключающим контактом и обычный RS-триггер, включенные по схеме, как показано на рисунке.
Как это работает? Очень просто. Триггер имеет два состояния. Пока кнопка замкнута на вход R триггера — на выходе Q триггера установлен ноль.
Мы нажали кнопку — пока средний контакт кнопки не коснулся нижнего — ничего не меняется, на выходе триггера нуль. Как только средний контакт кнопки коснулся нижнего контакта той же кнопки и замкнул вход триггера S на землю — на выходе триггера появляется единица. И эта единица остается пока контакты «дребезжат». Ведь для переключения выхода триггера обратно, в нуль, необходимо, чтобы вход R триггера замкнули на землю! Точно так же работает эта схема и при отпускании кнопки.
Можем ли мы сделать такую схему на ShIoTiny? Да без проблем! На рисунке она показана.
Но тратить два входа их трех на один датчик?! Да еще при том, что далеко не все датчики имеют переключающий контакт!
Нет, мы пойдем другим путем, как завещал, всем знакомый с детства гениальный теоретик В.И. Ульянов!
Второй, и самый наверное на сегодня распространенный, способ борьбы с дребезгом контактов — это программный фильтр.
Что кроется за этими умными словами? А опять же — ничего сложного. Представим, что мы не будем реагировать на «короткие» изменения состояния контактов. Например, если у нас с кнопки считывается нуль, то на короткие (скажем длительность меньше 0.3сек) всплески единицы мы забьем перестанем реагировать. И только когда у нас кнопка в течении 0.3сек будет непрерывно выдавать единицу — мы отреагируем на это. То же самое и при изменении состояния кнопки с единицы в нуль.
То есть по сути — мы переждем переходный процесс, отфильтровав короткие импульсы. Тем самым мы защитимся от дребезга и ложных срабатываний. И не нужно будет иметь переключающего контакта и RS-триггера!
Как нам это сделать практически? В ShIoTiny есть узел-фильтр, который используется для устранения дребезга подключается так как нарисовано ниже.
Фильтр Delay0/1 в данном случае игнорирует все импульсы, которые имеют длительность менее 0.4сек.
Разумеется, для разных контактов и разных датчиков длительность дребезга будет различна. Но я думаю, вы сами определитесь, какая вам нужна длительность задержки фильтра.
Заключение
В заключении хотелось бы извиниться перед теми, кому эта статья показалась излишне подробной — помните, что на хабре масса народа, который не столь умудрен опытом как вы.
В следующей статье мы разберем подключение датчиков с аналоговым выходным сигналом ко входу АЦП.
Как всегда, предложения, пожелания, вопросы, опечатки и прочее — на почту: shiotiny@yandex.ru
shiotiny Автор
Ребята, если я написал "пишите в почту" это не значит пишите ТОЛЬКО в почту:)