# 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`