Как обеспечить считывание двойного клика кнопки в теле прерывания?

Лучше расскажи - зачем именно прерывания использовать решил?

хочешь угадаю? :slight_smile:

Мне показалось это более удобным. И библы энкодерные не нужны.

спорное утверждение.

А мне показалось более удобным что вроде идеи Деда из #38 только без цикла как такового, считать количество попыток в 10 миллисекундном прерывании таймера.
типа

volatile byte key=0;
..... 
 static byte k1cnt;
    if (k1cnt > 4) {if (digitalRead(but1) == 0) {k1cnt++; if (k1cnt> 120) {k1cnt-=20;key=1;};} 
    else {if (k1cnt > 5)  key=1; if ((k1cnt > 60) & (k1cnt< 120) )key=5; k1cnt=0;};}
    else if (digitalRead(but1) == 0) k1cnt++;

Логика - если более 50 мс имеем замкнутую кнопку отдаем в глобальной переменной key значение короткого нажатия, после использования в основном теле программы key обнуляем. Если кнопка нажата более 600 мс и меньше 1200 мс отдаём значение длинного нажатия. Если кнопка удерживается более 1200 мс пулемётом выдаёт короткое нажатие каждые 200 мс.

Так ТС двойное хочет

Никак. Прерывание для этого не предназначено.

Нет.
Действие по третьему щелчку должно быть таким, чтобы перед ним выполнялись действия по одиночному и по двойному щелчку. Если это по какой-то причине не так - систему команд нужно перепроектировать.

Нет, см. №22

Тем временем в теле прерывания:

https://youtube.com/shorts/g1SwavOMxnY?si=viezc9WH9E-MKhJ1

:smiley:

При чем тут вообще №22?
Я говорю про ошибку проектирования, а ты отвечаешь об особенностях реализации.

Ошибка? Я ведь могу выбрать всю идею в самом прерывании. Кто/что мне мешает? Так и делали.

Ага, про ошибку, которой нет. Если мне нужно, чтобы отработала функция по двойному клику, зачем мне предварительный запуск функции, подвязанной к одиночному?

Где-то читал подобные споры уже. Себе сделал так, что функция только флаг ставит, т.е. вписана одна строчка. Если этой строчки нет, то и клика нет. А вся функция есть часть обработчика. Так что получается что и не функция это, а ее кусок. И хочешь-не хочешь, а предварительно он все равно выполняется, только флаг не ставит. Не знаю, как там принято за правило, но мне нравится.

Может есть смысл фиксировать, запоминать и анализировать только промежутки времени между прерываниями, отделяя в том числе и дребезг?

А если это не ГУЙ, а меню текстовое на ssd1306, где “селект” выполняется перемещением по списку меню кнопками “вверх” и “вниз”, а действие инициируется третьей кнопкой, типа “Ентер”? Как тогда? Только по заветам конфессии @МММ?

А в чем расхождение?

Юрик, ну хотя бы автоформат сделай. Стыдоба то какая.(
И о тебе уже всё ясно. Дела не будет.

Проверю, потом. А автоформата у меня нет.

Это и есть ошибка проектирования - неверно спроектирована система команд.
В правильно спроектированной - действие при тройном нажатии всегда должно предваряться действиями по одиночному и двойному.
По одной простой причине: перед тройным нажатием непременно происходят сначала одиночное, а затем двойное. Это - объективная реальность, а попытка борьбы с объективной реальностью - глупость, приводящая к проблемам у того, кто не хочет считаться с объективной реальностью.

Вот это и есть ошибка проектирования. Не должны пересекаться разные события

Нет. У меня одиночный, двойной клики и удержание никогда друг друга не предваряют. Вот такая у меня объективная реальность ))