Код больше не ждет, когда кнопка не нажата

Итак, вот код

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 секунд, пока кнопка не будет нажата, а затем включить светодиод. Однако после того, как он подождет в первый раз, светодиод немедленно включится всякий раз, когда я без ожидания нажму кнопку. Что я здесь пропустил?

, 👍1

Обсуждение

является ли " Состояние кнопки == ВЫСОКОЕ` нажатой кнопкой или отпущенной кнопкой?, @jsotola

какие изменения вы внесли, когда код перестал ждать?, @jsotola

Довольно сложно следовать логике вашего кода, особенно когда какое условие становится истинным. Если вы добавите последовательный вывод, вы должны увидеть, по какому пути идет код., @PMF

у вас есть подтягивающий резистор в цепи кнопки?, @Juraj


1 ответ


1

Предполагая, что светодиод будет реагировать в любое время при нажатии кнопки, затем рассмотрите возможность перехода от использования функции delay() к использованию функции millis(). Как только это будет сделано, подумайте о том, чтобы подойти к этой проблеме, рассматривая ее как конечный автомат, в котором определены все возможные состояния и все события, вызывающие переход в следующее состояние, хорошо понятны. Вкратце эта проблема может иметь 2 состояния (светодиод включен и светодиод выключен), и может быть 3 входа (кнопка вверх, кнопка вниз и таймер истек). И могут быть выходы для рассмотрения (например, таймер сброса) в зависимости от желаемого поведения этого устройства.

,

В итоге, когда вы когда-либо используете функцию delay (), она останавливает вашу программу, и она перестает отвечать на запросы. Если это не то, что вы хотите, вам нужно переключиться на использование millis() и отслеживать время, прошедшее в коде, самостоятельно. Я думаю, что как только вы сделаете это и добавите больше отпечатков() для отладки, вы начнете видеть, где в логике код делает что-то неожиданное., @st2000