Arduino的程式架構可以分為兩大函式: setup()及loop(),其中的setup()是程式開頭時,設定相關參數的用途,而loop()是程式中的重心,要執行的功能皆在這個區段書寫,並沒有main()的概念,不過一樣可以使用自訂函數。
程式範例:
/*
Arduino程式的基本架構說明
*/
#include<***.h>
//引用所需要的標頭檔
//程式的基本架構可以分為setup()和loop(),兩個基本函式
void setup()
{
//在setup()函式之中,負責起始化相關參數及功能
}
void loop()
{
//loop()函式的功能是重復執行指定的功能
//直到程式結束為止
}
程式基本應用:在程式的開發的過程式,為方便讀取部分變數變化的情況,可以使用Serial函數,將變化情況輸至監控視窗。
程式範例:
/*
學習程式的第一個範例,和大家問好吧!
*/
void setup()
{
Serial.begin(9600); //RS-232電腦輸出鮑率設定
}
void loop()
{
Serial.println(“Hello,大家好”); //由監視視窗觀看sensorVaule數值變化
delay(1000); //設定延遲時間,1000 = 1秒
}
Arduino的處理流程可以依電子電路的控制系統來看,分為輸入、處理及輸出作分類:
接下來按這三種分類方式進行介紹,依序為輸入階段、輸出階段,最後是處理階段。因為Arduino的輸出和輸入階段(I/O埠)所處理的訊號類型分為數位或類比,茲整理其使用的語法如下表:
輸入埠所接的訊號來自感測器,感測器的訊號由其工作原理的不同,分為數位及類比的二種,常見的感測器分類如下圖,:
因Arduino的輸入訊號,分為類比訊號和數位訊號二類,所以接下來的範例程式也是以這樣的方式來作說明,其中類比訊號以按鈕開關來作說明,數位訊號利用可變電阻來說明。
數位輸入
輸入(數位/開關式):
當感測器的訊號狀態只有二種,非1(HI)即0(LO)的話,即視作數位式輸入。
程式範例:
/*
當按鍵按下時,LED燈發亮
*/
int led=5;
int button=3;
void setup()
{
pinMode(led,OUTPUT); // 設定led為輸出模式
pinMode(button,INPUT); // 設定button為輸入模式
}
void loop()
{
if(digitalRead(button)==HIGH) //當按鍵按下去時
digitalWrite(led,HIGH); //led亮
else
digitalWrite(led,LOW);
}
語法說明:
pinMode(pin, mode)
將數位腳位(digital pin)指定為輸入或輸出(INPUT/OUTPUT)。
int digitalRead(pin)
將輸入腳位的值讀出,當腳位處於高電位時傳回HIGH,反之傳回LOW。
digitalWrite(pin, value)
設定數位腳位指定為開或關。腳位必須先利用pinMode設定為輸入或輸出模式。
類比輸入
A/D轉換
當輸入訊號狀態是連續的,和數位訊號是非連續的情況不一樣,即可視作類比訊號。在單晶片控制電路中,需要將非連續性的訊號轉換成可辨識的數位資訊,這樣的過程即稱為「A/D轉換」,類比/數位轉換是將類比訊號經過固定時間間隔的方式取樣,針對其波幅的大小編碼,而得到一組數位資訊,所以所輸出的數位訊號和輸入的類比訊號能量成正比,而這樣的電路稱之為A/D轉換。
Arduino為10Bit精度的類比轉換,代表的意思是,若以參考電壓(5伏特)為例,它所能量測的最小電壓變化為5/1024≒0.005(伏特),這樣的精度當然在工業上使用稍嫌不足,但是在教學課程中,已相當足夠了。
待測訊號=量測值/1024×參考電壓(5伏特)
以下,以可變電阻的量測,來說明類比輸入函數的使用,要注意的是程式中所得電阻值非真實的電阻值,只是相對於參考電壓的數值而己。
程式範例:
/*
連續讀入五次的電阻讀值後,求出平均值並輸出至監視視窗
*/
#define analogInPin 3;
int sensorValue = 0;
void setup()
{
Serial.begin(9600);
}
void loop()
{
sensorValue = analogRead(analogInPin);
sensorValue += analogRead(analogInPin);
sensorValue += analogRead(analogInPin);
sensorValue += analogRead(analogInPin);
sensorValue += analogRead(analogInPin);
Serial.print("Value = " );
Serial.println(sensorValue/5);
delay(100);
}
語法說明:
int analogRead(pin)
讀取類比腳位的電壓,並傳回一個數值(0到1023),表示相對應的0到5的電壓值。
輸出函式可以分為數位及類比兩類,其中的數位輸出的範例可以參考數位輸入的例子,其狀態只有二種,即非1(HI)即0(LO)。
類比輸出
至於類比訊號的輸出,在Arduino中的作法,是以PWM(Pulse Width Modulation/脈波寛度調變)來進行模擬。
圖 PWM電路動作說明
PWM電路主要功能是將輸入電壓的振幅轉換成寬度相關的脈衝,換句話說它是將振幅變化轉換成脈衝寬度。一般交換式輸出電路只能輸出電壓振幅一定的信號,為了輸出類似正弦波之類電壓振幅變化的信號,因此必需將電壓振幅等效轉換成脈衝寬度(頻率)。利用這樣的工作方式來控制輸出電壓的功率。
程式範例:
/*
說明Arduino程式的基本架構
*/
#define led 13
Int i=0;
void setup()
{
pinMode(led, OUTPUT);
}
void loop()
{
for(i=0;i<255;i++)
{
analogWrite(led,i); // pwn輸出(漸亮)
delay(10); // 等待0.01秒
}
}
語法說明:
analogWrite(pin, value)
value為改變PWM腳位的輸出電壓值,Value變數範圍為0-255。腳位(pin)通常會在3、5、6、9、10與11。例如:輸出電壓2.5伏特(V),該值大約是128。
程式流程控制可以分為三種類型:循序、選擇及重複三種結構,不管是怎麼的程式流程都是利用這種流程來實現。以下是說明的各類語法的意義及範例。
循序結構
依序執行程式區段。
語法說明:
continue
continue 用於迴圈之內,強制跳離現行的程式區段,直接執行下一個迴圈。
程式範例:
/*
將i值的變化依序讀入pin所指定的腳位上。
*/
for (i = 0; i < 20; i ++)
{
if (value > 140)
continue;
analogWrite(pin,i);
delay(10);
}
語法說明:
return
函數的結尾可以透過return回傳一個數值。
程式範例:
/*傳回所讀取到的數值*/
int value = resistanceValue();
int resistanceValue ()
{
int value = 0;
value = analogRead(0);
return value;
}
選擇結構
依照條件式,決定下一個要執行程式區段。
語法說明:
if … else
If後面接著條件式,若這個條件式為真,緊連著條件式後的程式碼就會被執行。若這個條件式為假,則執行緊接著else之後的程式碼,僅使用if不搭配else是可以的。
程式範例:
/*
當val讀值為真時,LED亮
*/
if (val == 1)
{
digitalWrite(LED,HIGH);
}
Else
{
digitalWrite(LED,LOW);
}
語法說明:
switch(變數值)
{
case Ⅰ:程式區塊Ⅰ
break;
case Ⅱ: 程式區塊Ⅱ
break;
default:
}
根據變數值,執行不同路徑(case)的程式碼,若皆不符合,就執行預設(default)程式碼。
break
Break讓程式碼跳離迴圈,並繼續執行之後的程式碼。
程式範例:
/*
當輸入1時,LED2亮。
當輸入2時,LED3亮。
當輸入不是1或2時,LED4亮。
*/
switch (Value)
{
case 1:
digitalWrite(LED2,HIGH);
break;
case 2:
digitalWrite(LED3,HIGH);
break;
default: // 以上條件都不符合時,預設執行的動作
digitalWrite(LED4, HIGH);
}
重複結構
當符合語法中的條件式時,即重複區段內的程式碼。
語法說明:
for(起始值;條件式;遞增值)
設定參數的起始值,驗證條件式是否為真,為真的重覆執行區段的程式碼,並遞增參數,直到條件式為假才停止。
程式範例:
/*
連續輸出五次的HELLO
*/
for (int i = 0; i <5; i++)
{
Serial.println("HELLO");
}
語法說明:
while(條件式)
當條件式為真時,執行括號內程式碼。
程式範例:
/*
重複讀取sensorValue值,當小於250時,LED亮。
*/
while (sensorValue <250)
{
digitalWrite(LED,HIGH);
delay(100);
sensorValue = analogRead(4);
}
語法說明:
do … while
先執行do後的程式碼,再驗證和while內的條件式是否為真,為真就重覆執行,為假就結束。
程式範例:
/*
與上述程式動作類似,但是本程式是先令LED動作,再測sensorValue值。
*/
do
{
digitalWrite(LED,HIGH);
delay(100);
sensorValue = analogRead(4);
}
while (sensorValue < 250);