Возвращать состояние кнопки только один раз в X раз?

Я хочу определить, была ли нажата кнопка, но я не хочу, чтобы она возвращала состояние "нажато" более одного раза в течение секунды или двух.

Например, с помощью этого кода:

void loop() {
  passButtonState = digitalRead(passButton);

  if (passButtonState == LOW) {
    Serial.println("PASSED!");
  }
}

Выдал бы что-то подобное одним быстрым нажатием кнопки:

PASSED!
PASSED!
PASSED!
PASSED!
PASSED!
PASSED!
PASSED!
PASSED!
PASSED!

Но я хочу, чтобы нажатие одной кнопки просто возвращало PASSED! один раз для этого нажатия одной кнопки.

, 👍0


4 ответа


Лучший ответ:

0

Чтобы избежать этой проблемы, вы можете использовать логическую переменную в качестве флага, который разрешает войти внутрь if только один раз.

bool flag = true;

void loop() {
  passButtonState = digitalRead(passButton);

  if (passButtonState == LOW && flag) {
    Serial.println("PASSED!");
    flag = false;
  }
}
,

Но с этого момента эта кнопка навсегда отключается. Я просто хочу, чтобы он возвращался только один раз для каждого нажатия, а не дюжины., @Shpigford

@Shpigford, вы можете сбросить flag = true через некоторое время., @rebatoma


-1

Вы можете добавить задержку.

void loop() {
  passButtonState = digitalRead(passButton);

  if (passButtonState == LOW) {
    Serial.println("PASSED!");
    delay(1000);
  }
}
,

Не могли бы вы объяснить, почему это было бы хорошим решением? Хотя это может быть тривиальным для вас и меня, это точно будет не для всех. Кроме того, вы должны указать, что добавление задержки «замедлит» всю программу. Вы можете даже предложить альтернативные решения., @Paul


1

Если я правильно понимаю проблему, думаю, ответ может быть довольно распространенным. Ваша схема может страдать от "дребезга", и решение называется "устранение дребезга".

Перейдите по этой ссылке, чтобы найти возможное решение: Отказ от программного обеспечения

,

0
void loop() {
  passButtonState = digitalRead(passButton);

  if (passButtonState == LOW) {
    Serial.println("PASSED!");
    while (passButtonState == LOW) delay(1);
  }
}
,