защита от дребезга

vov4ik
Offline
Зарегистрирован: 10.09.2013

кто и как использует програмно защиту от дребезка (куча новых переменных добавление в код делей или мучится с миллес), многих это отпугивает, предлогаю простое решение всего пару строк в коде.

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 это истина или лож по кнопке, код можно дублировать только переменные надо присваивать другие.

toc
Offline
Зарегистрирован: 09.02.2013

чем ваш велосипед лучше?
Если есть "родная" библиотека. Пример https://github.com/thomasfredericks/Bounce-Arduino-Wiring/blob/master/Bo...

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

vov4ik, Можно сделать еще "короче", если всё в одну строку написать, про остальное уже сказали.

nkk
nkk аватар
Offline
Зарегистрирован: 18.03.2016

toc пишет:
чем ваш велосипед лучше? Если есть "родная" библиотека. Пример https://github.com/thomasfredericks/Bounce-Arduino-Wiring/blob/master/Bounce2/examples/bounce/bounce.ino

а вот и нет, 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();
}
Duino A.R.
Offline
Зарегистрирован: 25.05.2015

А как быть, если это не единственная кнопка, а покупная матричная клавиатура или полтора десятка кнопок, включенных для экономии пинов через регисторный расширитель входов?

nkk
nkk аватар
Offline
Зарегистрирован: 18.03.2016

Если программировать микроконтроллер клавиатуры, то, наверное, такой способ не годится, но у меня частный случай, происходят некоторые процессы (чтение данных из UART, запись из на SD-карту) и мне надо иметь возможность передать пару-тройку команд (закрыть файл, остановить запись, выждать паузу для замены карты в разъеме), то хотелось бы одну кнопку поставить и ей одной как-то правильно кликать.

Не уверен, но думаю, что, в принципе, для примера с SD-картой, можно выдернуть из UART-а девайс, скриптом отловить это событие и если Serial.read() == -1, то закрыть файл (сбросить буферы) и проделать нужные действия, то есть, обойтись без кнопки вообще. Но мне интересна идея одной кнопки. И еще беспокоит, не повлияет ли такая обработка кликов на процесс синхронизации данных при записи их на SD-карту из loop()?

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

bool b=0; bool s=0; unsigned long d=0;

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

nkk пишет:

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

bool b=0; bool s=0; unsigned long d=0;

О кнопках на форуме написаны "вагон и маленькая тележка". Если аппаратная часть больше интересует, можете прочесть "Сагу о кнопках", если программная - "Титановый велосипед...". Да и в других темах эти вопросы часто поднимались, включая варианты с использованием прерываний и таймеров. За неделю-две вполне можно освоить. При этом нужно учитывать, что форум не учебник. Каждый может высказываться в силу своих как убеждений, так и заблуждений. Т.е. нужно осмысленно подходить, фильтровать.