LinkIt ONE可播放MP3/AAC/AMR格式的音訊檔,這篇要把MP3檔放在Micro SD卡裡,撰寫簡易的播放功能,透過序列埠控制。
首先準備幾支MP3歌曲檔,放進Micro SD卡裡,可直接使用一般的讀卡機,或是把LinkIt ONE板子上的三個指撥開關切換到正確位置,便可作為類似於隨身碟/記憶卡的裝置使用,請把1切到SD,2切到MS,連接電腦後,可看到兩台可卸除式磁碟機,其中一台代表板子內部Flash,另一台就是Micro SD記憶卡。各指撥開關的意義請參閱「LinkIt ONE:安裝軟體開發環境」
#include <LSD.h>
#include <LAudio.h>
#define BAUDRATE 19200
LFile dir; // 此物件代表子目錄mp3
// 此函式可取得下一首歌曲的路徑,如果副檔名是.mp3的話
String get_next(){
LFile f = dir.openNextFile(FILE_READ);
String song = String("\\mp3\\") + f.name();
while(!song.endsWith(String(".mp3"))){
f.close();
f = dir.openNextFile(FILE_READ);
song = String("\\mp3\\") + f.name();
}
f.close();
return song;
}
void setup(){
Serial.begin(BAUDRATE);
LAudio.begin(); // 初始化
LAudio.setVolume(vol); // 設定音量
LSD.begin();
dir = LSD.open("mp3", FILE_READ);
String song = get_next();
// 取得第一首歌,並播放
LAudio.playFile(storageSD, (char *)song.c_str());
Serial.println(song.c_str());
}
// 增減音量,界限是0~6
void vol_inc(unsigned char n){
vol += n;
if(vol > 6){
vol = 6;
}
if(vol < 0){
vol = 0;
}
LAudio.setVolume(vol);
}
void loop(){
String song;
while(Serial.available()){
char c = Serial.read(); // 從序列埠接收控制字元,
switch(c){
case 'p': // p代表播放下一首
song = get_next();
LAudio.playFile(storageSD, (char *)song.c_str());
Serial.println(song.c_str());
break;
case 's': // s代表停止
LAudio.stop();
break;
case 'r': // r代表重置
LAudio.stop();
dir.rewindDirectory();
break;
case '+': // +代表增大音量
vol_inc(1);
break;
case '-': // -代表減小音量
vol_inc(-1);
break;
}
}
}
然後便可從板子的耳機插槽聆聽音樂,開啟序列埠監控視窗,傳出p、s、r、+、-來控制。
Thank you very much!
ReplyDelete發現一個小小的問題,一直按-降低音量,但降到0以後又會變大聲:
ReplyDelete好像是因為n定義為unsigned,所以if(vol < 0)永不成立。
啊,被你發現了。:D
Delete謝謝。