Воспроизведение дорожек MP3 Shield

У меня есть защита MP3 на Arduino Uno. При использовании «Файлового проигрывателя» я могу заставить треки воспроизводиться с помощью ввода с клавиатуры трех цифр (001-009).

Проблема в том, что я хочу использовать (SFEMP3Shield > примеры > MP3ButtonPlayer2), который ищет файлы 1-9. Любые номера файлов, кроме 1,2,3,4,5,6,7,8,9, не работают. Есть предложения?

, 👍0

Обсуждение

Добро пожаловать в Ардуино: SE. Пожалуйста, опубликуйте код, который вы пытаетесь использовать. Вы можете найти этот пост на нашем мета-сайте полезным: [Как задать хороший вопрос для Arduino Stack Exchange](https://arduino.meta.stackexchange.com/questions/2523/how-to-ask-a-good- вопрос для обмена стеками arduino)., @sempaiscuba


1 ответ


1

Функция playTrack, используемая в примере MP3ButtonPlayer2, воспроизводит файл с именем, созданным в формате printf "track%03d.mp3". %03d создает число с нулевым префиксом до длины 3. Например, track005.mp3, track042.mp3 или track999.mp3.

реализация функции playTrack:

uint8_t SFEMP3Shield::playTrack(uint8_t trackNo){

  //место хранения названий треков
  char trackName[] = "track001.mp3";
  uint8_t trackNumber = 1;

  // прикрепляем номер к остальной части имени файла
  sprintf(trackName, "track%03d.mp3", trackNo);

  // воспроизвести файл
  return playMP3(trackName);
}

изменить на:

uint8_t SFEMP3Shield::playTrack(uint8_t trackNo){

  //место хранения названий треков
  char trackName[13];
  int trackNumber = trackNo;

  // прикрепляем номер к остальной части имени файла
  sprintf(trackName, "track%03d.mp3", trackNumber);

  // воспроизвести файл
  return playMP3(trackName);
}
,

Спасибо, логично, но я не программист, не знаю, как отредактировать SFEMP3Shield > примеры > MP3ButtonPlayer2, чтобы он заработал., @Darryl Green

вставьте SD-карту в компьютер и переименуйте файлы. Вы должны купить MP3-плеер, а не Arduino, если вы не хотите программировать, @Juraj

Это часть более крупной программы, в которой используется код, который я разработал. Это единственное, с чем я не смог работать, хотя Sparkfun говорит, что должно работать из коробки. Это просто нужно играть 3 трека, когда что-то происходит. Я несколько раз переименовывал треки. Код, который вы дали, идет на SD-карту или в код MP3ButtonPlayer2?, @Darryl Green

это никуда не денется. это в библиотеке. (и обидно автору библиотеки, потому что она не должна быть закодирована как есть), @Juraj

Библиотека SFEMP3Shield включена в скетч. Во что мне переименовать треки? Когда я запускаю File Player, я получаю;, @Darryl Green

Полученная команда: л Найдены музыкальные файлы: 00001: SndoSil.mp3 00002: Stmup.mp3 00003: Блндблт.mp3 Я переименовал файлы 001 002 003 без изменений., @Darryl Green

5-значного номера нет на SD-карте. Генерируется в файловом плеере., @Darryl Green

это должно быть track001.mp3, @Juraj

Это не так, это моя точка зрения. Я переименовал его в track001.mp3, и где-то в загрузке он отображается как track00001.mp3. Техническая поддержка Sparkfun посоветовала мне ввести два начальных нуля, и, поскольку я доказал, что затруднительные работы выполнены, они сказали мне, чтобы я сам разобрался. Знаете ли вы, как добавить два ведущих нуля @ int8_t track = 0; в скетче MP3ButtonPlayer2?, @Darryl Green

C:\Program Files (x86)\Arduino\libraries\SFEMP3Shield\SFEMP3Shield.cpp: В функции-члене 'uint8_t SFEMP3Shield::vs_init()': C:\Program Files (x86)\Arduino\libraries\SFEMP3Shield\SFEMP3Shield.cpp:292:34: предупреждение: ISO C++ запрещает преобразование строковой константы в 'char*' [-Wwrite-strings] если(VSLoadUserCode("patches.053")) вернуть 6;, @Darryl Green

функция playTrack добавит два начальных нуля, если у вас такая же библиотека. назовите его как playTrack(1), playTrack(2), playTrack(3),, @Juraj

Нужно добавить два «ДОПОЛНИТЕЛЬНЫХ» нуля. Библиотека SFEMP3Shield, и я скачал ее из многих мест и с разными датами. вот что я получаю от "FilePlayer" Полученная команда: л Найдены музыкальные файлы: 00001: SndoSil.mp3 00002: Stmup.mp3 00003: Блндблт.mp3 00004: трек001.mp3 Sparkfun сказал мне, что они заметили, что он добавляет дополнительные нули и вводит два дополнительных нуля с клавиатуры в «FilePlayer», и это будет работать, что и происходит, но я хочу использовать MP3ButtonPlayer2, который генерирует свой собственный номер и не работает., @Darryl Green

Скетч MP3ButtonPlayer2 вызывает playTrack(1), playTrack(2), playTrack(3), он должен вызывать playTrack(001), playTrack(002), playTrack(003) или библиотеку SFEMP3Shield, которую необходимо исправить., @Darryl Green

параметр функции playTrack имеет значение int. функция строит имя, как вы видите в моем ответе. прочитай ответ еще раз, @Juraj

Я прочитал ваш ответ несколько раз. Я понимаю, что в эскизе добавлены два нуля. нужно добавить еще два нуля или поправить библиотеку SFEMP3Shield., @Darryl Green

но SD-карта поддерживает только 8-символьные имена (плюс расширение файла), @Juraj

откуда у тебя библиотека?, @Juraj

Имена состоят из 8 символов или менее. Пятизначного числа быть не должно. Я не ставил его туда. Как я уже сказал, я скачал из нескольких мест более старые и новые версии с тем же результатом. Не могли бы вы прислать мне ссылку, где, как вы думаете, я могу получить правильный?, @Darryl Green

https://github.com/madsci1016/Sparkfun-MP3-Player-Shield-Arduino-библиотека, @Juraj

Спасибо, я скачаю и заменю существующую библиотеку., @Darryl Green

Сделал это. Без изменений!, @Darryl Green

так что пример MP3ButtonPlayer2 не воспроизводит track001.mp3? является ли файл действительным файлом mp3? или у вас есть какой-то другой эскиз? если да, добавьте его в вопрос, @Juraj

Да, пример MP3ButtonPlayer2 не воспроизводит track001.mp3, который является действительным файлом mp3. Как объяснялось выше, он воспроизводится с использованием «Файлового проигрывателя», когда я последовательно ввожу 0000X., @Darryl Green

а у тебя кнопки подключены к А0, А1, А2? И когда вы нажимаете кнопку на A2, он печатает «B_NEXT нажата, начните воспроизведение следующего трека № 1» и не воспроизводится?, @Juraj

Да, кнопки подключены к А0, А1, А2? И когда нажимается A2, он печатает «B_NEXT нажат, начните воспроизведение следующего трека № 1» и не воспроизводится., @Darryl Green

Вы можете сделать небольшую модификацию функции playTrack в библиотеке? измените char trackName[] = "track001.mp3"; на char trackName[13];, @Juraj

Где? Примеры, ключевые слова, SFEMP3Shield.cpp, SFEMP3Shield.h, SFEMP3ShieldConfig.h, SFEMP3Shieldmainpage.h, @Darryl Green

SFEMP3Shield.cpp, @Juraj

затем вы можете попробовать изменить тип параметра с uint8_t trackNo на int trackNo, потому что это правильно для sprintf., @Juraj

Хорошо, я нашел его в SFEMP3Shield.cpp и могу открыть только в wordpad или блокноте. Когда я изменяю его, он не позволяет мне сохранить, потому что у меня нет прав администратора., @Darryl Green

uint8_t trackNo в int trackNo это в скетче?, @Darryl Green

Я изменил uint8_t track =0; для внутренней дорожки =0; в эскизе. Без изменений., @Darryl Green

Хорошо, я открыл SFEMP3Shield.cpp с помощью Visual Studio и изменил char trackName[] = "track001.mp3"; to char имя_дорожки[13]; Без изменений., @Darryl Green

Ты знаешь что это значит? C:\Program Files (x86)\Arduino\libraries\SFEMP3Shield\SFEMP3Shield.cpp: В функции-члене 'uint8_t SFEMP3Shield::vs_init()': C:\Program Files (x86)\Arduino\libraries\SFEMP3Shield\SFEMP3Shield.cpp:292:34: предупреждение: ISO C++ запрещает преобразование строковой константы в 'char*' [-Wwrite-strings] если(VSLoadUserCode("patches.053")) вернуть 6;, @Darryl Green

переменная дорожка не используется. вы должны изменить параметр trackNo, @Juraj

Извините, я не знаю, что это значит., @Darryl Green

В скетче нет трека, @Darryl Green

фрагмент в моем ответе. первая линия, @Juraj

uint8_t SFEMP3Shield::playTrack(uint8_t trackNo){ на uint8_t SFEMP3Shield::playTrack(int trackNo){, @Juraj

В скетче нет "trackNo", вы имеете в виду что-то другое?, @Darryl Green

в SFEMP3Shield.cpp playTrack, @Juraj

не будет компилироваться. 'uint8_t SFEMP3Shield::playTrack(int)' не соответствует ни одному в классе 'SFEMP3Shield', @Darryl Green

извините, я забыл, что это потребует изменения в .h. Добавляю в ответ модифицированную версию функции playTrack. попробуй это, @Juraj

Извините, я могу вырезать и вставить, но мне нужно знать, что и где., @Darryl Green

из ответа на SFEMP3Shield.cpp, @Juraj

Я не знаю, что такое ответ на SFEMP3Shield.cpp., @Darryl Green

скопировать/вставить из ответа здесь, на SE. мой ответ на ваш вопрос. Я отредактировал это. прокрутить вверх, @Juraj

Я потерялся, где здесь на SE?, @Darryl Green

https://arduinoprosto.ru/q/57147/playing-mp3-shield-tracks/57148#57148, @Juraj

еще потерял, я уже проходил через это раньше, вы сказали, что потребуются изменения в .h., @Darryl Green

который мы не делаем, вместо этого мы используем неиспользуемую переменную, чтобы иметь тип int. sprintf не любит uint8_t, @Juraj

Я не программист, я не знаю, что это значит, извините., @Darryl Green

Я уверен, что внес все указанные вами изменения со следующим результатом: C:\Program Files (x86)\Arduino\libraries\SFEMP3Shield\SFEMP3Shield.cpp: В функции-члене 'uint8_t SFEMP3Shield::vs_init()': C:\Program Files (x86)\Arduino\libraries\SFEMP3Shield\SFEMP3Shield.cpp:292:34: предупреждение: ISO C++ запрещает преобразование строковой константы в 'char*' [-Wwrite-strings] если(VSLoadUserCode("patches.053")) вернуть 6; C:\Program Files (x86)\Arduino\libraries\SFEMP3Shield\SFEMP3Shield.cpp: В глобальном масштабе: C:\Program Files (x86)\Arduino\libraries\SFEMP3Shield\SFEMP3Shield.cpp:1025:9:, @Darryl Green

ошибка: прототип для "uint8_t SFEMP3Shield::playTrack(int)" не соответствует ни одному в классе "SFEMP3Shield" uint8_t SFEMP3Shield::playTrack(int trackNo){ В файле из C:\Program Files (x86)\Arduino\libraries\SFEMP3Shield\SFEMP3Shield.cpp:9:0: C:\Program Files (x86)\Arduino\libraries\SFEMP3Shield\SFEMP3Shield.h:691:13: ошибка: кандидат: uint8_t SFEMP3Shield::playTrack(uint8_t) uint8_t playTrack(uint8_t); статус выхода 1 Ошибка компиляции для платы Arduino/Genuino Uno., @Darryl Green

да. параметр должен быть uint8_t. отменить это изменение. первая «ошибка» — это всего лишь предупреждение. это всегда было там, @Juraj

Кажется, я хожу кругами, мы снова там, где были. Можете ли вы внести нужные изменения в файл SFEMP3Shield\SFEMP3Shield.cpp и дать мне ссылку на него, чтобы убедиться, что он именно такой, как вы хотите? Я все еще считаю, что проблема в 5-значном индексе. Где это генерируется?, @Darryl Green

он создается в примере FilePlayer с SerialPrintPaddedNumber(count, 5);, @Juraj

Я не могу найти SerialPrintPaddedNumber(count, 5 ); в примере FilePlayer., @Darryl Green

Я нахожу это в SFEMP3Shield\SFEMP3Shield.cpp, строка 184 и строка 621., @Darryl Green

Я ожидаю, что индекс изменится, когда я изменю 5 на 3, но это не так., @Darryl Green

Можете ли вы внести нужные изменения в файл SFEMP3Shield\SFEMP3Shield.cpp и дать мне ссылку на него, чтобы убедиться, что он именно такой, как вы хотите?, @Darryl Green

в ответе оригинальная и модифицированная версия функции playTrack, @Juraj

SerialPrintPaddedNumber — последняя функция в скетче. эта нумерация не является чем-то общим. это то, как скетч использует выбор пользователя, @Juraj

Где ответ?, @Darryl Green

мы комментируем это здесь. прокрутить вверх, @Juraj

перезагружен SFEMP3Shield\SFEMP3Shield.cpp, изменена функция playTrack сверху. Нет прогресса, MP3ButtonPlayer2 делает все, кроме воспроизведения. Я уже спрашивал вас раньше, знаете ли вы, как добавлять ведущие нули в строку?, @Darryl Green

да. функция playTrack делает это, как вы можете видеть в ответе, и функция SerialPrintPaddedNumber в примере FilePlayer делает то же самое, @Juraj