Воспроизведение дорожек MP3 Shield
У меня есть защита MP3 на Arduino Uno. При использовании «Файлового проигрывателя» я могу заставить треки воспроизводиться с помощью ввода с клавиатуры трех цифр (001-009).
Проблема в том, что я хочу использовать (SFEMP3Shield > примеры > MP3ButtonPlayer2), который ищет файлы 1-9. Любые номера файлов, кроме 1,2,3,4,5,6,7,8,9, не работают. Есть предложения?
@Darryl Green, 👍0
Обсуждение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
- SD-карта не инициализируется
- SIM900 3G? Или SIM900A умеет подключаться к 3G?
- Неиспользуемые контакты в Arduino L293D motor shield?
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Как отправить данные из Arduino Uno с SIM900 GPRS в Firebase
- Отправка текстового сообщения через Wi-Fi-shield Arduino
- Arduino Ethernet Shield при использовании контактов Arduino Mega
- Использование оранжевого/белого контакта экрана двигателя Arduino
Добро пожаловать в Ардуино: SE. Пожалуйста, опубликуйте код, который вы пытаетесь использовать. Вы можете найти этот пост на нашем мета-сайте полезным: [Как задать хороший вопрос для Arduino Stack Exchange](https://arduino.meta.stackexchange.com/questions/2523/how-to-ask-a-good- вопрос для обмена стеками arduino)., @sempaiscuba