---
###### tag:`Arduino` `bluetooth` `buzzer`
---
# Arduino 電路實驗 藍芽電子琴-Remote player
[TOC]
* 系級:資工三乙
* 學號:1110832064
* 座號:16
* 姓名:王君翔
---
## 1.實驗目的 Purpose
透過操作電路,並實作程式碼,完成藍芽電子琴之設計。
---
## 2.實驗原理 Principle
先將藍芽模組之角色設定為master,之後將電路接好,並安裝APP。
在APP端與藍芽模組配對成功後,進入彈琴頁面,當按下APP上的按鈕後,傳遞訊息給藍芽模組,Arduino端便會讀取訊息,並使蜂鳴器發出相對應的頻率音高。
另外,也具有升降key的功能。
---
## 3.實驗材料 Materials
| 名稱<br>Name | 數量<br>Quantity | 備註<br>Memo |
| -------- | -------- | -------- |
| Arduino Uno R3 | 1 | 附USB線|
| 麵包板 | 1 | |
| 杜邦線 | 7 | 公對公 |
| HC-05 | 1 | 主從一體 |
| 蜂鳴器 | 1 | 無源蜂鳴器 |
| Vivo V2027 | 1 | Android 12 ,附USB傳輸線|
---
## 4.實驗步驟 Steps
* APP使用android studio進行開發,限定環境為android12(含)以上
1. 進入AT mode,將HC-05進行設定,角色改為master
2. 依照電路圖連接電路

Δ電路圖 (Circuit Diagram)
3. 將以下程式完成後,透過USB線上傳至Uno板
* 主程式
``` C++=
#include <SoftwareSerial.h>
#include "music.h"
#define BUZ 7
SoftwareSerial BT(10, 11);
void r();
void setup() {
pinMode(BUZ, HIGH);
Serial.begin(9600);
Serial.println("BT is ready!");
BT.begin(9600);
}
void loop() {
if (BT.available()) {
delay(10);
r();
}
}
void r(){
char c = BT.read();
int n = 0;
if(c == 43){
BT.read();
keyUp();
return;
}
if(c == 45){
BT.read();
keyDown();
return;
}
if(!(c > 47 && c < 58)){
return;
}
n = c&15;
while((c = BT.read()) > 47 && c < 58){
n *= 10;
n += c & 15;
}
tone(BUZ, getF(n), 50);
}
```
* music.h
```c++=
const float f[] = {
16.35, // C0
17.32, // C#0/Db0
18.35, // D0
19.45, // D#0/Eb0
20.6, // E0
21.83, // F0
23.12, // F#0/Gb0
24.5, // G0
25.96, // G#0/Ab0
27.5, // A0
29.14, // A#0/Bb0
30.87, // B0
32.7, // C1
34.65, // C#1/Db1
36.71, // D1
38.89, // D#1/Eb1
41.2, // E1
43.65, // F1
46.25, // F#1/Gb1
49.0, // G1
51.91, // G#1/Ab1
55.0, // A1
58.27, // A#1/Bb1
61.74, // B1
65.41, // C2
69.3, // C#2/Db2
73.42, // D2
77.78, // D#2/Eb2
82.41, // E2
87.31, // F2
92.5, // F#2/Gb2
98.0, // G2
103.83, // G#2/Ab2
110.0, // A2
116.54, // A#2/Bb2
123.47, // B2
130.81, // C3
138.59, // C#3/Db3
146.83, // D3
155.56, // D#3/Eb3
164.81, // E3
174.61, // F3
185.0, // F#3/Gb3
196.0, // G3
207.65, // G#3/Ab3
220.0, // A3
233.08, // A#3/Bb3
246.94, // B3
261.63, // C4
277.18, // C#4/Db4
293.66, // D4
311.13, // D#4/Eb4
329.63, // E4
349.23, // F4
369.99, // F#4/Gb4
392.0, // G4
415.3, // G#4/Ab4
440.0, // A4
466.16, // A#4/Bb4
493.88, // B4
523.25, // C5
554.37, // C#5/Db5
587.33, // D5
622.25, // D#5/Eb5
659.25, // E5
698.46, // F5
739.99, // F#5/Gb5
783.99, // G5
830.61, // G#5/Ab5
880.0, // A5
932.33, // A#5/Bb5
987.77, // B5
1046.5, // C6
1108.73, // C#6/Db6
1174.66, // D6
1244.51, // D#6/Eb6
1318.51, // E6
1396.91, // F6
1479.98, // F#6/Gb6
1567.98, // G6
1661.22, // G#6/Ab6
1760.0, // A6
1864.66, // A#6/Bb6
1975.53, // B6
2093.0, // C7
2217.46, // C#7/Db7
2349.32, // D7
2489.02, // D#7/Eb7
2637.02, // E7
2793.83, // F7
2959.96, // F#7/Gb7
3135.96, // G7
3322.44, // G#7/Ab7
3520.0, // A7
3729.31, // A#7/Bb7
3951.07, // B7
};
const int mid = 24;
//const int scale[] = { 0, 2, 2, 1, 2, 2, 2, 1 }; // X full full half full full full half
const int perfix_scale[] = { 0, 2, 4, 5, 7, 9, 11};
int fix = 0;
double getF(int ind){
ind += fix;
int k = ind / 7 * 12;
return f[((mid+k) + perfix_scale[((ind+14) % 7)])];
}
void keyUp(){
fix++;
}
void keyDown(){
fix--;
}
```
4. 將App完成並安裝至手機
App程式碼 [github連結](https://github.com/jiu-lin107141137/remote-player)
5. 執行並測試結果
---
## 5.實驗結果 Result

Δ接線完成圖

ΔAPP首頁

Δ彈琴介面
當按下APP上的按鈕後,蜂鳴器可發出正確的音高,且升降key的功能有運作無誤,符合預期結果。
---
## 6.實驗心得 Reflection
這次透過藍芽完成App與Arduino的溝通,對我而言是一個非常嶄新的體驗,因為不管是Android端或是Arduino端,我都沒有自行開發藍芽功能的相關經驗。開始撰寫程式碼之後,才知道原來要注意的地方十分得多,像是一開始要進入AT mode設定藍芽模組的名稱、密碼以及角色,就花了一些時間來查閱資料並實作,更不用說之後App開發時遇到的各種Exception,以及Arduino在接收藍芽模組訊息的一些細節,整個專案實作下來,可謂獲益良多。
在完成藍芽模組的實作之後,接下來我想進行Wi-Fi模組的實作,透過Firebase完成遠端操控,觀察與藍芽模組的相異之處。
---
## 7.外部連結 Link
[My GitHub (程式碼)](https://github.com/jiu-lin107141137/remote-player)