Отработка с флагом + защита от дребезга

#define BTN 3         // кнопка подключена сюда (PIN --- КНОПКА --- GND)
#define DEBOUNCE 100  // таймаут антидребезга, миллисекунды
boolean btnState, btnFlag;
unsigned long debounceTimer;

void setup() {
  Serial.begin(9600);
  pinMode(BTN, INPUT_PULLUP);
}

void loop() {
  btnState = !digitalRead(BTN);  // читаем состояние кнопки с инверсией. 1 - нажата, 0 - нет
  // если нажата и была отпущена (btnFlag 0) и прошло не менее DEBOUNCE времени
  if (btnState && !btnFlag && (millis() - debounceTimer > DEBOUNCE)) {
    btnFlag = true;              // запомнили что нажата
    debounceTimer = millis();    // запомнили время нажатия
    Serial.println("press");
  }
  if (!btnState && btnFlag) {    // если отпущена и была нажата (btnFlag 1)
    btnFlag = false;             // запомнили что отпущена
    debounceTimer = millis();    // запомнили время отпускания
    Serial.println("release");
  }
}

Ссылка на источник: https://alexgyver.ru/arduino-algorithms/