# Lesson 3:UART、超音波模組
###### tags: `基於物聯網之實境應用設計`
## UART
* (Universal Asynchronous Receiver/Transmitter)非同步收發傳輸器
* 同步、非同步

* 單工、半雙工、全雙工

* 實現多種非同步傳輸介面,ex:RS-232,RS-422
* USB-to-UART


* Baud rate是單位時間內傳輸資訊的個數,單位bits/sec。非同步傳輸裡,傳送端與接收端必需選擇相同的傳輸速率(1200, 2400, 4800, 9600等等)
## Serial library
* 7697要跟電腦通訊的時候,使用 Serial 指令
* Serial port 使用 TX (pin 1) 跟 RX (pin 0) 這兩個腳位來傳送與接收資料。
* 實作:接收PC的輸入
```C++
void setup() {
Serial.begin(9600);//設定baud rate
Serial.print("Send number");
}
void loop() {
char receive_num;
if(Serial.available()>0){//有收到數值時,會回傳>0的值
receive_num=Serial.read();//讀取接收到資料的第一個位元組
Serial.print("recive:");
Serial.println(receive_num);
}
}
```
點開序列埠監控視窗


## 超音波模組

* HC-SR04 腳位從左至右分別為 Vcc、Trig、Echo 與 GND,超音波的發射與接收依靠 Trig 與 Echo 這兩個腳位。送出 10 微秒的 5V 高電位訊號給 Trig,觸發超音波的發射,接著 Echo 腳位就會處於 5V 高電位狀態,當接收到反射的超音波訊號時,Echo腳位就會處於0V低電位狀態,所以藉由計算Echo電位從high到LOW的時間,可知超音波來回時間而計算與物體距離。

* 函式
`pulseIn(pin, value, timeout)` :讀取pin腳的脈衝時間

* 實作:超音波模組
```C++
const int Trig_Pins = 3;//trig 腳位
const int Echo_Pins = 2;// echo 腳位
float get_distance(int trig, int echo){//計算距離
float duration;
pinMode(trig, OUTPUT);
pinMode(echo, INPUT);
digitalWrite(trig, HIGH);
delayMicroseconds(10);//給予trig 10us TTL pulse,讓模組發射聲波
digitalWrite(trig, LOW);
duration = pulseIn(echo, HIGH, 5000000);//紀錄echo電位從high到low的時間,就是超音波來回的時間,若5秒內沒收到超音波則回傳0
return duration / 29 / 2;// 聲速340m/s ,換算後約每29微秒走一公分,超音波來回所以再除2
}
void setup() {
Serial.begin(9600);
}
void loop() {
float result= get_distance( Trig_Pins, Echo_Pins);
Serial.print(result);
Serial.println("cm");
delay(1000);
}
```

* 課堂作業:利用超音波模組控制呼吸燈,距離3cm~15cm之間,距離越近呼吸燈越亮