Прерывания Arduino — функция прерывания
Стандартная функция внешнего прерывания Arduino
attachInterrupt(intrrupt_pin, function, mode)
Значения аргуменотов функции прерывания
intrrupt_pin – для Arduino Nano 0 – для пина D2, 1 – для пина D3
function — функция, которая не принимает и не возвращает значения;
mode — режимы обработки:
RISING – срабатывает один раз при изменении сигнала с LOW на HIGH;
FALLING – срабатывает один раз при изменении сигнала с HIGH на LOW;
LOW – срабатывает при низком уровне сигнала, 0 или LOW;
CHANGE – срабатывает при изменении сигнала с HIGH на LOW или в обратном порядке, то есть при смене сигнала.
Таймеры Arduino Nano
Timer0 — применяются millis (), micros (), delay () D5 и D6
Timer1 — применяются для Servo D9 и D10
Timer2 — применяется Tone и ШИМ D11 и D13
Скетч прерывания Arduino и использованием кнопки
volatile int counter = 0;
volatile boolean isFlag = false;
void setup() {
Serial.begin(9600);
pinMode(2, INPUT_PULLUP);
attachInterrupt(0, noise, FALLING);
}
volatile uint32_t noise_time;
void noise() {
counter++;
isFlag = true;
// 150 понижаем дребезг кнопки, digitalRead - узнаем состояние порта D2
if (millis() - noise_time >= 120 && digitalRead(2))
{
noise_time = millis();
}
// if (millis() - 100 > noise_time && digitalRead(2))
// {
// noise_time = millis();
// }
}
void loop() {
if (isFlag) {
isFlag = false;
Serial.println("Прерывание");
Serial.println(counter);
}
delay(2000);
}
Устранение дребезга кнопки Arduino
Схема для аппаратного удаления дребезга кнопки Arduino с использованием резисторов, конденсатора и триггера Шмитта.

Скетч для программного удаления дребезга кнопки Arduino
int pin = 2;
int counter=0;
bool isflag = LOW;
bool state_button_last = LOW;
void setup() {
Serial.begin(9600);
pinMode(pin, INPUT);
}
bool noise() {
// HIGH означает что кнопка нажата
bool state_button = digitalRead(pin);
if (state_button != state_button_last) {
delay(10);
state_button = digitalRead(pin);
}
return state_button;
}
void loop() {
int state_button_now = noise();
if (state_button_last == LOW && state_button_now == HIGH) {
isflag = !isflag;
counter++;
Serial.println(counter);
}
state_button_last = state_button_now;
}

Не читал статью, глянул только схему и сразу бросилось в глаза: Вы конденсатор (еще и на 100 мкФ) накоротко разряжаете через кнопку. У кнопочки внутри будет постоянное искрение, которое шаг за шагом будет уменьшать подвижный контакт кнопки с неподвижным до полной потери контакта при нажатии. Если феерично «повезет», то подвижный и неподвижный контакт приварятся и кнопка будет постоянно замкнута, независимо от нажатия.