Просто правильная отработка нажатия с флагом

#define BTN 3   // кнопка подключена сюда (PIN --- КНОПКА --- GND)
boolean btnState, btnFlag;

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

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

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