arduino, счетчик нажатий через прерывание.

Electronik
Offline
Зарегистрирован: 14.03.2019

Всех приветствую.
Делаю счетчик количества нажатий на кнопку через прерывание.

const byte btn_pin=2;
unsigned long cnt=0;

void setup() {
  Serial.begin(9600);
  pinMode(btn_pin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(btn_pin), counter, RISING);
}

void loop() {
}

void counter() {
  cnt++;
  Serial.println(cnt);
}

Одно нажатие считает как несколько.
Подскажите, пожалуйста, что нужно исправить?
Благодарю за ответы.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Читать за дребезг контактов

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Electronik пишет:
Подскажите, пожалуйста, что нужно исправить?
Поставить задержку 0,05 секунды в обработчик прерывания. И это ни вк оем случае не delay. 

Electronik
Offline
Зарегистрирован: 14.03.2019

Счётчик нажатий без прерывания: http://wiki.amperka.ru/%D0%BA%D0%BE%D0%BD%D1%81%D0%BF%D0%B5%D0%BA%D1%82-arduino:%D1%81%D1%87%D0%B5%D1%82%D1%87%D0%B8%D0%BA-%D0%BD%D0%B0%D0%B6%D0%B0%D1%82%D0%B8%D0%B9
Счётчик нажатий с прерыванием:

const byte btn_pin=2;
unsigned long cnt=0;

void setup() {
  Serial.begin(9600);
  pinMode(btn_pin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(btn_pin), counter, FALLING);
}

void loop() {}

void counter() {
   detachInterrupt(digitalPinToInterrupt(btn_pin));
   cnt++;
   Serial.println(cnt);
   while(digitalRead(btn_pin)==LOW){}
   attachInterrupt(digitalPinToInterrupt(btn_pin),counter,FALLING);   
}

источник: https://www.cooking-hacks.com/documentation/tutorials/geiger-counter-radiation-sensor-board-arduino-raspberry-pi-tutorial
Благодарю всех за ответы, тема закрыта.

sadman41
Offline
Зарегистрирован: 19.10.2016

Запихивать в обработчик detach/attach совершенно бесмысленно.