驚喜音樂盒是一個能夠客製化,讓每次打開都是依照自己喜愛的曲目進行播放的音樂盒,且能在下一次開啟時,切換成自己設定的不同首的曲目,比如可以在睡覺時自己寫出幾首容易入眠的安眠曲,或是在讀書的時候打開音樂盒,播放出激勵人心的曲子,創造一個給予自己及他人驚喜的驚喜音樂盒。
坊間的音樂盒雖然有各種不同的變化,但是卻無法快速地客制自己喜歡的歌曲,一直是一件非常困擾的事情,因此本作品希望透過CPF簡單的程式發想及撰寫特性,能夠依照不同的需求去設計所播放的音樂,並搭配上感測器的應用,讓音樂盒如同一個驚喜箱,隨著盒子的開合能夠控制音樂的播放及停止,不僅讓音樂盒自由度更佳的大並且增加了玩樂的互動性。
宏碁雲教授 - 1個
Leonardo 開發板 - 1個
Grove 擴充板 - 1個
光敏感測器 - 1個
無源蜂鳴器 - 1個
連接雲教授,開啟CPF Arduino,進入Lesson 8 插槽模式。
先將雲教授與相對應感應器連接至Grove擴充板,光敏感測器連接至A0插槽,紅外線發射器連接上D2插槽,按鈕連接上D6插槽,180度伺服馬達則是連接至D4插槽,如圖:
圖
點擊執行按鈕,可對目前感應器進行各別操作與顯示,插槽A0顯示光敏感測器的值,D2欄位可以開關紅外線發射器,D6顯示按鈕為按下或放開(0 => 放開,1 => 按下),D4欄位則是可以控制180度伺服馬達的角度。
在開始撰寫程式碼之前,先來看一下本程式自訂的函式(function)介紹:
sensorSet()
取得光敏感測器的數值。
現在,要開始撰寫驚喜音樂盒的程式碼,點擊修改按鈕進入程式碼編輯介面,將預設的程式碼全部刪除。
首先撰寫sensorSet()
函式取得光敏感測器的光感值。
var lightSensor;
function sensorSet(){
lightSensor = cpf.get("socket a3");
ui.set("socket a3", lightSensor);
return lightSensor;
}
程式解析:
sensorSet()
。sensorSet()
函數中,使用lightSensor變數來接收A3插槽光敏感測器的光感值。sensorSet()
函數中,執行ui.set()將光敏感測器的光感值顯示在A3區塊上。sensorSet()
函數中,回傳lightSensor變數。接著要將musics陣列中每個音符利用forEach迴圈一一輸出,並控制蜂鳴器演奏出一首完整的曲子。
var lightSensor;
var musics=[523,587,659,523,523,587,659,523,659,698,784,659,698,784];
musics.forEach(function(music){
if(sensorSet(sensorSet()) < 500){
ui.set("content","請開啟!!");
}else{
ui.set("content","音樂播放中");
cpf.set("socket d5", music, 300);
}
});
function sensorSet(){
lightSensor = cpf.get("socket a3");
ui.set("socket a3", lightSensor);
return lightSensor;
}
程式解析:
以上已完成了程式碼的撰寫,最後在最後一行加上 cpf.repeat();
開啟迴圈進行重複執行的動作。
//驚喜音樂盒//
var lightSensor;
var musics=[523,587,659,523,523,587,659,523,659,698,784,659,698,784];
musics.forEach(function(music){
if(sensorSet(sensorSet())>500){
ui.set("content","請開啟!!");
}else{
ui.set("content","音樂播放中");
cpf.set("socket d5", music, 300);
}
});
function sensorSet(){
lightSensor = cpf.get("socket a3");
ui.set("socket a3", lightSensor);
return lightSensor;
}
cpf.repeat();
在這個程式中,我們可以讓音樂盒演奏出自己喜歡的樂曲,並透過感測器來實作出依據音樂盒蓋的開啟和蓋上來控制音樂的播放,那除了這個控制外,我們也可以撰寫暫存變數來記憶上次觀上音樂盒前撥放到哪一個地方,在下次開啟盒蓋時接著繼續撥放,更或者是加入可變電阻旋鈕,在音樂播放時隨意的改變音量或是音調,讓音樂盒更加有趣好玩喔!