Как отслеживать нажатие кнопки?

У меня есть код:

const int buttonPin = 7; // номер порта нашей кнопки
void setup() {
    // устанавливаем порт светодиода на выход
    // устанавливаем порт кнопки на вход
    pinMode(buttonPin, OUTPUT);
    Serial.begin(9600);
}
void loop() {
    // читаем состояние порта кнопки и записываем в переменную
    int buttonState = digitalRead(buttonPin);
    // делаем простую проверку нашей переменной
    if (buttonState == HIGH) {
        Serial.println("Yes");
    } else {
        Serial.println("No");
    }
}

Как видно по коду я хочу, чтобы при включение кнопки в Монитор порте появлялось 'Yes', но проблема в том что надпись появляется только если я зажму кнопку, а мне надо что когда я один раз нажал и в порте высветилось yes.


Ответы (1 шт):

Автор решения: Vanyamba Electronics

Если подключить кнопку ко входу INT0 (Digital 2), то можно задать микроконтроллеру, чтобы тот генерил прерывание INT0_vect при нажатии или при отпускании кнопки. А в теле функции loop() проверять, была ли нажата кнопка за время работы функции.

volatile bool bInt0 = false;
void setup()
{
   pinMode(2, INPUT);
   EICRA |= _BV(ISC01) | _BV(ISC00);  // Запрос на прерывание по переднему фронту
   EIMSK |= _BV(INT0);                // Разрешить внешнее прерывание INT0
   Serial.begin(57600);
   interrupts();                      // Разрешить прерывания
}
// Обработчик прерывания INT0_vect
ISR(INT0_vect)
{
   bInt0 = true;
}
void loop()
{
   if (bInt0) {
      bInt0 = false;
      Serial.println("Button pressed.");
   }
   delay(100);
}
→ Ссылка