1-wire для кнопок с индикацией

Задумал я как-то в одной из конструкций применить вот такую кнопку с индикацией состояния: image

Внутри — пара замыкающих или переключающих контактов и светодиод (опционально — уже с гасящим резистором на выбор для питания от 5, 12, или 24 В). Все бы с ней хорошо, но разместить кнопку планировал на приборной панели автомобиля, а управляющий блок — в моторном отсеке. А тянуть отдельные провода для контакта и для индикации уж очень не хотелось.

Как это решить, и что для этого нужно — под катом

В итоге в голову пришло вот такое решение:

19d2284ceb9c422e862728410ee1baef.jpg

Работать будет с портами ВВ микроконтроллера, для которых есть: a) двунаправленный режимб) безопасное ограничение по выходному току (в STM32 ЕМНИП регулируется программно)в) виртуальный порт, позволяющий считывать сигнал прямо с выводов (в AVR PINx)

Алгоритм такой:

1. периодически проверяем бит порта PIN, к которому подключена кнопка (например, раз в 20 мс)1а. на время проверки, если выходной PORT был равен 0, ставим его в 1 (сама проверка — несколько микросекунд — глазом не заметно)

2. если на PIN обнаружили 0, значит кнопка нажата — запоминаем факт первичного обнаружения (для алгоритма антидребезга)2a. если при этом на PORT был высокий уровень и мы обнаружили нажатие, снимаем его до тех пор, пока периодическая проверка п.1 не покажет устойчивое отжатие кнопки (3–5 проверок подряд) — так как светодиод и так не будет светиться из-за шунтирования контактами кнопки, а уменьшить выходной ток через порт, ограниченный при нажатии кнопки лишь выходным каскадом, очень полезно во всех смыслах

3. если подтвердили нажатие или отпускание в течение нескольких циклов проверки — обрабатываем его в программе, и зажигаем соответственно светодиод через PORT

Недостаток такого включения в том, что индикатор будет погашен в течение всего времени удержания кнопки человеком — то есть если пргораммно реализовывать toggle switch, то переход из вкл в выкл визуально произойдет в момент нажатия, а из выкл во вкл — в момент отпускания — это может быть не совсем удобно

Теперь для МК, которые не умеют отслеживать состояние непосредственно выводов порта, либо не имеют средств ограничения выходного тока (например, старые семейства 8051 и их клоны):

0330a52de22f46939fc199a5a2db0fb5.jpg

Здесь придется пожертвовать еще одной линией ВВ, настроенной на вход, и разделить гасящий резистор на две части. Алгоритм при этом остается прежним, разве что переводить выходной порт в 0 на все время, пока обнаружено нажатие кнопки, не обязательно (но по-прежнему желательно для автономных систем с точки зрения уменьшения потребляемого тока). Пропорцию значений резисторов можно выбрать и не такую экстремальную (сажать выход на землю через 39 Ом, даже на миллисекунды для некоторых МК может оказаться жестковато) — важно только, чтобы падение напряжения на светодиоде + его нижней половине ограничительного резистора при высоком уровне выходного порта было с запасом больше, чем Vcc/2

И наконец, вариант схемы для нескольких кнопок с индикацией — здесь можно использовать одну входную линию на всех, развязав диодами:

96fd2ab231f24490b8472e530bb7d615.jpg

Pull-up входного порта (нарисован пунктиром справа) для исключения слабой засветки кнопок через развязывающие диоды можно включать только в момент сканирования состояния. Сканировать множественные кнопки, естественно, по очереди.

Вот такая идея — на практике правда пока проверить не успел, даже нарисовал только на бумажке

© Habrahabr.ru