Игра под управлением Arduino с реакцией

led

У меня есть этот код, и это легкая игра с реакцией. Когда вы нажимаете кнопку на выводе 11, начинается игра, и огни должны колебаться взад и вперед. Основная цель состоит в том, чтобы нажать кнопку, когда она коснется среднего светодиода, и вибрация замедлится. Я не могу заставить светодиоды включиться, помогите?

    int ledPin;
    int direction;
    int isChanging;
    unsigned long lastChange;

void setup() {
   //set pins 2 to 10 to be output
  // and LEDs off
   int pin;
    for (pin = 2; pin <= 10; pin++) {
       pinMode(pin, OUTPUT);
       digitalWrite(pin, LOW);
    }
     //set pin 11 to be input
     pinMode(11, INPUT);

     ledPin = 2;
     direction = 1;
     lastChange = millis();
  }

 void loop() {
    if (isChanging) {
    if (millis() - lastChange > 500) {
        //turn off old LED
        digitalWrite(ledPin, LOW);
        //reset time
        lastChange = millis();
        //change the led
        ledPin = ledPin + direction;
        if (ledPin > 10) {
          direction = -1;
        ledPin = 9;
      } else (ledPin < 2); {
        direction = +1;
        ledPin = 3;
     }

       //turn on new LED
        digitalWrite(ledPin, HIGH);
     }
       //check for button
       if (digitalRead(11)) {
        isChanging = 0;
     }
     }
    else {
       //wait for them to let go of the button
       while (digitalRead(11)) {
     }
       //wait for it to be pressed again
       while (!digitalRead(11)) {
     }
       //wait for them to let go of the button
       while (digitalRead(11)) {
     }
    }
   }`

, 👍0

Обсуждение

Вы используете внешний подтягиватель для своего кнопочного штифта?, @chrisl


1 ответ


1

Вы явно не инициализируете переменную isChanging, поэтому компилятор устанавливает ее в 0. Это означает, что ваш код будет напрямую переходить к последнему оператору else и в любой момент не сможет достичь кода светодиода, потому что вы не изменяете переменную в операторе else.

Но я действительно не понимаю, почему вы вообще использовали эту переменную. Попробуйте использовать чисто неблокирующий код. Для проверки кнопки вы можете сделать что-то вроде этого:

boolean button_pressed = false;
unsigned long button_timestamp = 0;

void loop(){
  ...
  if(!button_pressed && digitalRead(11)){
    button_pressed = true;
    button_timestamp = millis();
  }
  if(button_pressed && millis() - button_timestamp > 50){
    if(digitalRead(11)){ // real button press
      button_pressed = false;
      // check, if the middle LED is ON and act accordingly
      // or, if the game hasn't started yet, start it
    } else { // just a bounce of the button, not a real button press
      button_pressed = false;
    }
  }

  // LED CODE
  if (millis() - lastChange > 500) {
    ...
  }
}

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

Также в вашем светодиодном коде вы должны заменить 500 в инструкции millis переменной, так как вы хотите изменить скорость.

Для обработки запуска игры с помощью той же кнопки вы можете использовать переменную состояния, которая содержит значение "Игра остановлена" или "Игра запущена".

,