#1 2020-02-27 18:25:35

YK
Участник
Зарегистрирован: 2020-02-26
Сообщений: 21

Обработка кнопки, что может быть проще...

Стояла достаточно простая задача для школьного проекта, на одной стороне реализовать передатчик, чтобы он по нажатии кнопки кнопок отправлял команду на приемник. Как один из вариантов через Web  с использованием ESP32.
Но в данном случае не важно, пусть будет любое другое железо с Wifi , BLE или LAN.
Решил помочь в написании скетча и проще простого стал искать библиотеку для обычной кнопки, естественно, что то быстро нашел, работает... Но первая же нормальная интеграция показала, что если нажать на кнопку несколько раз быстро, часть команд теряется естественно. Ну в общем понятно... посмотрел код библиотеки, конечно пока   выполняется обработчик нажатия, все последующие нажатия теряются.
Да плюс к тому же отдельные библиотеки для обычной и Touch кнопки, а разница то всего в логическом уровне при нажатии...
Ладно, раззадорило, стал искать и ничего толкового не нашел потратил больше часа, думаю сам быстрее напишу.  Чего бы проще, все нажатия запоминаем в очередь и отдельно по одному обрабатываем очередь,  Принципиально то что запоминание в очереди и процессинг выполняется в разных потоках. Ну тут слово поток неуместно так как на ардуинах их нет , на прерываниях все. Ну да ладно псевдо параллельное выполнение устраивает
Назвал класс СSimpleButton и стал писать код  под ESP32. Решил пару задач попутно как сделать удобным класс , Как уйти в обработчике от ISR. Ну все классно заработало, Сделал еще пару  удобств чтобы вообще не писать и не интегрироваться в Loop. Ухожу от прерывания ISR в прерывание от Таймера и там выполняю обработчик

Т.е. например имеем несколько кнопок каждая посылает какую то длинную команду все работает как часы и все параллельно, да и писать просто смотрите сами
CSimpleButton btn;
void setup(){
btn.Create(0, button_callback);
}
void button_callback(uint8_t gpio, button_event_t event) {
    switch (event) {
    case button_event_single_press:
       
        hueClient.Toggle(0);
        break;
    case button_event_long_press:
       
        break;
    default:
       
    }
}
Больше никаких Loop и т.п.
В данном случае hueClient.Toggle(0);  Это WEB (HTTPClient) который отсылает команду на лампочку Philips Hue, включить выключить.
Дети довольны.
Но ту бац, решили Arduino использовать , Nano по моему. Ладно думаю за 3 минуты портирую код. Ага очередная неудача библиотеки от Arduino не поддерживают attachInterrupt    с возможностью callback с аргументами. Бред ну кому нужна чистая голая функция callback без единого параметра и понимание что произошло.....

Короче прошел еще час, отказался от идеи дописать стандартную библиотеку, тяжело поддерживать да и потеряются изменения. 
Порылся в интернете, все задают один и тот же вопрос и ответ нельзя.
Ну да ладно.... написал еще почти собственный класс, стало можно


Но тут опять бац.  Взяли Arduino Nano, а она цепляется к прерыванию только 2 пинами (2 и 3) остальные нет.
А класс удобный уже, ладно еще 15 минут   работы. Можем ставить сколько хотим кнопок, но уже не все правильно будут реагировать на очередь, те которые к прерыванию не цепляются
Думаю пока хватит 2 кнопок с возможностью нервно давить

Да вернулся к названию класса, он по прежнему называется Simple…
Наверное надо переименовать
В другой раз когда появиться желания дорешать проблемы переименую
Смотрите здесь
https://github.com/Yurik72/SimpleButton

Кому понравиться, поставьте хоть звездочку на погоны smile

Редактировался YK (2020-02-28 09:11:58)

#2 2020-02-28 08:57:06

Kaka
Участник
Зарегистрирован: 2018-03-21
Сообщений: 358

Re: Обработка кнопки, что может быть проще...

YK пишет:

написал еще почти собственный класс, стало можно


Но тут опять бац.  Взяли Arduino Nano, а она цепляется к прерыванию только 2 пинами (2 и 3) остальные нет.
А класс удобный уже, ладно еще 15 минут   работы. Можем ставить сколько хотим кнопок, но уже не все правильно будут реагировать на очередь, те которые к прерыванию не цепляются

Ну, очевидно, что на очереди следующий шаг - написать "почти собственный класс", чтобы на Нано и ей подобных стало можно обрабатывать прерывания от любого пина.

Пиши, останавливаться на полпути - нехорошо.

#3 2020-02-28 09:09:27

YK
Участник
Зарегистрирован: 2020-02-26
Сообщений: 21

Re: Обработка кнопки, что может быть проще...

Kaka пишет:

Ну, очевидно, что на очереди следующий шаг - написать "почти собственный класс", чтобы на Нано и ей подобных стало можно обрабатывать прерывания от любого пина.

Пиши, останавливаться на полпути - нехорошо.

Это перебор, да и наверное аппаратно невозможно.
Лучше всегда использовать ESP32, чуть дороже зато все на борту и 2 ядра процессора и память и файловая система
А для Нано удел решать  простые задачки, думаю 2 кнопок всегда достаточно

#4 2020-02-28 09:31:55

Kaka
Участник
Зарегистрирован: 2018-03-21
Сообщений: 358

Re: Обработка кнопки, что может быть проще...

YK пишет:

да и наверное аппаратно невозможно.

Ещё как возможно! У 328 прерывания есть на всех пинах.

YK пишет:

Лучше всегда использовать ESP32, чуть дороже зато все на борту и 2 ядра процессора и память и файловая система

А вот это как раз "перебор". Неужели для обработки трёх кнопок требуется "и 2 ядра процессора и память и файловая система"? А что будешь делать, если "четыре кнопки" обрабатывать придётся? А "пять"? Summit возьмёшь? Не спортивно. На ЕСП и дурак сделает.

#5 2020-02-28 13:15:17

YK
Участник
Зарегистрирован: 2020-02-26
Сообщений: 21

Re: Обработка кнопки, что может быть проще...

Kaka пишет:

Ещё как возможно! У 328 прерывания есть на всех пинах.


Да раззадорил ты меня, прочел доку по 328, действительно возможно
Пришлось сделать   roll     Пока прицепился к PORTB т.е. "аппаратные"  кнопки можно вешать на D8-D15

Код как всегда здесь
https://github.com/Yurik72/SimpleButton

Думаю пора остановиться big_smile

#6 2020-02-28 21:53:00

Kaka
Участник
Зарегистрирован: 2018-03-21
Сообщений: 358

Re: Обработка кнопки, что может быть проще...

YK пишет:

Думаю пора остановиться big_smile

Невозможно. Кнопка - штука трансцендентная по своей природе, а стало быть сделать всё нельзя и всегда есть куда двигаться дальше.

#7 2020-03-04 23:43:22

Жорж
Участник
Зарегистрирован: 2019-02-23
Сообщений: 14

Re: Обработка кнопки, что может быть проще...

так, кнопки бувають різними. в мене теж  була проста задача - детектувати через оптопару чи натиснута кнопка, через яку тече струм з частостою 50Hz ...

#8 2020-03-05 09:19:32

renoshnik
Участник
Зарегистрирован: 2017-04-03
Сообщений: 771

Re: Обработка кнопки, что может быть проще...

Жорж пишет:

так, кнопки бувають різними. в мене теж  була проста задача - детектувати через оптопару чи натиснута кнопка, через яку тече струм з частостою 50Hz ...

бред...

#9 2020-03-06 15:12:49

Жорж
Участник
Зарегистрирован: 2019-02-23
Сообщений: 14

Re: Обработка кнопки, что может быть проще...

Піт

Быстрое сообщение

Введите сообщение и нажмите Отправить

Подвал раздела