Игра под управлением Arduino с реакцией
У меня есть этот код, и это легкая игра с реакцией. Когда вы нажимаете кнопку на выводе 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)) {
}
}
}`
@Jimster, 👍0
Обсуждение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 переменной, так как вы хотите изменить скорость.
Для обработки запуска игры с помощью той же кнопки вы можете использовать переменную состояния, которая содержит значение "Игра остановлена" или "Игра запущена".
- Питание светодиодной ленты - Сколько ампер?
- Несколько условий оператора if
- Светодиоды: разница между общим анодом и общим катодом
- Светодиод L продолжает гореть
- Улучшенное циклическое переключение цветов RGB.
- Плавное мигание светодиодов
- Остановить мигание светодиодов
- FastLED - Как управлять определенными светодиодами
Вы используете внешний подтягиватель для своего кнопочного штифта?, @chrisl