Код больше не ждет, когда кнопка не нажата
Итак, вот код
const int buttonPin = 2;
const int ledPin = 13;
int wait_time = 10;
bool wait_finished = false;
// variables will change:
int buttonState = 0;
void setup() {
Serial.begin(9600);
Serial.print("wait_finished set to true.");
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
}
void loop() {
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH || wait_finished == false) {
digitalWrite(ledPin, LOW);
wait_finished == false;
}
if (buttonState == LOW && wait_finished == true) {
digitalWrite(ledPin, HIGH);
}
else if (buttonState == LOW) {
wait();
}
}
void wait() {
if (wait_finished == false) {
delay(wait_time * 1000);
wait_finished = true;
Serial.println("wait_finished set to true.");
}
}
Моя цель-подождать 10 секунд, пока кнопка не будет нажата, а затем включить светодиод. Однако после того, как он подождет в первый раз, светодиод немедленно включится всякий раз, когда я без ожидания нажму кнопку. Что я здесь пропустил?
@CardMaster 405, 👍1
Обсуждение1 ответ
Предполагая, что светодиод будет реагировать в любое время при нажатии кнопки, затем рассмотрите возможность перехода от использования функции delay() к использованию функции millis(). Как только это будет сделано, подумайте о том, чтобы подойти к этой проблеме, рассматривая ее как конечный автомат, в котором определены все возможные состояния и все события, вызывающие переход в следующее состояние, хорошо понятны. Вкратце эта проблема может иметь 2 состояния (светодиод включен и светодиод выключен), и может быть 3 входа (кнопка вверх, кнопка вниз и таймер истек). И могут быть выходы для рассмотрения (например, таймер сброса) в зависимости от желаемого поведения этого устройства.
В итоге, когда вы когда-либо используете функцию delay (), она останавливает вашу программу, и она перестает отвечать на запросы. Если это не то, что вы хотите, вам нужно переключиться на использование millis() и отслеживать время, прошедшее в коде, самостоятельно. Я думаю, что как только вы сделаете это и добавите больше отпечатков() для отладки, вы начнете видеть, где в логике код делает что-то неожиданное., @st2000
- Почему светодиоды заметно мерцают?
- Пытаюсь поддерживать мой основной код в рабочем состоянии, если ввод не будет LOW в течение определенного промежутка времени
- Как справиться с rollover millis()?
- Как получить текущее время и дату в Arduino без внешнего источника?
- Питание светодиодной ленты - Сколько ампер?
- Преобразование в Unix Timestamp и обратно
- Несколько условий оператора if
- Светодиоды: разница между общим анодом и общим катодом
является ли " Состояние кнопки == ВЫСОКОЕ` нажатой кнопкой или отпущенной кнопкой?, @jsotola
какие изменения вы внесли, когда код перестал ждать?, @jsotola
Довольно сложно следовать логике вашего кода, особенно когда какое условие становится истинным. Если вы добавите последовательный вывод, вы должны увидеть, по какому пути идет код., @PMF
у вас есть подтягивающий резистор в цепи кнопки?, @Juraj