Циклическое воспроизведение MP3 + клавиатура

Здравствуйте. Вот программа, которая воспроизводит ряд аудиофайлов по нажатиям кнопок, а при запуске зацикленно воспроизводит ещё один аудиофайл.

#include <DFPlayer_Mini_Mp3.h>

const int buttonPin = 0;
int buttonState = 0;

void setup() {
  Serial.begin(9600); // Инициализация серийного порта для общения с DFPlayer
  pinMode(buttonPin, INPUT);

  mp3_set_serial(Serial); // Присваиваем аппаратный Serial для общения с DFPlayer
  delay(100); // Некоторая задержка для инициализации DFPlayer
  mp3_set_volume(10); // Устанавливаем громкость (от 0 до 30)

  attachInterrupt(0, swap, RISING);
}

void swap() {
  buttonState = analogRead(buttonPin);

  if (buttonState >= 1000){mp3_play(11);}
  if (buttonState >= 760 && buttonState < 770){mp3_play(10);}
  if (buttonState >= 610 && buttonState < 620){mp3_play(9);}
  if (buttonState >= 510 && buttonState < 520){mp3_play(8);}
  if (buttonState >= 435 && buttonState < 445){mp3_play(7);}
  if (buttonState >= 380 && buttonState < 390){mp3_play(6);}
  if (buttonState >= 335 && buttonState < 345){mp3_play(5);}
  if (buttonState >= 305 && buttonState < 315){mp3_play(4);}
  if (buttonState >= 275 && buttonState < 285){mp3_play(3);}
  if (buttonState >= 250 && buttonState < 260){mp3_play(2);}
}

void loop() {
//    delay(250);
//     mp3_play (1);
//    delay(24000);
}

Однако на практике воспроизведение любого из аудиофайлов обрывается, не доиграв до конца. Не устанавливал закономерность, в какой именно момент, у одного и того же файла это может быть разный момент.
Пожалуйста, подскажите, какой ещё есть способ зацикливания воспроизведения, кроме задания времени (в данном примере 24000 мс — округлённая длина аудиозаписи 1), который позволил бы избежать обрывов.
Примечание. Нужно не использовать для управления плеером никаких пинов, кроме TX и RX.

ясненько

А как нужно сделать?

Да, это именно аналоговый вход. Я сделал резистивную клавиатуру. Кнопки все находятся на этом пине и соединены резисторами.
Только простите меня, я абсолютный новичок и мне ещё непонятны ваши полунамёки, которыми вы отвечаете.

Нужна схема как вы подключили.

1 лайк
 pinMode(buttonPin, INPUT);

не нужно.
Вызывайте swap(); в цикле loop, доработав логику работы.
Вам нужно чтобы при включении питания циклично воспроизводился один файл, а при нажатии на кнопки другие, и потом обратно циклично первый файл?

Плата какая?

:+1:
без этого, обсуждение бесполезно!
ибо там каша

Вы мне напишите, в каком симуляторе можно сделать схему, где можно добавить DFPlayer Mini, и я вам покажу схему. Или нарисую её от руки.

Нарисуй на листочке и сфоткай - это самое быстрое.

1 лайк

и еще, на плате DFPlayer есть специальный вывод BUSY, на котором выставляется низкий уровень на время воспроизведения файла.

это с чем связано?

тогда твой код полный бред

ну парень новичок и думает, что это цепляет прерывание на 0 вывод, а потом он

читает клавиатуру, с того же вывода), тут каша полная.
на первый раз можно простить и вразумить.

Не с того же.
Клавиатуру он читает на A0

а я смайл зря поставил?

прерывание на D2, читает А0, там swap видимо от наводок вызывается.

Если клипы МП3 всегда одни и те же - поверь, задание их длительности будет для этого самым правильным подходом.

Пытался, не сработало.

Выпей 200 грамм и всё решиться.

2 лайка