Вопрос о миллисекундном таймере
Пытаюсь понять, как это сделать в миллисе. Так что прямо сейчас код работает просто отлично, воспроизводит 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;
}
@Jason8899, 👍1
Обсуждение1 ответ
Лучший ответ:
Вы должны следить за временем, как только кнопка нажата (НИЗКО). Таким образом
, buttonLowTime инициализируется каждый раз, когда вы нажимаете кнопку. В логике if вы сначала проверяете
, является ли состояние кнопки НИЗКИМ
и прошло ли указанное время.
Но вы также упомянули, что хотите один раз воспроизвести звук. Так что вам нужно отслеживать, если вы уже воспроизводили звук. Таким образом, для
отслеживания этого был создан флаг timeoutAudioPlayed. Итак, теперь 3-й звук будет воспроизводиться только в том случае, если:
- Кнопка нажата
- и нажимается больше указанного времени (
BUTTON_LOW_TIME_MAX
) - и если звук не был воспроизведен.
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
- Как справиться с rollover millis()?
- Использование millis() и micros() внутри процедуры прерывания
- ардуино - миллисекунды ()
- Кнопка с таймером переключения и функцией сброса времени + светодиод обратной связи
- Использовать timer0, не влияя на millis() и micros().
- Торговый автомат Arduino для мониторинга ввода монет в слот во время ожидания ввода пользователя
- Влияет ли `millis()` на длинные ISR?
- nodeMCU — Millis() — Простой счетчик — Как долго горит светодиод?
Вы хотите продолжить воспроизведение другого аудио, если прошло уже 4 секунды? или только один раз?, @Fahad
Привет, если бы 3 - й аудиофайл мог воспроизводиться один раз, это было бы здорово. Спасибо, @Jason8899