第三章 寫點程式
在這個章節,你將會學會:
- 變數的使用
- 使用變數搭配digitalWrite\/digitalRead讀取\/寫入Arduino接腳
CH3-1 程式語法之變數宣告
什麼是變數?
我們先從數學中的一些事情開始討論,你有學過函式嗎?舉個例子來說f(x)=3x+2,我們就稱f(x)為一個函式,其中x,我們就稱為變數,有時候我們會指定變數的範圍,例如,x為正整數。在這情況下,當我們將x填入1,就可以得到f(1)=3*1+2=5;當我們將x填入2,就可以得到f(2)=3*2+2=8,以此類推。
在Arduino的程式碼中,我們也經常用到變數,請接著看下一節的介紹,我們是怎麼在Arduino程式碼中使用變數的。
變數的使用
讓我們先看看這段程式碼,是我們以前做過的LED實習,但是這個程式有個小小缺點,原本我們是利用pin13控制LED,今天如果我改了一下題目,想改成用pin12控制LED,那麼我們要修改的地方,就有第2, 6, 8行三個地方,這個程式現在只有十行,如果改天變成數百行的程式,天知道要改多久!
01 void setup() {
02 pinMode(13, OUTPUT);
03 }
04
05 void loop() {
06 digitalWrite(13, HIGH);
07 delay(1000);
08 digitalWrite(13, LOW);
09 delay(1000);
10 }
現在我們來正式介紹變數,來解決這個問題。首先介紹變數的語法。
int led = 13;
這是一個標準的變數宣告,我們現在宣告的,是一個叫做led的變數,這個變數的型態是int,也就是整數,此外,這個變數,我們將他初始化為13,說了這麼多一定很難懂,簡而言之, 在這程式碼中,只要看到led,你就可以把它代換成13。
現在,我們來看看,怎麼在剛剛的程式碼中,使用變數。
01 int led = 13;
02
03 void setup() {
04 pinMode(led, OUTPUT);
05 }
06
07 void loop() {
08 digitalWrite(led, HIGH);
09 delay(1000);
10 digitalWrite(led, LOW);
11 delay(1000);
12 }
可以看到在這個程式碼的第1行,我們宣告了一個整數變數,叫做led。
因為宣告了這個變數,原本在第4, 8, 10行的13,都被我們換成了led,這樣做有什麼好處呢?現在如果我請你將控制led的pin13,換成pin12,那該怎麼做呢?
最容易,也不容易出錯的作法,就只要修改第一行,將
01 int led = 13;
換成
01 int led = 12;
就這麼簡單!變數還有很多種型態,我們現在教的,是最常用的整數變數,主要都是用來代換數字使用,而我們最常使用的數字,當然就是Arduino的控制腳編號啦,現在來試試看吧!
隨堂練習
- 將LED實習中的隨堂練習,兩個LED對應的控制腳編號,都用變數宣告,並改寫原來程式碼,功能必須跟之前一樣。
CH3-2 雙按鍵控制LED明亮度
實習清單
實驗名稱 | 雙按鍵控制LED明亮度 |
---|---|
預期實驗結果 | 利用按鍵控制LED亮度 |
實驗目的 | Ø 瞭解PWM的使用方法 |
材料清單 | Ø ARDUINO*1 Ø LED*1 Ø 按鍵*2 Ø 220K電阻*2 |
元件介紹
實習步驟與說明
本次實驗會使用到PWM的功能,PWM是一種將數位訊號轉成類比訊號的技術,可以同時兼具數位訊號不易受干擾,以及類比訊號之線性輸出。
要控制LED亮度,第一個想法就是調整電壓,可是使用digtalWrite()的話,只能輸出高電位與低電位無法控制輸出的電壓,那就要用到arduino的analogWrite()的語法,analogWrite(),可以將5V的電壓分成256等分0~255,假設analogWrite(pin3,x),那就是pin3腳位輸出
5*(X\/255)V的電壓,如果要使用pwm的功能,務必使用有標示pwm的接腳方可使用。
電路實作
佈線圖
Arduino程式實作
\/* ledmatrixshow.cpp 01 int up=4; \/\/設定up按鍵使用pin4 02 int down=10; \/\/設定down按鍵使用pin10 03 int led=6; \/\/設定led輸出為pin6 04 int pwm=0; \/\/設定pwm初始值為0 05 void setup() 06 { 07 pinMode(4,INPUT); \/\/設定pin4為輸入 08 pinMode(10,INPUT); \/\/設定pin10為輸入 09 pinMode(6,OUTPUT); \/\/設定pin6為輸出 10 11 12 } 13 void loop() 14 { 15 if(digitalRead(up)==HIGH && pwm<255) \/\/設定如果up鍵輸入高電位同時pwm小於255執行下面動作 16 { 17 analogWrite(led,pwm=pwm+5); \/\/led的亮度每次增加5階 18 delay(100); 19 } 20 if(digitalRead(down)==HIGH && pwm>0)\/\/設定如果down鍵輸入高電位同時pwm大於於0執行下面動作 21 { 22 analogWrite(led,pwm=pwm-5); \/\/led亮度每次減少5階 23 delay(100); 24 } 25 } |
---|
CH3-2-2 程式語法之運算子
在這個章節,你將會學會:
Ø 運算子的使用
什麼是運算子?
1+1=2,這個簡單到不行的算式,用了幾個運算子,你知道嗎?
答案是兩個,就是「+」加號與「=」等號,這是所謂的算數運算子。在Arduino的世界,除了算術用的運算子,還有各式各樣,為了不同用途的運算子,像是比較、或是與邏輯運算相關的運算子,請繼續看我們下一章的介紹。
運算子的使用
01 void setup() { 02 pinMode(13, OUTPUT); \/\/宣告輸出接腳 03 pinMode(2, INPUT); \/\/宣告輸入接腳 04 } 05 06 void loop(){ 07 08 if (digitalRead(2) == HIGH) { \/\/按鈕按下時為高電位 09 digitalWrite(13, HIGH); \/\/輸出高電位給LED 10 } 11 else { 12 digitalWrite(13, LOW); \/\/輸出低電位給LED 13 } 14 } |
---|
範例1. 按鈕實習的程式碼
這個我們曾經做過的實習當作範例,你知道在哪裡用到了運算子嗎?請看第八行
08 if (digitalRead(2) == HIGH) { \/\/按鈕按下時為高電位
在if的條件式中,一定會用到比較運算子,在這個例子中「==」就是比較運算子,也就是所謂的等於。
但只認識比較運算子是不夠的,有時候if-else的條件,會有比較複雜的情況,例如,當pin2, pin3皆為輸入接腳,當這兩個pin同時為HIGH,這樣的條件式該怎麼用程式碼表達呢?
01 if (digitalRead(2) == HIGH && digitalRead(3) == HIGH)
這時候,就會用到布林邏輯運算子了,在上例中,「&&」就是布林邏輯運算子,它代表的意思是,當兩個條件同時成立的狀況。
除此之外,還有「||」這個運算子,也就是or的意思,當兩個條件用這個符號連結時,只要其中一個條件符合,就會執行底下的動作,如下例。
01 if (digitalRead(2) == HIGH || digitalRead(3) == HIGH)
運算子在Arduino的控制流程中,扮演很重要的角色,請利用隨堂練習多多熟悉吧。
隨堂練習
- 試著用兩顆按鈕,控制三顆LED(由左到右排列),且須符合以下條件:
a. 當沒有任何按鈕被按下時,所有LED都不亮。
b. 當按鈕A按下時,LED1會亮,其餘兩顆不亮。
c. 當按鈕B按下時,LED2會亮,其餘兩顆不亮。
d. 當按鈕A, B同時按下時,LED3會亮,其餘兩顆不亮。
CH3-3 可變電阻控制多顆LED
實習清單
實驗名稱 | 可變電阻控制多顆LED |
---|---|
預期實驗結果 | 旋轉可變電阻可以控制LED要亮第幾顆 |
實驗目的 | Ø 瞭解可變電阻的使用 Ø 瞭解類比輸入接口使用及讀值 |
材料清單 | Ø ARDUINO*1 Ø LED*3 Ø 可變電阻*1 |
元件介紹
可變電阻是一種可調式電阻,其電阻值可以利用轉動旋鈕去改變電阻值,電路圖如下!
實習步驟與說明
此次會使用到類比輸入(ANALOG IN)的接腳,與數位接腳(DIGITAL)不同的是,數位接腳當作輸入時只等讀取高低電位即是0伏特或是5伏特,而類比接腳可以將0V~~5V的電壓細分成1024階的數值來讀取,也就是說我們可以利用電壓的變化來控制LED。
類比輸入接腳共有A0~A5六個接腳,如果要讀取類比輸入的數值,則需使用analogRead(PIN)的語法,假設analogRead(A0)讀取到的數值為512,則代表輸入的電壓為(512\/1024)*5V=2.5V。
本次的設計概念是利用可變電阻改變輸入電壓繼而讀到不同的數值去控制LED,將讀到的數值分為數個區段,並設定在哪一個區段要亮哪一個LED。
電路實作
佈線圖
Arduino程式實作(一)
001 int led1=8; \/\/設定pin 8為led1輸出
002 int led2=9; \/\/設定pin 9為led2輸出
003 int led3=10; \/\/設定pin 10為led3輸出
004 void setup()
005 {
006
007 for(int a=8;a<=10;a++) \/\/使用迴圈將PIN8~PIN10 設定為輸出狀態
008 {
009 pinMode(a,OUTPUT);
010 }
011 pinMode(A0,INPUT); \/\/將A0設定為輸入狀態
012
013 }
014
015 void loop()
016 {
017 int pwm=analogRead(A0); \/\/設定pwm的值是讀取A0腳位的數值
018
019 if(pwm>0 && pwm<=340) \/\/如果0>pwm>=340 則led1亮led2、led3滅
020 {
021 digitalWrite(led1,HIGH);
022 digitalWrite(led2,LOW);
023 digitalWrite(led3,LOW);
024
025 }
026
027 else if(pwm>340 && pwm<=680)\/\/如果340>pwm>=680 則led1滅led2亮led滅
028 {
029 digitalWrite(led1,LOW);
030 digitalWrite(led2,HIGH);
031 digitalWrite(led3,LOW);
032 }
033
034 else if(pwm>680 && pwm<=1024)\/\/如果680>pwm>=104 則led1、led2滅led3滅亮
035 {
036 digitalWrite(led1,LOW);
037 digitalWrite(led2,LOW);
038 digitalWrite(led3,HIGH);
039 }
040
041 else \/\/如果pwm的區間不在上述所有區間內,則全部滅
042 {
043 digitalWrite(led1,LOW);
044 digitalWrite(led2,LOW);
045 digitalWrite(led3,LOW);
046 }
047
048
049
050 }
隨堂作業
1、 將可變電阻上的正負極對調觀察效果。
2、 將LED增加為五顆去控制。
CH3-1-3 程式語法之迴圈
在這個章節,你將會學會:
Ø 迴圈的使用
1-1. 什麼是迴圈?
在Arduino的程式碼中,我們經常會宣告許多pin腳,可能是有連續性的,例如pin2~pin5,這樣說起來,就有四根pin腳要宣告,也就是至少要寫四行程式碼。
有沒有更簡單的方法呢,當然有,那就是利用迴圈啦。
所謂的迴圈,就是指有限次數重複做一件事,當然也可無限次數做同一件事,事實上,你早就在Arduino中使用過迴圈了!究竟是怎麼使用的,我們在下一節介紹。
1-2. 迴圈的使用
01 void setup() {
02 Serial.begin(9600);
03 }
04
05 void loop(){
06 for(int i=0; i < 4; i++)
07 {
08 Serial.println(i);
09 delay(1000);
10 }
11 }
圖一、範例程式碼
我們從這個範例開始介紹迴圈的使用,這段程式碼,可以讓Arduino,每休息一秒,然後印出0,1, ,2, 3四個數字,其中我們可以看到第六行到第九行,就是迴圈的使用啦。
第六行,迴圈以for開頭,括弧內的內容,就是迴圈的執行次數,看起來有點複雜,我們等等再解釋。
第八行,是迴圈要重複執行的內容,在這裡,我們要重複做的事是印出訊息。
回到第六行,將括弧的內容分為三部分來看:
int i = 0,宣告一個變數i,將它初始化為零。這是迴圈的起始計數。
i < 4,當i < 4時,就會持續執行迴圈內容。
i++,可以看成 i +1,當迴圈執行完一次,i就會加一。
所以這個迴圈,總共會執行4次。分別是i = 0, 1, 2 , 3這四次。
以上就是迴圈的基本用法,利用隨堂練習熟悉一下迴圈的使用吧。
隨堂練習
讓Arduino可以每一秒,分別印出1~10的數字訊息。
讓Arduino可以每一秒,分別印出2, 4, 6, 8, 10。