Вопрос о миллисекундном таймере

Пытаюсь понять, как это сделать в миллисе. Так что прямо сейчас код работает просто отлично, воспроизводит mp3_play(2), когда кнопка закрыта, а затем воспроизводит mp3_play(1), когда она открыта. Скажем, я хочу, чтобы mp3_play(2) играл, когда кнопка закрыта, но через 4 секунды, если кнопка все еще закрыта, другой аудиофайл будет запущен для воспроизведения. Не могу этого понять.

спасибо Джейсон

void fire(){

  int reading = digitalRead(buttonPin);
 
  if (reading != lastButtonState) {
    // reset the debouncing timer
    lastDebounceTime = millis();
  }
 
  if ((millis() - lastDebounceTime) > debounceDelay) {

    if (reading != buttonState) {
      buttonState = reading;
 
      if (buttonState == HIGH) {
        mp3_play (1); //power down sound 
      }
      
      if (buttonState == LOW) {  
        mp3_play (2);  // fire sound
      }
      
    }
  }
  lastButtonState = reading;
}

, 👍1

Обсуждение

Вы хотите продолжить воспроизведение другого аудио, если прошло уже 4 секунды? или только один раз?, @Fahad

Привет, если бы 3 - й аудиофайл мог воспроизводиться один раз, это было бы здорово. Спасибо, @Jason8899


1 ответ


Лучший ответ:

1

Вы должны следить за временем, как только кнопка нажата (НИЗКО). Таким образом, buttonLowTime инициализируется каждый раз, когда вы нажимаете кнопку. В логике if вы сначала проверяете, является ли состояние кнопки НИЗКИМ и прошло ли указанное время.

Но вы также упомянули, что хотите один раз воспроизвести звук. Так что вам нужно отслеживать, если вы уже воспроизводили звук. Таким образом, для отслеживания этого был создан флаг timeoutAudioPlayed. Итак, теперь 3-й звук будет воспроизводиться только в том случае, если:

  1. Кнопка нажата
  2. и нажимается больше указанного времени (BUTTON_LOW_TIME_MAX)
  3. и если звук не был воспроизведен.
void fire()
{
  static int buttonLowTime = 0; <-------------------
  static bool timeoutAudioPlayed = true; <---------
  
  int reading = digitalRead(buttonPin);
 
  if (reading != lastButtonState) 
  {
    // reset the debouncing timer
    lastDebounceTime = millis();
  }
 
  if ((millis() - lastDebounceTime) > debounceDelay) 
  {
    if (reading != buttonState) 
    {
      buttonState = reading;
 

      if (buttonState == HIGH) 
      {
        mp3_play (1); //power down sound 
      }
  
      if (buttonState == LOW) 
      {  
        mp3_play (2);  // fire sound
        buttonLowTime = millis(); <-----------
        timeoutAudioPlayed = false; <---------
      }
    }
  }

  // The logic for timeout audio <------------
  if((buttonState == LOW) && (millis() - buttonLowTime) > BUTTON_LOW_TIME_MAX && timeoutAudioPlayed == false)
  {
    mp3_play (3);
    timeoutAudioPlayed = true;
  }

  lastButtonState = reading;
}
,

Отлично, я действительно ценю это. Спасибо, @Jason8899

Спасибо за помощь, Фахад. Одна небольшая проблема после попытки кода, он отлично работает несколько раз, затем он воспроизводит файл (3) только нажатием кнопки, а не (2) больше., @Jason8899

Я могу просто предположить причину. Я изменил логику тайм-аута с lastButtonState на buttonState. Потому что lastButtonState является истинным даже без прохождения проверки отмены. Я обновил приведенный выше код. Дай мне знать, если это сработает., @Fahad

К сожалению, у него все та же проблема, он работает несколько раз, как задумано, а затем ломается. Спасибо, Фахад, @Jason8899

Я изменил "static int buttonLowTime" на "static long buttonLowTime", и теперь, похоже, все работает нормально., @Jason8899

О, моя вина. Это должно было быть долго и НЕ скоро. Хороший улов!, @Fahad

еще раз спасибо..., @Jason8899