Здравствуйте, работаем с music shield и хотим, чтобы саундтрэки воспроизводились в следующем порядке: "Hi" или "Hello" (раз через раз), затем "PutRub, затем таймер на 5 секунд, затем "Thanks" или "ThankYou" (раз через раз) и затем "SaveTown"(раз через три). ПРОБЛЕМА: Проигрывание идёт не в той последовательности, в которой запланировано. Serial Port показывает, что команды выполняются не в той последовательности, в которой запланировано. СКЕТЧ: Код (Text): #include <SD.h> #include <SPI.h> #include <arduino.h> #include <MusicPlayer.h> int k = 0; int rand1 = 0; int time = 0; void setup() { Serial.begin(9600); player.begin(); //will initialize the hardware and set default mode to be normal. player.setPlayMode (PM_REPEAT_LIST); } void loop() { rand1++; if ((rand1%2) == 0){ //___________Проиграть_____________// player.addToPlaylist("Hello.mp3"); player.play(); delay(1000); player.deleteSong("Hello.mp3"); delay(1000); //_________________________________// } else { //___________Проиграть_____________// player.addToPlaylist("Hi.mp3"); player.play(); delay(1000); player.deleteSong("Hi.mp3"); delay(1000); //_________________________________// } //___________Проиграть_____________// player.addToPlaylist("PutRub.mp3"); player.play(); delay(1000); player.deleteSong("PutRub.mp3"); delay(1000); //_________________________________// time = 0; while (time <= 5){ time = time + 1; delay(1000); } if ((rand1%2) == 0){ //___________Проиграть_____________// player.addToPlaylist("Thanks.mp3"); player.play(); delay(1000); player.deleteSong("Thanks.mp3"); delay(1000); //_________________________________// } else { //___________Проиграть_____________// player.addToPlaylist("ThankYou.mp3"); player.play(); delay(1000); player.deleteSong("ThankYou.mp3"); delay(1000); //_________________________________// } if ((rand1%4) == 0){ //___________Проиграть_____________// player.addToPlaylist("SaveTown.mp3"); player.play(); delay(1000); player.deleteSong("SaveTown.mp3"); delay(1000); //_________________________________// } } ВТОРОЙ ВОПРОС: Как реализовать возможность постоянного сканирования ультразвуковым датчиком при одновременном воспроизведении и таймере?
Ничего одновременного процессор делать не может (даже ядро современного процессора). Но процессор можно заставить делать чуть-чуть первую задачу, чуть-чуть вторую. Если на обычном компьютере этим занимается операционная система, то на микроконтроллерах нужно реализовывать это с помощью своего алгоритма. Используйте вместо `delay` проверку вида «а прошло ли нужное количество времени с момента старта задачи?». Например, вместо: Код (Text): player.addToPlaylist("Hello.mp3"); player.play(); delay(1000); player.deleteSong("Hello.mp3"); Делайте: Код (Text): player.addToPlaylist("Hello.mp3"); unsigned long startTime = millis(); player.play(); while (millis() < startTime + 1000) { doSomeUsefulStuffWhileWaiting(); } player.deleteSong("Hello.mp3"); Тут, в `doSomeUsefulStuffWhileWaiting` вы можете делать какую-то «параллельную» задачу. Например, опрос вашего дальномера. Помните, однако, что эта функция также не должна надолго блокировать процессор, чтобы алгоритм имел физическую возможность пойти дальше. Что касается первого вопроса: какая последовательность треков получается на деле? Стабильна ли эта последовательность?
Вот последовательность в первый запуск: VS10xx Clock Frq: 0xC000 Card type: SD2 Volume type is FAT16 Playing song Hi.mp3 ... Delete song:Hi.mp3 [done]. Delete songutRub.mp3 Playing song ThankYou.mp3 ... Delete song:ThankYou.mp3 [done]. Delete song:Hello.mp3 Playing song PutRub.mp3 ... Delete songutRub.mp3 [done]. Delete song:Thanks.mp3 Playing song Hi.mp3 ... Delete song:Hi.mp3 [done]. Delete songutRub.mp3 Playing song ThankYou.mp3 ... Delete song:ThankYou.mp3 [done]. Delete song:Hello.mp3 Playing song PutRub.mp3 ... Delete songutRub.mp3 [done]. Delete song:Thanks.mp3 Playing song SaveTown.mp3 ... Delete song:SaveTown.mp3 Delete song:Hi.mp3 [done]. Delete songutRub.mp3 Playing song ThankYou.mp3 ... Delete song:ThankYou.mp3 [done]. Delete song:Hello.mp3 Playing song PutRub.mp3 ... Delete songutRub.mp3 итд Вот во второй: VS10xx Clock Frq: 0xC000 Card type: SD2 Volume type is FAT16 Playing song Hi.mp3 ... Delete song:Hi.mp3 [done]. Delete songutRub.mp3 Playing song ThankYou.mp3 ... Delete song:ThankYou.mp3 [done]. Delete song:Hello.mp3 Playing song PutRub.mp3 ... Delete songutRub.mp3 [done]. Delete song:Thanks.mp3 Playing song Hi.mp3 ... Delete song:Hi.mp3 [done]. Delete songutRub.mp3 Playing song ThankYou.mp3 ... Delete song:ThankYou.mp3 [done]. Delete song:Hello.mp3 Playing song PutRub.mp3 ... Delete songutRub.mp3 [done]. Delete song:Thanks.mp3 Playing song SaveTown.mp3 ... Delete song:SaveTown.mp3 Delete song:Hi.mp3 [done]. Delete songutRub.mp3 Playing song ThankYou.mp3 ... Delete song:ThankYou.mp3 [done]. Delete song:Hello.mp3 VS10xx Clock Frq: 0xC000 Card type: SD2 Volume type is FAT16 Playing song Hi.mp3 ... Delete song:Hi.mp3 [done]. Delete songutRub.mp3 Playing song ThankYou.mp3 ... Delete song:ThankYou.mp3 [done]. Delete song:Hello.mp3 Playing song PutRub.mp3 ... Delete songutRub.mp3 [done]. Delete song:Thanks.mp3 Playing song Hi.mp3 ... Delete song:Hi.mp3 [done]. Delete songutRub.mp3 Playing song ThankYou.mp3 ... Delete song:ThankYou.mp3 [done]. Delete song:Hello.mp3 Playing song PutRub.mp3 ... Delete songutRub.mp3 [done]. Delete song:Thanks.mp3 Playing song SaveTown.mp3 ... Delete song:SaveTown.mp3 Delete song:Hi.mp3 [done]. Delete songutRub.mp3 Playing song ThankYou.mp3 ... Delete song:ThankYou.mp3 [done]. Delete song:Hello.mp3 Обращаю внимание на то, что последовательность действий не та, которая запрограммирована!
Пожалуйста, используйте на форуме BB-тэг CODE для листингов (кнопка «Код» над редактором). Похоже, что перемудрили с плей-листами и режимами их проигрывания. Видно, что вам просто нужно в определённый момент играть определённый трек. Используйте специально сделанную для этого функцию `playOne`. См. пример из библиотеки.
Возникает проблема связанная с переключением от одного трека на другой: Код (Text): #include <SD.h> #include <SPI.h> #include <arduino.h> #include <MusicPlayer.h> int k = 0; void setup(void) { Serial.begin(9600); player.begin(); //will initialize the hardware and set default mode to be normal. player.setPlayMode(PM_REPEAT_ONE); //set mode to repeat playing a song player.playOne("Hello.mp3"); //play a song with its name } void loop(void) { player.playOne("Hello.mp3"); player.play(); //do some leisurely job //player.deleteSong("Hello.mp3");//set mode to repeat playing a song player.playOne("Hi.mp3"); //play a song with its name player.play(); //do some leisurely job //player.deleteSong("Hi.mp3");//set mode to repeat playing a song } Пишет следующее: Код (Text): VS10xx Clock Frq: 0xC000 Card type: SD2 Volume type is FAT16 Hello.mp3 already exists in playlist. Playing song Hello.mp3 ... Hi.mp3 does not exists. Hello.mp3 already exists in playlist. Hello.mp3 already exists in playlist. Hi.mp3 already exists in playlist. Hello.mp3 already exists in playlis если вставить delete: Код (Text): #include <SD.h> #include <SPI.h> #include <arduino.h> #include <MusicPlayer.h> int k = 0; void setup(void) { Serial.begin(9600); player.begin(); //will initialize the hardware and set default mode to be normal. player.setPlayMode(PM_REPEAT_ONE); //set mode to repeat playing a song player.playOne("Hello.mp3"); //play a song with its name } void loop(void) { player.playOne("Hello.mp3"); player.play(); //do some leisurely job player.deleteSong("Hello.mp3");//set mode to repeat playing a song player.playOne("Hi.mp3"); //play a song with its name player.play(); //do some leisurely job player.deleteSong("Hi.mp3");//set mode to repeat playing a song } то один раз проиграет первое, а потом кучу раз второе. Как решить эту проблему?
`player.setPlayMode(PM_REPEAT_ONE);` заставляет играть заново, когда трек закончился. Это ожидаемое поведение. Попробуйте вместо этого: player.setPlayMode(MODE_NORMAL);
Проверьте такой вариант Код (Text): #include <SD.h> #include <SPI.h> #include <arduino.h> #include <MusicPlayer.h> int k = 0; void setup(void) { Serial.begin(9600); player.begin(); //will initialize the hardware and set default mode to be normal. player.setPlayMode(PM_NORMAL_PLAY); //set mode to repeat playing a song player.playOne("Hello.mp3"); //play a song with its name } void loop(void) { player.playOne("Hello.mp3"); player.play(); //do some leisurely job delay(10000); player.opStop(); player.deleteSong("Hello.mp3");//set mode to repeat playing a song player.playOne("Hi.mp3"); //play a song with its name player.play(); //do some leisurely job player.deleteSong("Hi.mp3");//set mode to repeat playing a song delay(10000); player.opStop(); }
Нет, данная версия скетча не работает. Производится воспроизведение первого саундрека, после чего воспроизведение полностью прекращается (по порту пишется, что проигрывается первый трэк, а затем поочерёдно начинают удаляться эти трэки без воспроизведения)
Вот как-то так. Код (Text): #include <SD.h> #include <SPI.h> #include <arduino.h> #include <MusicPlayer.h> void setup(void) { Serial.begin(9600); player.begin(); //will initialize the hardware and set default mode to be normal. player.setPlayMode(PM_NORMAL_PLAY); //set mode to repeat playing a song } void loop(void) { playSong("Hello.mp3"); delay(1000); stopSong("Hello.mp3");//set mode to repeat playing a song playSong("Hi.mp3"); delay(1000); stopSong("Hi.mp3");//set mode to repeat playing a song } void playSong(char *song) { //player.begin(); //will initialize the hardware and set default mode to be normal. playingState = PS_PRE_PLAY; player.playOne(song); player.play(); } void stopSong(char *song) { player.opStop(); player.deleteSong(song); player.play(); } Этот скетч точно работает.