защита от дребезга
- Войдите на сайт для отправки комментариев
Вс, 15/06/2014 - 07:36
кто и как использует програмно защиту от дребезка (куча новых переменных добавление в код делей или мучится с миллес), многих это отпугивает, предлогаю простое решение всего пару строк в коде.
bool b=0; bool s=0; unsigned long d=0;
void setup()
{
pinMode(4, INPUT);
}
void loop()
{
bool e=(digitalRead (4));if(b){if(millis()>=(d+50)){s=e;b=0;}}
else{if(e!=s){b=1;d=millis();}} // значение s то 4 пина с защитой от дребезка
}
кнопка на 4 контакте с простым подтягивающим резистором, время выдержки 50мск (если контакты плохие можно и увеличить), значение s это истина или лож по кнопке, код можно дублировать только переменные надо присваивать другие.
чем ваш велосипед лучше?
Если есть "родная" библиотека. Пример https://github.com/thomasfredericks/Bounce-Arduino-Wiring/blob/master/Bo...
vov4ik, Можно сделать еще "короче", если всё в одну строку написать, про остальное уже сказали.
а вот и нет, 404 XD
Хотелось бы узнать комментарии опытных разработчиков arduino по поводу такого кода; отлавливается две операции: короткое нажатие (до 3 секунд) и длинное (более):
#define tmAfterUp 100 // время после отпускания кнопки #define tmClick 100 // время нажатия - фильтр дребезга #define tmPress 3000 // время удержания volatile unsigned long tmPresStart; volatile unsigned long tmPresEnd; void setup() { attachInterrupt(0, itrSetStart, RISING); attachInterrupt(0, itrSetEnd, FALLING); tmPresEnd = tmPresStart = 0; } void loop() { if (tmPresEnd > 0 && millis() - tmPresEnd > tmAfterUp) { long tmDelta = tmPresEnd - tmPresStart; tmPresEnd = tmPresStart = 0; if (tmDelta > tmPress) { // произошло длительное нажатие } else if (tmDelta > tmClick) { // произошло короткое нажатие } } } void itrSetStart() { if (tmPresStart == 0) tmPresStart = millis(); } void itrSetEnd() { tmPresEnd = millis(); }А как быть, если это не единственная кнопка, а покупная матричная клавиатура или полтора десятка кнопок, включенных для экономии пинов через регисторный расширитель входов?
Если программировать микроконтроллер клавиатуры, то, наверное, такой способ не годится, но у меня частный случай, происходят некоторые процессы (чтение данных из UART, запись из на SD-карту) и мне надо иметь возможность передать пару-тройку команд (закрыть файл, остановить запись, выждать паузу для замены карты в разъеме), то хотелось бы одну кнопку поставить и ей одной как-то правильно кликать.
Не уверен, но думаю, что, в принципе, для примера с SD-картой, можно выдернуть из UART-а девайс, скриптом отловить это событие и если Serial.read() == -1, то закрыть файл (сбросить буферы) и проделать нужные действия, то есть, обойтись без кнопки вообще. Но мне интересна идея одной кнопки. И еще беспокоит, не повлияет ли такая обработка кликов на процесс синхронизации данных при записи их на SD-карту из loop()?
Я еще ничего не кодил и не тестил, плата придет через неделю-две, хотелось бы заранее изучить информацию... Но тут получается: один пишет о "подтягивающих" резисторах, то ли "вверх", то ли "вниз", другой его поправляет и сообщает, что встроенные на то и нужны, а третий предоставляет код, который не читается и вообще писать такое стыдно жаде на первом курсе института:
boolb=0;bools=0; unsignedlongd=0;Я еще ничего не кодил и не тестил, плата придет через неделю-две, хотелось бы заранее изучить информацию... Но тут получается: один пишет о "подтягивающих" резисторах, то ли "вверх", то ли "вниз", другой его поправляет и сообщает, что встроенные на то и нужны, а третий предоставляет код, который не читается и вообще писать такое стыдно жаде на первом курсе института:
boolb=0;bools=0; unsignedlongd=0;О кнопках на форуме написаны "вагон и маленькая тележка". Если аппаратная часть больше интересует, можете прочесть "Сагу о кнопках", если программная - "Титановый велосипед...". Да и в других темах эти вопросы часто поднимались, включая варианты с использованием прерываний и таймеров. За неделю-две вполне можно освоить. При этом нужно учитывать, что форум не учебник. Каждый может высказываться в силу своих как убеждений, так и заблуждений. Т.е. нужно осмысленно подходить, фильтровать.