При разработке домашней автоматизации ("умного дома") рано или поздно возникает задача дистанционного съема показаний с бытовых приборов учета (БПУ) электроэнергии, воды, тепла, газа. Если в БПУ нет специального интерфейса для считывания показаний, то такая задача решается с помощью дополнительного устройства, которое в своей памяти будет вести копию показаний БПУ и иметь интерфейс для считывания этих показаний. Есть много вариантов реализации такого устройства на любой вкус, но практически все они требуют наличия в БПУ электронного импульсного выхода. К сожалению, далеко не все БПУ оборудованы таким выходом. В этой статье представлен обзор одного устройства, которое может работать с любым БПУ, как с импульсным выходом, так и без.
Теоретическая сторона вопроса
Как правило, БПУ кроме цифровой индикации для визуального съема показаний человеком оборудованы теми или иными средствами для возможности автоматизированного съема показаний. К таким средствам относятся:
мигающий светодиод,
колесо с прорезями или чередующейся окраской ("мельничка"),
меняющееся магнитное поле,
электронный имульсный выход
В первых трех случаях потребуется применение соответствующих датчиков: фототранзистора, инфракрасного отражателя, датчика Холла или геркона. Имульсный выход - это, как правило, "сухой контакт" (геркон), "открытый коллектор" или NAMUR.
Единицей передаваемой от БПУ информации во всех случаях будет импульс - сигнал о том, что БПУ отсчитал определенное количество единиц измеряемой им величины. Количество этих единиц - цена импульса - указывается на самом БПУ или в его паспорте. Соответственно устройство, которое потребуется для дистанционного съема показаний, функционально будет счетчиком импульсов.
Сам импульс будет соответствовать определенному переходу: из разомкнутого состояния геркона в замкнутое (или наоборот), увеличению (или уменьшению) проводимости фототранзистора или выхода NAMUR, превышению определенного порога напряжением с датчика Холла и т.п. В некоторых случаях сигнал с датчика или выхода БПУ будет соответствовать уровням TTL и его можно подавать напрямую на логические входы микросхем, во всех остальных случаях уровень сигнала потребуется сравнивать с некоторыми пороговыми значениями для искуственного преобразования в логический. Последнее можно сделать либо схемотехнически (компаратор и подстроечный резистор), либо программно (результат АЦП сравнивать с цифровым пороговым значением).
В TTL логике напряжение на логическом входе выше Vih=2В гарантированно воспринимается входом как высокий логический уровень (логическая "1"), напряжение ниже Vil=0.8В - гарантированно как низкий (логический "0"), а в промежутке - нет гарантий, как именно будет воспринято входом.
Можно ли провести кабель от датчика к серверу или контроллеру умного дома и считать импульсы самим сервером? Можно, но у такого решения есть ряд недостатков:
большое число кабелей,
высокий уровень помех (падение напряжения на длинной линии, наводки),
потеря имульсов и рассинхронизация с БПУ при любом обрыве линии или отключении сервера.
Поэтому счетчик импульсов оптимально делать в виде отдельного простого устройства с собственным источником питания и располагать непосредственно возле БПУ. Источник питания (например батарейка) может играть роль как основного (единственного) источника питания, так и резервного на случай отключения внешнего питания и должен обеспечить возможность подсчета импульсов в полностью автономном режиме работы длительное время. Устройство должно быть максимально простым как схемотехнически (чем больше дискретных компонентов, тем выше энергопотребление), так и программно (чем больше задач выполняет устройство, тем выше вероятность сбоев или пропуска импульсов).
Счетчик импульсов
Имея изложенные выше теоретические сведения, можно реализовать счетчик импульсов на микроконтроллере, а можно воспользоваться уже готовым устройством. В статье будет представлен обзор устройства Счетчик импульсов с интерфейсом 1-wire, который отвечает всем вышеперечисленным требованиям.
![](https://habrastorage.org/getpro/habr/upload_files/0c8/787/68c/0c878768c0b8837e8e040e8bf609c3d8.jpg)
С одной стороны у счетчика есть два счетных входа A и B, которые работают со всеми типами выходов БПУ и всеми применяемыми датчиками, а также выход PWR для опционального питания датчиков. С другой стороны, как следует из названия, - коммуникационный интерфейс 1-wire. Счетчик имеет разъем для батарейки CR2032 и достаточно низкое энергопотребление, чтобы продержаться на этой батарейке от нескольких месяцев до нескольких лет в случае сбоя внешнего питания.
Важной особенностью данного счетчика импульсов является встроенное преобразование аналогового сигнала на счетных входах в логический, позволяющее ему работать не только с выходами БПУ или датчиками с логическим выходом (с TTL логикой), но и с датчиками с аналоговым выходом.
Подключение к arduino
Протокол 1-wire имеет как свои преимущества, так и недостатки, одним из которых является отсутствие аппаратной поддержки в микроконтроллерах. Для подключения к arduino потребуются сразу две библиотеки: OneWire и DS2423. В первой содержится программная реализация протокола 1-wire (канальный и сетевой уровень ISO OSI), а во второй - функции работы уже со счетчиком импульсов (прикладной уровень), вместе с библиотеками в архиве есть и примеры.
У счетчика импульсов есть множество настроек, но, к сожалению, из arduino интерактивно выполнить настройку будет крайне неудобно. Поэтому настроить счетчик лучше из Linux, а затем, если требуется работа с arduino, переподключить к arduino. Счетчик не потеряет настройки при наличии хотя бы одного любого источника питания: внешнего или батарейки.
Подключение к Linux
В статье Как перестать бояться и полюбить 1-wire подробно описано подключение 1-wire устройств к Linux с помощью трех видов адаптеров: gpio, пассивного и аппаратного. Счетчик импульсов работает со всеми типами адаптеров, но он поддерживает только стандартное для 1-wire напряжение 5В. Поэтому при использовании w1-gpio в Raspberry Pi (у которой на пинах 3.3В) потребуется схема с преобразователем логических уровней:
![](https://habrastorage.org/getpro/habr/upload_files/e1b/2da/f3f/e1b2daf3f13dbd8505604a7aaf98e42c.jpg)
Подключение счетчика к Linux можно использовать как непосредственно для периодического считывания счетных регистров, так и для конфигурирования. Для обоих задач лучше всего использовать пакет OWFS, в котором счетчик имеет полную поддержку. Только для считывания счетных регистров достаточно работающего демона owserver
, а для конфигурирования понадобится запустить еще и owhttpd
.
Убедиться, что связка owserver + адаптер + счетчик работает корректно, можно командой для получения списка всех 1-wire устройств на шине:
# owdir /uncached
Адреса счетчиков будут начинаться на 1d.
Получить значения счетных регистров определенного счетчика можно командой:
# owget /uncached/1d.0410a5d4e800/counter.ALL ;echo
Конфигурирование счетчика
Когда оба демона (owserver
и owhttpd
) запущены нужно открыть страницу setup.htm и ввести IP-адрес и порт, на котором принимает соединения owhttpd
. После этого отобразится список всех найденных на шине 1-wire устройств, при этом адреса счетчиков импульсов будут активными ссылками. При нажатии на адрес нужного счетчика откроется страница его конфигурации:
![](https://habrastorage.org/getpro/habr/upload_files/137/4e0/8b6/1374e08b67ca2ae2e40708a27a2d4a0a.png)
На скриншоте представлена конфигурация, которую имеет счетчик после сброса к заводским настройкам, сброс выполняется полным обесточиванием.
Кнопка Reload
служит для считывания текущей конфигурации со счетчика и обновления ее на странице. Считывание и обновление можно зациклить опцией continuous
, для выхода из цикла опцию необходимо отключить.
Кнопка Update
служит для записи в счетчик начальных значений счетных регистров, а кнопка Save
- для записи всех настроек кроме счетных регистров. Раздельное сохранение сделано для того, чтобы запись настроек не сбивала ход счетчиков.
В строке Sens A
, Sens B
отображается текущий логический уровень со счетных входов (high
или low
), либо считанный непосредственно, либо после внутреннего преобразования аналогового сигнала в логический.
Строка Page0
показывает содержимое нулевой страницы памяти счетчика, в этих байтах закодирована конфигурация счетчика и значения счетных регистров. Точно такую же строку можно получить командой:
# owget --hex /uncached/1d.0410a5d4e800/pages/page.0
А отредактировав конфигурацию, можно записать ее обратно в память счетчика:
# owwrite --hex /uncached/1d.0410a5d4e800/pages/page.8 0000000000000000000000000013000000e0540002580017e60043431c013a01
Запись производится в страницу page.8
, это не ошибка. Страницы page.0
и page.8
содержат копии друг друга, при чтении никакой разницы нет, а при записи в page.0
реально записываются только первые 8 байт, отвечающих за значения счетных регистров, а при записи в page.8
- байты с 8 по 13, отвечающие за конфигурацию. Более подробно о назначении байтов можно узнать на странице. По сути это низкоуровневый способ конфигурирования счетчика. Если посмотреть исходник страницы setup.htm, то она с помощью XMLHttpRequest
обращается к owhttpd
и делает то же самое.
Параметры конфигурации счетчика
Параметры threshold falling
и threshold rising
принимают значения от 0 до 255 и служат для преобразования аналогового сигнала в логический. Если уровень сигнала после АЦП больше или равен threshold rising
, счетчик преобразовывает его в high
, если меньше или равен threshold falling
- то в low
, а если в промежутке, то оставляет предыдущее значение. Таким образом реализован гистерезис, используемый для устранения эффекта дребезга. Если установлено threshold falling
>= threshold rising
, то преобразование отключено и счетный вход настроен на прием логического сигнала.
Параметр increment on falling
/rising
/both edge(s)
задает момент, когда увеличивать значение счетчика - по переходу из high
в low
, по переходу из low
в high
, или по любому изменению логического уровня.
Параметр pullup
указывает, следует ли подключать внутренний резистор подтяжки между счетным входом и питанием. Правило такое: если датчик сам создает на своем выходе уровень напряжения, то pullup
не нужен, а если датчик только изменяет свою проводимость, то pullup
нужен. Опция pullup
это не то же самое, если бы подключить внешний резистор подтяжки, разница в том, что внутренний резистор подключается только кратковременно перед опросом счетного входа.
Параметр sensors power
задает поведение выхода PWR для питания датчиков, питание можно отключить (off
), включить непрерывно (always on
) или включить импульсно (pulse on
), в последнем случае питание будет включаться кратковременно непосредственно перед опросом счетных входов. Есть одно "но" - ток через выход PWR очень сильно ограничен, запитать от него получится только экзотические датчики с микроамперным потреблением (например датчика Холла SM351LT/SM353LT), или использовать его для управления затвором полевого транзистора. Полезным является только четвертый режим pulse on, swap B & PWR
. В этом режиме назначение выводов B и PWR меняется местами, т.е. счетными входами становятся выводы A и PWR, а питание для датчиков берется с вывода B. В этом режиме уже нет ограничений по току питания датчиков, питание включается только кратковременно непосредственно перед опросом счетных входов.
Пареметр pullup/poweron pulse duration
(задержка перед замером) задает промежуток времени между моментом включения питания датчиков (если используется режим импульсного питания) и подключения резисторов подтяжки (если разрешены) и моментом опроса счетных входов. Эта задержка необходима датчику для включения, завершения переходных процессов и выхода на стабильный режим работы. Очевидно, что данный параметр непосредственно влияет на среднее энергопотребление, поэтому установить нужно минимальное приемлемое значение. Выбрать можно из вариантов: 25мкс, 50мкс, 125мкс и 425мкс.
Параметр sampling period
(периодичность замеров) определяет, какой минимальной продолжительности сигнал высокого либо низкого уровня будет гарантированно замечен счетчиком. Например, продолжительность вспышки светодиода (соответствует низкому уровню сигнала с фототранзистора) составляет 100мс, но вспышки могут следовать редко, а могут и так часто, что интервал между вспышками (соответствует высокому уровню сигнала) будет 50мс. Поэтому периодичность замеров необходимо устанавливать меньше, чем минимальное из значений. Параметр также влияет на энергопотребление. На выбор доступно: 19мс, 38мс, 75мс, 150мс.
Откуда взялось 50мс? Решаем задачу: БПУ выдает 2000имп/1кВтч, сколько будет импульсов в секунду при потреблении 12кВт? Ответ: 12*2000 = 24000имп/ч, 24000/3600 = 6.67имп/сек, а период будет 1/6.67 = 0.15сек = 150мс, из них 100мс низкий уровень и 50мс - высокий.
К сожалению, два последних параметра нельзя установить раздельно для каждого из двух каналов. Например, может возникнуть ситуация, когда один датчик потребляет очень большой ток, ему подошло бы минимальное значение параметра задержка перед замером и тогда потребление было бы на приемлемом уровне, но второму датчику (совсем другого типа) требуется максимальное значение задержки, тогда придется установить именно это значение, что приведет к повышенному энергопотреблению за счет первого датчика. Хоть ситуация и редкая, т.к. датчики для рядом расположенных БПУ обычно однотипные, но в случае ее возникновения может быть лучше использовать два счетчика импульсов.
Режим измерений
Чтобы установить параметры threshold falling
и threshold rising
для работы с аналоговым датчиком, их значения нужно откуда-то взять. Поскольку с этими значениями сравнивается уровень сигнала после АЦП, то необходимо, чтобы была возможность мониторить этот уровень, и тогда можно будет подобрать необходимые значения для threshold. Часто уровень, который нужно было бы измерить, присутствует очень короткий промежуток времени, типичный пример - вспышка светодиода, "поймать" вспышку, чтобы во время нее измерить уровень сигнала, крайне сложно.
В счетчике импульсов эта задача решена следующим образом. Есть "режим измерений", в котором непрерывно накапливается статистика минимального и максимального значения (диапазон) уровня сигнала после АЦП. Статистику можно читать со счетчика, а также в любой момент ее можно обнулить, счетчик тут же продолжит накапливать ее снова.
![](https://habrastorage.org/getpro/habr/upload_files/70c/aee/04a/70caee04ae9a13db3a8c091f5c5adbd5.png)
На скриншоте показана страница конфигурации с включенным режимом измерений, в котором появляются дополнительные данные Min
, Max
и Samples
.
В накоплении статистики участвуют не все значения уровня, а только те, которые получены при соблюдении определенных условий. Вот эти условия:
уровень сигнала получен с канала A (или B),
после преобразования сигнала в логический он был low (или high),
во время чтения уровня счетчик питался от 1-wire (или от батарейки).
Все три условия должны соблюдаться одновременно.
Полезным для "отлова" вспышек будет второе условие. Работает это так: сначала необходимо узнать уровень сигнала, когда нет вспышек (в режиме темноты), затем установить threshold falling
и threshold rising
немного ниже этого уровня (не забываем, threshold rising
должен быть хотя бы на единицу больше threshold falling
, чтобы преобразование включилось). Теперь все, что больше threshold, счетчик будет преобразовывать в high
, это во время темноты, а все, что ниже, - в low
, это во время вспышки. Если включить режим измерений с условием low
, то счетчик сам будет "ловить" вспышки - в статистику минимального и максимального значений уровня попадут только те, которые были во время вспышек. Очень подробно этот алгоритм будет рассмотрен ниже в примере для фототранзистора.
Кроме этого счетчик еще и сосчитает, сколько значений прошло через фильтр и попало в статистику. Разделив это количество на количество импульсов, которые счетчик насчитал за тот же промежуток времени, можно узнать среднюю продолжительность одной вспышки.
Неприятным моментом является то, что при выходе из режима измерений в счетных регистрах появляются большие случайные значения. И при включении режима измерений статистика начинает вестиcь с каких-то случайных величин. Причина в том, что для статистики используются старшие разряды счетных регистров. Поэтому после включения режима измерений необходимо сразу обнулить статистику, а после выхода из режима - заново установить начальные значения счетчиков.
Примеры подключения датчиков
Ниже будут рассмотрены схемы подключения и соответствующая конфигурация счетчика для популярных датчиков и выходов БПУ. Чтобы не описывать всю конфигурацию, будут описаны только отличия, которые нужно внести относительно заводской настройки (для сброса счетчика к заводской настройке его необходимо полностью обесточить).
Для каждого примера будут сделаны измерения тока потребления от батарейки (с отключенным интерфейсом 1-wire) с настроенным одним датчиком и двумя одинаковыми датчиками. Параметр задержка перед замером будет использован минимальный, при котором датчик уверенно работает. Т.к. параметр периодичность замеров зависит не от типа датчика, а от БПУ, то измерения будут сделаны для самого минимального и самого максимального значения этого параметра.
Измерения будут проводиться обычным мультиметром. Хоть это и не правильный способ измерения микротоков и, тем более, импульсных, но в данном случае не важна точноcть, а нужен только порядок величины.
Правильно было бы питать счетчик от заряженного ионистора, затем измерять, на сколько упало напряжение на ионисторе, отсюда вычислять, какой заряд прошел через счетчик, а заряд деленный на время даст ток.
![](https://habrastorage.org/getpro/habr/upload_files/dac/57a/260/dac57a260062d1d65e63f44ad0f2df37.jpg)
На фото показан способ подключения и пример потребления счетчика импульсов с заводскими настройками без подключенных датчиков. Напряжение на батарейке, которая участвует в тестировании, равно 3.2В (не первой свежести).
Как рассчитать время работы от батарейки? Решаем задачу: емкость CR2032 около 210мАч, ток потребления устройства 3мкА, отсюда теоретическое время работы устройства: 210/0.003 = 70000ч, 70000/24/365.25 = 8лет. При увеличении потребления время уменьшится пропорционально, например, при 6мкА составит 4года.
Если счетчик подключить к интерфейсу 1-wire, то ток потребления от батарейки стает нулевым, т.е. счетчик при наличии внешнего питания, хоть VCC, хоть "паразитного", вообще не расходует заряд батарейки.
Естественно, приведенные далее примеры не означают, что можно подключать только два однотипных датчика, датчики могут быть и разного типа.
Пример 1: геркон
К этому типу также относятся выходы БПУ сухой контакт, открытый коллектор, оптрон, кнопка и все, что меняет свое сопротивление от почти бесконечного до почти нуля. После сброса счетчика к заводским настройкам, оба счетных входа настроены на работу именно с этим типом выхода/датчика. Для данного выхода/датчика подходит заводская настройка параметра задержка перед замером, равная 25мкс.
Измеренный ток потребления составляет от 3мкА при периодичности замеров 150мс (заводская установка) до 6мкА при 19мс, и не зависит от количества подключенных датчиков этого типа.
Пример 2: NAMUR
![](https://habrastorage.org/getpro/habr/upload_files/dcf/701/d0b/dcf701d0bc0c5871cd5be87f9aa6392f.jpg)
Если посмотреть эквивалентную схему выхода NAMUR, то видно, что сопротивление этого двухполюсника может иметь два конечных ненулевых значения (например 1кОм и 11кОм), а нулевое и бесконечное служат для выявления КЗ или обрыва линии. Для работы с этим выходом счетный вход необходимо перевести в аналоговый режим. Подходящими значениями конфигурации для этого будут: threshold falling
= 20, threshold rising
= 30, это единственное изменение относительно заводских настроек, которое необходимо внести для счетного входа, к которому подключен NAMUR.
Откуда взялись значения 20 и 30? Согласно описанию выхода NAMUR при подаче на него напряжения 8.2В потечет ток, если ток выше 2.1мА, то это одно состояние, если ниже, то другое. Таким образом пороговое сопротивление 8.2/2.1 = 3.9кОм. Сопротивление внутреннего резистора подтяжки счетчика импульсов около 35кОм, на образованном делителе напряжения АЦП выдаст результат 3.9/(35+3.9)*256 = 25.7, осталось прибавить небольшой гистерезис.
В счетчике импульсов не предусмотрено распознавание КЗ или обрыва линии, о которых может сообщать NAMUR, но для короткой линии это не актуально.
Измеренный ток потребления составляет от 4мкА при периодичности замеров 150мс до 9мкА при 19мс, и не зависит от количества подключенных датчиков этого типа.
Пример 3: фототранзистор
![](https://habrastorage.org/getpro/habr/upload_files/b59/0d2/a14/b590d2a1412969a277540b355a8a1b23.jpg)
К этому типу в некоторых случаях необходимо также отнести выходы БПУ открытый коллектор и оптрон. Разница с первым примером в том, что сопротивление может меняется не от почти бесконечности и не до почти нуля, поэтому не получится использовать логический режим счетного входа. Параметры threshold для аналогового режима нужно подбирать для каждого конкретного случая. Причем их нужно подобрать так, чтобы threshold одинаково четко разделяли сигнал при работе счетчика и от внешнего питания, и от батарейки, это связано с нелинейность ВАХ данного выхода/датчика.
Для понимания принципа подбора параметров threshold будет рассмотрен случай вспыхивающего светодиода, когда есть длительные промежутки без вспышек и короткие вспышки:
выставить
threshold falling
= 0,threshold rising
= 1 и режим измеренийX high @ Ext pwr
, гдеX
это исследуемый канал A или В;нажать
Reset
и определить диапазон значений, соответствующих "темноте", когда светодиод на БПУ не мигал ни разу (для этого послеReset
подождать и нажатьReload
). Например, диапазон оказался таким: 80..120. Выполнить п.2 несколько раз для исключения ошибок;выставить
threshold falling
= 75,threshold rising
= 76, т.е. чуть меньше минимального значения из п.2, и режим измеренийX low @ Ext pwr
;нажать
Reset
и определить диапазон значений, соответствующих горящему светодиоду, для этого дождаться нескольких вспышек (и нажатьReload
). Например, диапазон оказался таким: 7..15. Также выполнить п.4 несколько раз;выставить
threshold falling
= 0,threshold rising
= 1 и режим измеренийX high @ Bat pwr
;нажать
Reset
, отключить счетчик от 1-wire, подождать и снова подключить к 1-wire, если светодиод в этот промежуток мигнул хоть раз, повторить п.6 с начала. Таким образом будет определен диапазон значений, соответствующих "темноте", но в отличие от п.2 это значение получено при питании счетчика от батарейки. Например, диапазон оказался таким: 65..109. Выполнить п.6 несколько раз для исключения ошибок;выставить
threshold falling
= 60,threshold rising
= 61, т.е. чуть меньше минимального значения из п.6 и режим измеренийX low @ Bat pwr
;нажать
Reset
, отключить счетчик от 1-wire, подождать несколько вспышек и снова подключить к 1-wire. Таким образом будет определен диапазон значений, соответствующих горящему светодиоду, но в отличие от п.4 это значение получено при питании счетчика от батарейки. Например, диапазон оказался таким: 8..21. Также выполнить п.8 несколько раз;Объединить диапазоны п.2 и п.6, будет 65..120 и диапазоны п.4 и п.8, будет 7..21. Искомые рабочие значения threshold будут в промежутке, можно установить, например,
threshold falling
= 30,threshold rising
= 40, после этого отключить режим измерений и установить начальные значения счетчиков.
Значение параметра задержка перед замером осталось минимальным 25мкс, но если у выхода/датчика окажется очень большая емкость, то в режиме темноты могут не успевать закончится переходные процессы и разрыв между диапазонами будет очень мал, чтобы уверенно разделять сигнал на два состояния, в этом случае может потребоваться увеличить задержку перед замером и повторить весь алгоритм.
При работе с фототранзистором очень важно защитить его от проникновения постороннего света, например, солнечных лучей, фонарика и т.п.
Ток потребления с датчиком фототранзистор ровно такой же, как для NAMUR - от 4мкА при 150мс до 9мкА при 19мс.
Пример 4: инфракрасный отражатель TCRT5000
![](https://habrastorage.org/getpro/habr/upload_files/dc5/b1c/aeb/dc5b1caebd284cc46753fd364aace349.jpg)
Конструктивно инфракрасный отражатель (его еще называют фотопрерывателем) состоит из инфракрасного светодиода и фототранзистора, поэтому отличие настройки от примера с фототранзистором будет состоять только в настройке питания для светодиода. Естественно, для питания подойдет только режим pulse on, swap B & PWR
, в этом режиме к B подключаются светодиод(ы), а к A и PWR - фототранзисторы. TCRT5000 отлично работает при минимальном параметре задержка перед замером 25мкс. При тестировании датчик размещался в закрытой картонной коробке и уверенно определял наличие или отсутствие перед ним белого фона на расстоянии около 3см, это даже больше, чем нужно.
Принцип работы отражателя состоит в изменении проводимости фототранзистора от воздействия отраженного или рассеянного света предметом, помещенным перед ним. Отражатель реагирует как на появление предмета, например, стрелки, так и на изменение цвета фона перед ним и может работать через стекло.
Для понимания принципа подбора параметров threshold будет рассмотрен случай, когда фон перед датчиком меняется не скачкообразно, а плавно и есть возможность установить перед датчиком нужный варианта фона, например, открыв кран с водой, подождав поворота колеса с фоном в БПУ на нужный угол и закрыв кран:
выставить
threshold falling
= 0,threshold rising
= 1 и режим измеренийX high @ Ext pwr
, гдеX
это исследуемый канал A или В;выбрать режим
continuous
и нажатьReload
, заставить фон перед датчиком медленно меняться, нажатьReset
, дождаться когда максимальное значение перестанет расти и сразу остановить изменение фона, отключитьcontinuous
;нажать
Reset
и определить (подождав и нажавReload
) диапазон значений, соответствующих максимально темному фону (на самом деле это будет не точный максимум, но для нахождения threshold это не принципиально). Например, диапазон оказался таким: 62..76. Выполнить п.3 несколько раз для исключения ошибок;установить режим измерений
X high @ Bat pwr,
нажатьReset
, отключить счетчик от 1-wire, подождать и снова подключить к 1-wire. Таким образом будет определен диапазон значений, соответствующих темному фону, но в отличие от п.3 это значение получено при питании счетчика от батарейки. Например, диапазон оказался таким: 68..91. Выполнить п.4 несколько раз для исключения ошибок;выбрать режим
continuous
и нажатьReload
, заставить фон перед датчиком медленно меняться, нажатьReset
, дождаться когда минимальное значение перестанет уменьшаться и сразу остановить изменение фона, отключитьcontinuous
;нажать
Reset
и определить диапазон значений, соответствующих максимально светлому фону. Например, диапазон оказался таким: 8..11. Выполнить п.6 несколько раз для исключения ошибок;установить режим измерений
X high @ Bat pwr
, нажатьReset
, отключить счетчик от 1-wire, подождать и снова подключить к 1-wire. Таким образом будет определен диапазон значений, соответствующих светлому фону, но в отличие от п.6 это значение получено при питании счетчика от батарейки. Например, диапазон оказался таким: 15..25. Выполнить п.7 несколько раз для исключения ошибок;Объединить диапазоны п.3 и п.4, будет 62..91 и диапазоны п.6 и п.7, будет 8..25. Искомые рабочие значения threshold будут в промежутке, можно установить, например,
threshold falling
= 30,threshold rising
= 40, после этого отключить режим измерений и установить начальные значения счетчиков.
Ток потребления с одним датчиком TCRT5000 от 6..19мкА при 150мс до 89..92мкА при 19мс (показания мультиметра скачут, поэтому указано минимальное и максимальное из показаний), при двух датчиках - от 7..20мкА до 91..94мкА соответственно.
То, что при одном и при двух датчиках потребление примерно одинаковое, говорит о том, что ток светодиодов ограничивается максимальным током выхода питания счетчика, этот максимальный ток идет либо через один светодиод, либо распределяется поровну через два. Светодиоды не сгорают потому, что ток импульсный, по даташиту данный светодиод может выдержать ток до 3А при импульсах 10мкс. Ток правильно было бы ограничить, например, до около 10мА, это снизит энергопотребление и немного ухудшит чувствительность датчика. При напряжении питания около 3В и падении напряжения на светодиоде 1.25В, сопротивление токоограничивающего резистора должно быть порядка (3-1.25)/0.01 = 185 Ом.
Были протестированы резисторы 150 Ом и 270 Ом, с первым ток потребления составил от 5..11мкА / 6..15мкА (один и два датчика) при 150мс до 45..46мкА / 66..67мкА (один и два датчика) при 19мс, со вторым соответственно: от 4..7мкА / 5..10мкА до 26..27мкА / 40..41мкА. В обоих случаях можно было подобрать значения threshold для уверенного распознавания белого фона на расстоянии 1см, даже несмотря на то, что при сопротивлении 270 Ом диапазоны сигнала при работе от внешнего питания и от батарейки уже сильно отдалились друг от друга. Последнее говорит о том, что свет от светодиода уже очень сильно терял яркость при батарейном питании.
![](https://habrastorage.org/getpro/habr/upload_files/b39/35d/4fd/b3935d4fde5a87e937a598eeab710e61.jpg)
Таким образом можно рекомендовать подключение токоограничивающего резистора 150..200 Ом в цепи каждого светодиода, это без ущерба работоспособности снизит ток потребления.
Кроме TCRT5000 существуют и другие отражатели, например: KTIR0811S, QRD1114, которые устроены аналогично, имеют схожие электрические характеристики и отличаются только корпусом. Поэтому их также можно применять со счетчиком импульсов.
Пример 5: датчик Холла SS49E
![](https://habrastorage.org/getpro/habr/upload_files/171/304/6c6/1713046c67d6454a91de48f3b52909fa.jpg)
По даташиту датчик работает от напряжения 2.7..6.5В, потребляет около 6мА, имеет время реакции 3мкс и на выходе сам создает напряжение, пропорциональное магнитному полю. Поэтому для питания датчика потребуется включить режим pulse on, swap B & PWR
, оставить задержку перед замером на минимальном уровне 25мкс и отключить резистор подтяжки на счетном входе, т.к. в данном случае он не нужен.
Т.к. выход аналоговый, то потребуется подобрать и установить значения threshold. В случае, когда на датчик воздействует движущийся постоянный магнит, например, прикрепленный к колесу внутри БПУ, уровень сигнала с датчика будет меняться не скачкообразно, а плавно. Если есть возможность заставить колесо медленно вращаться и есть возможность остановить его в нужный момент, например, включая и выключая подачу газа, то для нахождения threshold нужно воспользоваться алгоритмом из примера для инфракрасного отражателя, принцип будет один и тот же.
При тестировании были получены следующие значения уровня сигнала с датчика: в отсутствие магнитного поля при питании от 1-wire - 119..120, при питании от батарейки - 113..131, при расположении одного полюса неодимового магнита на расстоянии 1см от датчика - 63..65 / 88..97 (при питании от 1-wire / от батарейки), при расположении другого полюса на расстоянии 1 см - 182..183 / 142..147.
Таким образом, threshold нужно подбирать между 97 и 113 или между 131 и 142 в том случае, если к датчику периодически приближается только один из полюсов, например, можно установить threshold falling
= 102, threshold rising
= 108 или threshold falling
= 135, threshold rising
= 138. Если же магнит поочередно поворачивается к датчику то одним, то другим полюсом, то можно установить threshold falling
= 115, threshold rising
= 130. Для последнего случая сигнал будет уверенно разделяться на два состояния, но для однополюсного варианта диапазон уже будет очень узким. Если для реального БПУ возникла такая ситуация, то лучше рассмотреть другой датчик Холла, расчитанный на меньшие магнитные поля.
Кроме аналоговых существуют и цифровые датчики Холла, отличие в том, что пороговые уровни и гистерезис зашиты в датчик производителем, датчик на выходе выдает уже преобразованный логический сигнал, а порог срабатывания можно изменить только подбором расстояния установки. Пример такого цифрового датчика Холла - TLE4906, он работает от напряжения 2.7..24В, потребляет 4мА, имеет время включения 15мкс и тип выхода открытый коллектор - с таким датчиком счетчик также будет прекрасно работать. Порог срабатывания TLE4906 составляет 8.5..10мТл = 85..100 Гс, для сравнения: при тестировании SS49E магнитное поле составляло около 700 Гс, а подбираемый threshold соответствовал примерно половине. Т.е. TLE4906 лучше подойдет для более слабых магнитных полей.
Ток потребления с одним датчиком SS49E от 5..7мкА при периодичности опроса 150мс до 22мкА при 19мс, при двух датчиках - от 5..9мкА до 37..38мкА соответственно. Грубо говоря, за счет импульсного режима питания счетчик снижает энергопотребление одного датчика с 6мА до 4..20мкА, это в 300 и более раз.
Выводы
Счетчик импульсов смело можно охарактеризовать как "швейцарский нож" для задачи дистанционного съема показаний с бытовых приборов учета - он может снимать показания практически с любого БПУ. Счетчик работает и со всеми типами импульсных выходов БПУ, и с широким набором датчиков, позволяет питать датчики и при этом значительно снижать их среднее энергопотребление. Время автономной работы при использовании рассмотренных датчиков может составлять 1-5 лет. А при том, что заряд батарейки расходуется только при обрыве линии или выключении 1-wire адаптера, об этом можно вообще не беспокоиться, просто планово менять батарейку, например, раз в 5 лет. Кстати, батарейку можно поменять без потери настроек, если есть питание от 1-wire. Дистанционный мониторинг напряжения батарейки также предусмотрен.
К недостаткам можно отнести интерфейс 1-wire, аппаратной поддержки которого нет в микроконтроллерах, и уже тот факт, что это проводной интерфейс (актуально для любителей беспроводных решений). Также минусом для владельцев Raspberry Pi будет невсеядность счетчика по отношению к напряжению шины 1-wire - 3.3В ему не подойдет, поэтому потребуется преобразователь.
Еще к недостаткам можно отнести сложный алгоритм настройки аналоговых датчиков, но от этого никуда не деться - в альтернативном случае, при применении компараторов, пришлось бы выполнять настройку подстроечным резистором.
Применение счетчика не ограничивается только дистанционным съемом показаний с БПУ, его можно применить везде, где есть что посчитать, например, в метеостанции измерять скорость ветра или количество осадков, в СКУД количество проходов через турникет и т.п.