Наиболее часто устройства IoT принимают сигналы от внешних замыкающихся контактов, такие как кнопки,герконы или сенсоры с выходом "сухой контакт"
В данной заметке я расскажу как подключить несколько таких контактов к одному пину и обеспечить распознавание какая кнопка нажата.
-------------------------------
Данный алгоритм может быть применен на любом микроконтроллере.
Более того , можно RC цепочки не включать последовательно, а для каждой кнопки поставить свою цепочку.
последовательное включение позволяет использовать одинаковые цепочки и получить разное время для различных кнопок.
----------------------------------
Пример дан применительно к ESP8266.
Предполагается, что используемые пины имеют подтяжку к 5в. В nodemcu она уже есть,
а в ESP-12 надо припаять подтяжку к 5 в 10 ком для пина 4 и 5.
==========================
Идея .
Надо сделать так, чтобы при нажатии кнопки на пин поступал импульс определенной длительностью, различный для каждой кнопки.
Простейший вариант реализации такой схемы следующий.
Делаем RC цепочки. Т е R=20 ком соединяем параллельно с конденсатором 2.2 мкф.
Такие номиналы использованы в приведенной далее тестовой прошивке.
RC цепочки (в моем варианте их две) соединяем последовательно.
один конец полученного соединения соединяем с землей.
Место соединение RC цепочек с первой кнопкой, а свободный конец RC цепочки - со второй.
кнопки подключаем к пину 4 ESP8266.
Вот функция колбека для обработки кнопок на ESP8266 по прерыванию
==============================
void intr_cb(int *dummy){
ETS_GPIO_INTR_DISABLE();
uint32 status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);
if (status & BIT(pinb)) {
if (Level==GPIO_PIN_INTR_LOLEVEL){
LTime=system_get_time(); Level=GPIO_PIN_INTR_HILEVEL;
} else {
LTime=system_get_time()-LTime; Level=GPIO_PIN_INTR_LOLEVEL;
int m=0; while(LenT>m){
if (LTime>T_min[m] && LTime<T_max[m]){ ( button=m; break; }
m++; }
}
}
gpio_pin_intr_state_set(GPIO_ID_PIN(pinb),Level);
GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS,status);
ETS_GPIO_INTR_ENABLE();
}
------------------------
функция вызывает всего два раза на нажатие
при втором вызове определяет номер кнопки.
и Все ничего лишнего.
==================================
К пину 5 подключаем реле.
У меня нашлось такое:
вход signal (у реле это in) соединяем с пином 5 ESP через RC цепочку (см ранее)
На реле подаем питание 5 вольт.
К контакту реле 2 подключаем 5 вольт, а на контакт 1 подключаем через резистор светодиод, второй конец которого соединяем с землей.
В fimware прошивка с примером
две кнопки и реле.
Нажатие на кнопку изменяет частоту переключения реле (две кнопки -две частоты)
=====================
P.s:
Отдельно хочу обратиться к любителям засрать темы .
------------------------------
В заголовке темы написано ДЕЛЮСЬ ОПЫТОМ
это значит - что это НЕ ОБСУЖДЕНИЕ или ВОПРОС
или еще что-то либо что требует Вашего непосредственного излияния.
Это значит что Я рассказал свой опыт тем, кому это интересно,
а не тем, кто хочет выпендриваться .
------------------------------
Просьба модераторов соблюдать их собственные правила,
а то не форум, а помойка какая-то.
В данной заметке я расскажу как подключить несколько таких контактов к одному пину и обеспечить распознавание какая кнопка нажата.
-------------------------------
Данный алгоритм может быть применен на любом микроконтроллере.
Более того , можно RC цепочки не включать последовательно, а для каждой кнопки поставить свою цепочку.
последовательное включение позволяет использовать одинаковые цепочки и получить разное время для различных кнопок.
----------------------------------
Пример дан применительно к ESP8266.
Предполагается, что используемые пины имеют подтяжку к 5в. В nodemcu она уже есть,
а в ESP-12 надо припаять подтяжку к 5 в 10 ком для пина 4 и 5.
==========================
Идея .
Надо сделать так, чтобы при нажатии кнопки на пин поступал импульс определенной длительностью, различный для каждой кнопки.
Простейший вариант реализации такой схемы следующий.
Делаем RC цепочки. Т е R=20 ком соединяем параллельно с конденсатором 2.2 мкф.
Такие номиналы использованы в приведенной далее тестовой прошивке.
RC цепочки (в моем варианте их две) соединяем последовательно.
один конец полученного соединения соединяем с землей.
Место соединение RC цепочек с первой кнопкой, а свободный конец RC цепочки - со второй.
кнопки подключаем к пину 4 ESP8266.
Вот функция колбека для обработки кнопок на ESP8266 по прерыванию
==============================
void intr_cb(int *dummy){
ETS_GPIO_INTR_DISABLE();
uint32 status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);
if (status & BIT(pinb)) {
if (Level==GPIO_PIN_INTR_LOLEVEL){
LTime=system_get_time(); Level=GPIO_PIN_INTR_HILEVEL;
} else {
LTime=system_get_time()-LTime; Level=GPIO_PIN_INTR_LOLEVEL;
int m=0; while(LenT>m){
if (LTime>T_min[m] && LTime<T_max[m]){ ( button=m; break; }
m++; }
}
}
gpio_pin_intr_state_set(GPIO_ID_PIN(pinb),Level);
GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS,status);
ETS_GPIO_INTR_ENABLE();
}
------------------------
функция вызывает всего два раза на нажатие
при втором вызове определяет номер кнопки.
и Все ничего лишнего.
==================================
К пину 5 подключаем реле.
У меня нашлось такое:
вход signal (у реле это in) соединяем с пином 5 ESP через RC цепочку (см ранее)
На реле подаем питание 5 вольт.
К контакту реле 2 подключаем 5 вольт, а на контакт 1 подключаем через резистор светодиод, второй конец которого соединяем с землей.
В fimware прошивка с примером
две кнопки и реле.
Нажатие на кнопку изменяет частоту переключения реле (две кнопки -две частоты)
=====================
P.s:
Отдельно хочу обратиться к любителям засрать темы .
------------------------------
В заголовке темы написано ДЕЛЮСЬ ОПЫТОМ
это значит - что это НЕ ОБСУЖДЕНИЕ или ВОПРОС
или еще что-то либо что требует Вашего непосредственного излияния.
Это значит что Я рассказал свой опыт тем, кому это интересно,
а не тем, кто хочет выпендриваться .
------------------------------
Просьба модераторов соблюдать их собственные правила,
а то не форум, а помойка какая-то.
Вложения
-
154.9 KB Просмотры: 15
Последнее редактирование: