MP3 DF Player проблема с воспроизведением

Здравствуйте, многоуважаемые профессионалы!
Не ругайте за мой @овно код.

Есть задача - много кнопок по нажатию на которые должны воспроизводиться короткие аудиофайлы, типа взрывы и т.п.
Нужно нажать на кнопку и должен воспроизвестись аудиофайл ОДИН раз.
Кнопок разные - одни с фиксацией, другие нет. Нужно сделать так, чтобы по нажатию формировался импульс, который включал бы аудиофайл с df mp3 player’а.
MP3 DF PLAYER’а у меня две штуки и один воспроизводит длинные аудиофайлы, другой короткие. Соответственно я не могу ставить в конце каждого аудиофайла delay(), так как не хочу чтобы весь код тормозился и ждал пока этот файл отыграет.
На данный момент пока нажата кнопка mp3dfplayer бесконечно быстро запускает аудиофайл, думаю с каждым циклом, а как только отжимаешь кнопку начинает играть аудиофайл нормально и ОДИН раз.
Сейчас мне нужно включить аудиофайл только ОДИН раз и без delay().
Что я делаю не так?

#include <DFRobotDFPlayerMini.h>
#include <SoftwareSerial.h>
SoftwareSerial mySoftwareSerial(15, 14); // RX, TX
DFRobotDFPlayerMini myDFPlayer;

void setup()
{
Serial.begin(9600);
mySoftwareSerial.begin(9600);
myDFPlayer.begin(mySoftwareSerial);
myDFPlayer.disableDAC();
myDFPlayer.volume(5);

 pinMode(24, INPUT_PULLUP);
 pinMode(10, OUTPUT);
 digitalWrite(10, LOW);
}
bool test = false;
uint32_t btnTimer = 0;
void loop()
{
  bool btnState = !digitalRead(24);
  if (btnState && !test && millis() - btnTimer > 100) {
    test = true;
  btnTimer = millis();
   Serial.println("press");
  }
 if (btnState && test && millis() - btnTimer > 500) {
    btnTimer = millis();
    Serial.println("press hold");
 }
  if (!btnState && test && millis() - btnTimer > 500) {
    test = false;
    btnTimer = millis();}
 Serial.println("hold");

if (test == true) {
digitalWrite(10,HIGH);
myDFPlayer.play(5);}
else {digitalWrite(10,LOW);

}

}

Что выводится при этом в UART ?

Когда кнопка отжата UART пишет Hold
Когда кнопка нажата UART пишет
press
press hold
hold
press hold
hold
press hold
hold

Условие в 37 строке будет выполняться при каждом проходе loop(), пока нажата кнопка. Т.е. все работает ровно так, как вы и накодили. После отпускания кнопки файл играется нормально и один раз потому, что его больше не перезапускают.
По хорошему нужен еще один флаг, который взводится при запуске файла и сбрасывается после отпускания кнопки. И проверку этого флага добавить в условие в строке 37

По хорошему нужен не еще один а единственный флаг - “кнопка была нажата”, который взводится при переходе кнопки из состояния “отпущено” в состояние “нажато”, а отпускается - при реакции на нажатие.

Этот флаг у него уже есть. Можно, конечно, его сбрасывать при запуске файла, но пока кнопка нажата он будет снова взводиться.
А вот чтобы делать по науке, т.е. отлавливать именно изменение состояния кнопки, таки понадобится еще один флаг - последнее состояние кнопки. Так что одним флагом по любому не обойтись :wink:

С какой стати флаг, который взводится при переключении кнопки из одного состояния в другое будет взводиться, пока кнопка нажата?

Да, но “внутренний” флаг кнопки, он делается отдельно и никак не связан с основной логикой программы. Это private флаг.

Где у него в коде отслеживание изменения состояния кнопки? Нету. А флаг есть

Мне рассказывать не нужно, я знаю, как с кнопкой работать. А ТС от таких слов растеряться может ))