Так нужно дребезг подавить или определить, что он был?
Если первое, то, наверное, красивше так:
case 0x02:
if (millis() - timer < 100) {
break; // крутимся в этой ветке до 100мс
}
if (!pinstat) {
Serial.println("button is pressed");
} else {
Serial.println("p3");
}
stat = 0x00;
break;
я предпочитаю реагировать на нажатие сразу и далее блокировка принятия решения на время дребезга контактов, это если не надо отслеживать длительное нажатие, только клик
Это если от дребезга может лишнее событие случиться, типа на индикаторе при наборе цифра 2 в 6 перескочит, то надо давить. А так и так сойдёт. Без подавления можно аварийный клапан стопорить.
Нужно подавить, то есть чтобы кнопка была нажата, к примеру, минимум 100 мс, хотя это наверно уже удержанием называется? Чтобы при однократном нажатии счётчик прибавился на единицу (так проще объяснить), а не на N число, которое получится из-за дребезга.
100 мс - это очень, очень раздолбанная кнопка. Для нормальной и 20 мс хватит. Ну для гарантии можно 50 мс сделать. На глаз это будет тоже незаметно, но дребезг подавит гарантированно
ВременнЫх стандартов на то, что называется кликом, что удержанием, я не видел.
Один из способов переждать дребезг - перепроверка через 100мс. Через это время, предположительно, всё должно успокоиться. Способ простой, как палка. Вы его попытались реализовать, но в конце немного неверно поступили, на мой взгляд.
Второй - проверка N раз в течении 100мс. Как только M попыток из N дают одинаковый результат - значит всё устаканилось. Если правильно помню, SergeyL является сторонником этого метода. В реализации посложнее, но, теоретически, может сэкономить капелюшку времени, если кнопка успокоится раньше.
Если посадкой на луну управлять не нужно, первого - за глаза.
Не только он, я читаю 16 раз с задержкой после чтения 1-2 мс. Если ВСЕ 16 раз кнопка нажата - значить она нажата, если хоть один раз нет, то дребезг, кнопка считается ненажатой/отпущенной.
А если попадёт так, что на таймере 1000 мс кнопка в LOW, на таймере 1100 кнопка в LOW, а в 1050 кнопка была в HIGH. Делать сброс и начинать отсчёт заново?
Вот второй вариант мне больше нравится, к примеру проверяю каждые 5 мс, если после 5 проверки на счётчике цифра 5, значит всё ок, если был переход с 0 на 1, начинаю всё заново.
Чуть позже напрограмлю код, на зачёт ))))
Так может это у человека рука дрогнула, а на самом деле он держит палец на кнопке и думает, что аппарат должен сработать.
Тут вы с немного иной, но ненулевой вероятностью можете пропустить HIGH на 7,5мс, и 12,5мс к примеру. И как этот случай трактовать?
В нашей реальности нет 100% гарантированных способов отделить полезный сигнал от бесполезного. Можно только бесконечно приближаться к этой величине, усложняя алгоритм обработки сигнала.
Ну, и как критерий истины, использовать практику.
Вобщем, моё мнение таково - как “blink без delay” закрывает 80% нужд местного ардуинщика, так и простая перепроверка через 10-100мс закроет проблему дребезга в самопальных устройствах
А то! Я в это время в первый класс пойти готовился и очень даже интересовался как там дяди по Луне шастают и почему до сих пор не свалились оттуда.
Ну, сейчас это просто глава в истории программирования, и чтобы о ней знать, не обязательно участвовать. Есть мнение, что это самая дорогостоящая ошибка в истории.
Если погуглить “Apollo 11 error 1202” , до фига чего найдётся.
Хотя, конечно, лучше всего читать официальную информацию от NASA. Там подробно расписан механизм управления памятью AGL и причины ошибки.