# Lesson 2:GPIO、電阻、UART
[TOC]
## GPIO
* **GPIO**( General-Purpose Input/Output) 可以用來連接周邊的電子零件或設備,並由使用者由程式控制作為 input, output, analog 等等

* **函式介紹**
* `pinMode(pin, mode)` : 設定 'pin' 腳的運作模式
`pinMode(pin, INPUT/OUTPUT); //設定 'pin' 腳為輸入或輸出`
* `digitalRead(pin)` : 讀取 'pin' 腳輸入數值
`value = digitalRead(pin); //設定 'value' 為 'pin' 腳輸入的數位訊號`
* `digitalWrite(pin, value)` : 設定 'pin' 腳輸出電壓
`digitalWrite(pin, HIGH/LOW); //設定 'pin'腳輸出高/低電壓`
* **內建常數**
* `INPUT/OUTPUT` : 用於`pinMode()`定義pin腳為輸入/輸出
* `HIGH/LOW` : pin腳輸出高(5V)/低(0V)電壓
* `LED_BUILTIN` : 內建 LED 燈(P7)
### Digital output
**實作**:撰寫 blink 程式去控制內建 LED 開關
> pinMode(), digitalWrite(), delay()
```c++
void setup()
{
pinMode(LED_BUILTIN, OUTPUT); //設定 'P7' 為輸出
}
void loop()
{
digitalWrite(LED_BUILTIN, HIGH); //打開LED燈
delay(1000); //暫停1秒
digitalWrite(LED_BUILTIN, LOW); //關閉LED燈
delay(1000);
}
```
**實作**:撰寫 blink 程式去控制其他腳位的外接 LED(需 LED、220Ω 電阻)
> pinMode(), digitalWrite(), delay()
```c++
int ledPin = 13;
void setup()
{
pinMode(ledPin, OUTPUT); //設定 'ledPin' 為輸出
}
void loop()
{
digitalWrite(ledPin, HIGH); //打開LED燈
delay(1000); //暫停1秒
digitalWrite(ledPin, LOW); //關閉LED燈
delay(1000);
}
```
* **Delay**
* `delay(ms)` : 暫停 'ms' 毫秒
* `delayMicroseconds(us)` : 暫停 'us' 微秒
* **發光二極體** ( Light-Emitting Diode, LED)
* LED具有極性,長腳為陽極(Anode)、短腳為陰極(Cathod)。
* 陽極需接電源端($+$)、陰極需接接地端($-$)。

* **如何判讀電阻的歐姆數**
* 四色電阻 : $(第一色*10+第二色)*第三色(倍數)$
* EX :
電阻色碼為:[紅、紅、棕、金],則電阻值為: $(2*10+2)*10^1 = 220Ω$ 誤差$5$%
* 五色電阻 : $(第一色*100+第二色 *10+第三色)*第四色(倍數)$

* **麵包板** ( BreadBoard)
* 上下兩排橫向導通 ; 中間直向導通

* **接線圖**

### Digital input
* **實作**:用按鈕去控制 LED 的明暗(需按鈕、LED燈、10KΩ 電阻、220Ω 電阻)
> pinMode(), digitalRead()
```c++
int ledPin = 13;
int buttonPin = 2;
void setup()
{
pinMode(ledPin, OUTPUT); //設定 'ledPin' 為輸出
pinMode(buttonPin, INPUT); //設定 'buttonPin' 為輸入
}
void loop()
{
if (digitalRead(buttonPin) == HIGH) //讀取 'buttonPin'是否輸入HIGH(5V)
{
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000);
}
}
```
* **Switch**
* 開關可使電路形成開路(Open),電路不導通 ; 也可使電路形成閉路(Close),電路導通
* 兩支兩支互通,按下後四支互通

* **電阻在按鈕電路中的作用**(pull-down/pull-up resistor)
* 希望腳位讀取的值能維持在穩定的電壓值(1 or 0),pull-down/pull-up resistor就是用來維持基準電壓的
* 上拉電阻(pull-up) : 將不穩定的信號拉至高電位,電阻連接在 + 或 VCC端
* 下拉電阻(pull-down) : 將不穩定的信號拉至低電位,電阻連接在 - 或 GND端
* 電阻值 : 官方建議在10K ohm

* **接線圖**

* 進階:用按鈕去切換多個 LED 的狀態(跑馬燈等)
## UART
* (Universal Asynchronous Receiver/Transmitter)非同步收發傳輸器
* 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++
char receive_num;
void setup() {
Serial.begin(9600); //設定baud rate
Serial.println("Send number");
}
void loop() {
if(Serial.available() > 0){ //有收到數值時,會回傳>0的值
receive_num=Serial.read(); //讀取接收到資料的第一個位元組
Serial.print("recive:");
Serial.println(receive_num);
}
}
```
點開序列埠監控視窗

