Как исправить этот код, чтобы вместо того, чтобы удерживать кнопку для смены светодиода, вы могли нажать?

const int buttonPin = 1; // номер контакта входного контакта кнопки
const int ledPins[] = {2, 3, 4, 5, 10, 11, 12, 13};    // переменные изменятся:
int buttonState = 0; // переменная для чтения статуса кнопки
int buttonPressCount = 0;
int numberOfLED = 8;

void setup() {    // инициализируем вывод светодиода как выход:
  for (int i = 0; i < numberOfLED; i++) {
    pinMode(ledPins[i], OUTPUT);
  }    
  pinMode(buttonPin, INPUT);
}

void loop() {    // считываем состояние значения кнопки:
  buttonState = digitalRead(buttonPin);    // проверяем, нажата ли кнопка. // если да, то состояние кнопки ВЫСОКОЕ:
  if (buttonState  == HIGH) {
    for (int i = 0; i < numberOfLED; i++) {
      if (buttonPressCount % numberOfLED == i)
        digitalWrite(ledPins[i], HIGH);  // включаем светодиод
      else
        digitalWrite(ledPins[i], LOW);   // выключаем светодиод
    }
  }    
  buttonPressCount++;    
  delay(300);
}

, 👍0


1 ответ


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

2

вместо того, чтобы каждый раз менять buttonState == HIGH, измените его, когда состояние кнопки было LOW в предыдущий раз, а сейчас HIGH:

buttonState = digitalRead(buttonPin);
if (oldButtonState != buttonState && buttonState == HIGH) {
    //...
}
oldButtonState = buttonState;

Однако имейте в виду отскок контактов. Это может привести к обнаружению нескольких переходов. Большинство решений для этого устанавливают минимальную задержку между обработкой переходов, удаляя все остальные обнаруженные.

,