Как я могу сохранить нажатие кнопки push, затем подождать, пока "millis() - changeTime >= 10000", а затем вызвать функцию changeLights()?

Я делаю интерактивный светофор с тремя светодиодами для автомобилей и двумя светодиодами для пешеходов. У этих пешеходов есть кнопка, чтобы они могли запросить зеленый свет. Стандартная настройка всегда зеленого цвета для автомобилей (10 секунд) и красного цвета для пешеходов (5 секунд). Прямо сейчас мой код разрешает пешеходам только нажимать кнопку и получать зеленый свет ПОСЛЕ того, как у автомобилей загорелся зеленый свет в течение 10 секунд.

У меня вопрос, как я могу сохранить нажатие кнопки в течение 10 секунд и вызвать мою функцию? changeLights() после этих 10 секунд без ожидания.

Мой код:

void loop() {
    int buttonState = digitalRead(pushButton);

    if (buttonState == HIGH && millis() - changeTime >=
        10000){
        changeLights();
      }
    }

1 ответ

Вам понадобится пара переменных: одна, чтобы отслеживать, нажал ли пешеход кнопку (pedestrianIsWaiting), а другое время, когда пешеход нажал кнопку (changeTime).

Каждый раз loop функция вызвана, проверьте кнопку. Если кнопка нажата и пешеход уже не ждет, измените pedestrianIsWaiting к истине, и запишите время в changeTime переменная.

Затем, пока пешеход ждет, проверьте прошедшее время. Если прошло 10 секунд, вызовите функцию и измените pedestrianIsWaiting обратно в ложь.

Код выглядит так:

bool pedestrianIsWaiting = false;
unsigned long changeTime;

void loop()
{
    int buttonState = digitalRead(pushButton);
    if (buttonState == HIGH && !pedestrianIsWaiting)
    {
        pedestrianIsWaiting = true;
        changeTime = millis();
    }

    if (pedestrianIsWaiting)
    {
        unsigned long elapsedTime = millis() - changeTime;
        if (elapsedTime >= 10000)
        {
            changeLights();
            pedestrianIsWaiting = false;
        }
    }
}
Другие вопросы по тегам