# Arduino 教學 3:利用可變電阻控制LED
> 作者:王一哲
> 日期:2016/9/6
## 分壓電路
分壓電路是我們在Arduino裡最常用的技巧之一,我們可以利用可變電阻或是光敏電阻與固定電阻串聯,讀取中間接腳的電壓值,並利用這個值來控制其它元件。最簡單的接法如下
<img height="30%" width="30%" src="https://i.imgur.com/SMyuc6o.png" style="display: block; margin-left: auto; margin-right: auto;"/>
<div style="text-align:center">分壓電路示意圖</div>
</br>
圖中電池和$R_1$、$R_2$電阻串聯,利用歐姆定律可得到電流值
$$I = \frac{\varepsilon}{R_1 + R_2}$$
因此$R_1$、$R_2$電阻的端電壓分別為
$$V_1 = IR_1 = \frac{R_1}{R_1 + R_2} \varepsilon$$
$$V_2 = IR_2 = \frac{R_2}{R_1 + R_2} \varepsilon$$
如果我們使用最簡單的可變電阻,將左邊的接腳接到+5V上,右邊的接腳接0V,轉動旋鈕時會改變中間接腳到右邊接腳之間的電阻值,因此電壓值會跟著變化,我們就可以藉此控制其它元件。
<img height="30%" width="30%" src="https://upload.wikimedia.org/wikipedia/commons/b/b5/Potentiometer.jpg" style="display: block; margin-left: auto; margin-right: auto;"/>
<div style="text-align:center">單圈碳膜式可變電阻</div>
<div style="text-align:center">(圖片來源:維基百科 <a href="https://zh.wikipedia.org/wiki/File:Potentiometer.jpg" target="_blank">https://zh.wikipedia.org/wiki/File:Potentiometer.jpg</a>)</div>
</br>
## 分壓電路的簡單練習
我們可以用Arduino上的+5V接腳供電,將兩個固定電阻串聯,使用三用電表測量電阻的端電壓。為了避免通過電阻器的電流過大,建議使用10kΩ或100kΩ的電阻器。請同學計算一下測量到的電壓值應該是多少?再用三用電表測量看看。
<img height="100%" width="100%" src="https://i.imgur.com/HzINmuo.png" style="display: block; margin-left: auto; margin-right: auto;"/>
<div style="text-align:center">簡單的分壓電路</div>
</br>
## 利用可變電阻控制LED的亮度
我們將可變電阻中間的接腳接到類比輸入(analog in)接腳A0,讀取數值介於 0 ~ 1023 之間,換算數位接腳5輸出到LED電壓值。接腳的編號前若有 ~ 符號,代表這個可接腳可以作為PWM輸入或輸出,數值介於 0 ~ 255 之間。程式碼如下:
```c=
/* 實驗2-1: 利用分壓電路調整LED亮度 *
* 日期: Sep. 5, 2016 *
* 作者: 王一哲 */
int ledPin = 5; //定義LED接腳
int potPin = 0; //定義可變電阻讀取接腳
int val = 0 ; //定義可變電阻讀取數儲暫存用的變數
int voltage = 0; //輸入LED的電壓值
void setup() {
pinMode(ledPin, OUTPUT); //定義LED接腳為輸出
pinMode(potPin, INPUT); //定義可變電阻讀取接腳為輸入
Serial.begin(9600);
}
void loop() { //讀取可變電阻電壓值
val = analogRead(potPin); //val = 0 ~ 1023
voltage = map(val, 0, 1023, 0, 255); //將val由0~1023線性變換為0~255並存入voltage
analogWrite(ledPin, voltage); //點亮LED
//印出數值檢查執行成果
Serial.print("val = ");
Serial.print(val);
Serial.print("; voltage = ");
Serial.println(voltage);
}
```
以下是程式中用到的函式
1. **analogRead(pin)**
讀取指定編號接腳的類比輸入值
2. **analogWrite(pin, value)**
將數值value寫入指定編號接腳作為類比輸出
3. **map(value, fromLow, fromHigh, toLow, toHigh)**
fromLow 對應到 toLow,fromHigh 對應到 toHigh,找出兩組數據對應的關係後將輸入值value換算成對應的值。
<img height="100%" width="100%" src="https://i.imgur.com/XooJN2f.png" style="display: block; margin-left: auto; margin-right: auto;"/>
<div style="text-align:center">電路圖</div>
</br>
<img height="100%" width="100%" src="https://i.imgur.com/teb2SkW.jpg" style="display: block; margin-left: auto; margin-right: auto;"/>
<div style="text-align:center">實際的裝置照片</div>
</br>
## 利用可變電阻控制LED的閃爍頻率
接法與上個實驗相同,請同學想想看如何利用讀取到的數值以及函數 delay 控制LED的閃爍頻率。我們會用到的函式為
1. **digitalRead(pin)**
讀取指定編號接腳的數位輸入值,數值只有HIGH或LOW
2. **digitalWrite(pin, value)**
將數值value寫入指定編號接腳作為數位輸出,數值HIGH或LOW
3. **delay(value)**
延遲時間,量值為 value ,單位為毫秒(ms)。
> 提示:讓LED點亮一小段時間,再讓LED熄滅一小段時間,不斷地重複這個過程。如果最後還是想不通,請參考以下的程式碼:
```c=
/* 實驗2-2: 利用分壓電路調整LED閃爍的時間間隔 *
* 日期: Sep. 5, 2016 *
* 作者: 王一哲 */
int ledPin = 5; //定義LED接腳
int potPin = 0; //定義可變電阻讀取接腳
int val = 0 ; //定義可變電阻讀取數儲暫存用的變數
int dt = 0; //輸入LED閃爍的時間間隔
void setup() {
pinMode(ledPin, OUTPUT); //定義LED接腳為輸出
pinMode(potPin, INPUT); //定義可變電阻讀取接腳為輸入
Serial.begin(9600);
}
void loop() { //讀取可變電阻電壓值
val = analogRead(potPin); //val = 0 ~ 1023
dt = map(val, 0, 1023, 0, 500); //將val由0~1023線性變換為0~255並存入dt
digitalWrite(ledPin, HIGH);
delay(dt);
digitalWrite(ledPin, LOW);
delay(dt);
//印出數值檢查執行成果
Serial.print("val = ");
Serial.print(val);
Serial.print("; dt = ");
Serial.println(dt);
}
```
</br>
---
###### tags:`Arduino`