





| 程式語法 |
| 網站頁面單元 - 固定頁面類 | |||||||||
| 作者是 xlinx | |||||||||
| 週四, 25 一月 2007 02:51 | |||||||||
程式結構 一個Arduino腳本程式碼(SKETCH)由兩部分組成 void setup() 在這個函數範圍內放置初始化Arduino 板子的程式 - 在主要程式開始撰寫前, 使Arduino 板子裝置妥當的指令。 void loop() 在此放置你的Arduino腳本。這部份的程式會一直重複的被執行,直到Arduino 板子被關閉。 Arduino 語言用了一些符號描繪程式碼,例如註釋和程式區塊。 ; //(分號) Arduino 語言每一行程序都是以分號為結尾。這樣的語法讓你可以自由地安排代碼,你可以將兩個指令放置在同一行,只要中間用分號隔開。(但這樣做可能降低程式的可讀性。) 範例: delay(100); {}(大括號) 大括號用來將程式代碼分成一個又一個的區塊,如以下範例所示,在loop()函數的前、後,必須用大括號括起來。 範例:
void loop(){
Serial.pritln("cial");
}
註釋 程式的註釋就是對代碼的解釋和說明,編寫註釋有助於程式設計師(或其他人)了解代碼的功能。 Arduino處理器在對程式碼進行編譯時會忽略註釋的部份。 Arduino 語言中的編寫註釋有兩種方式 //單行註釋:這整行的文字會被處理器忽略 /*多行註釋: 在這個範圍內你可以 寫一整首詩 */ 常數 在Arduino語言中事先定義了一些具特殊用途的保留字。HIGH 和 LOW 用來表示你開啟或是關閉了一個Arduino的腳位(pin)。INPUT 和 OUTPUT 用來指示這個Arduino的腳位(pin)是屬於輸入或是輸出用途。true 和 false 用來指示一個條件或表示式為真或是假。 變數用來指定Arduino 記憶體中的一個位置,變數可以用來儲存資料,程式人員可以透過腳本代碼去不限次數的操作變數的值。
因為Arduino 是一個非常簡易的微處理器,但你要宣告一個變數時必須先定義他的資料型態,好讓微處理器知道準備多大的空間以儲存這個變數值。
Arduino 語言支援的變數型態: 布林boolean 布林變數的值只能為真(true)或是假(false) 字元char 單一字元例如 A,和一般的電腦做法一樣Arduino 將字元儲存成一個數字,即使你看到的明明就是一個文字。 用數字表示一個字元時,它的值有效範圍為 -128 到127。 注意:有兩種主流的電腦編碼系統ASCII 和UNICODE。ASCII 表示了127個字元, 用來在序列終端機和分時計算機之間傳輸文字。 UNICODE可表示的字元量比較多,在現代電腦作業系統內它可以用來表示多國語言。 在位元數需求較少的資訊傳輸時,例如義大利文或英文這類由拉丁文,阿拉伯數字和一般常見符號構成的語言,ASCII仍是目前主要用來交換資訊的編碼法。
位元組byte 儲存的數值範圍為0到255。如同字元一樣位元組型態的變數只需要用一個位元組(8位元)的記憶體空間儲存。 整數int 整數資料型態用到2位元組的記憶體空間,可表示的整數範圍為 –32,768 到 32,767; 整數變數是Arduino內最常用到的資料型態。 整數unsigned int 無號整數同樣利用2位元組的記憶體空間,無號意謂著它不能儲存負的數值,因此無號整數可表示的整數範圍為0 到 65,535。 長整數long 長整數利用到的記憶體大小是整數的兩倍,因此它可表示的整數範圍從 –2,147,483,648 到 2,147,483,647。 長整數unsigned long 無號長整數可表示的整數範圍為0 到 4,294,967,295。 浮點數float 浮點數就是用來表達有小數點的數值,每個浮點數會用掉四位元組的RAM,注意晶片記憶體空間的限制,謹慎的使用浮點數。 雙精準度 浮點數double 雙精度浮點數可表達最大值為 1.7976931348623157 x 10308。 字串string 字串用來表達文字信息,它是由多個ASCII字元組成(你可以透過序串埠發送一個文字訊息或者將之顯示在液晶顯示器上)。字串中的每一個字元都用一個組元組空間儲存,並且在字串的最尾端加上一個空字元以提示Ardunio處理器字串的結束。下面兩種宣告方式是相同的。 char string1[] = "Arduino"; // 7 字元 + 1 空字元 char string2[8] = "Arduino"; // 與上行相同 陣列array 一串變數可以透過索引去直接取得。假如你想要儲存不同程度的LED亮度時,你可以宣告六個變數light01,light02,light03,light04,light05,light06,但其實你有更好的選擇,例如宣告一個整數陣列變數如下:
int light[6] = {0, 20, 50, 75, 100};
"array" 這個字為沒有直接用在變數宣告,而是[]和{}宣告陣列。 Ardunio 利用一些關鍵字控制程式碼的邏輯。 if … else If必須緊接著一個問題表示式(expression),若這個表示式為真,緊連著表示式後的代碼就會被執行。若這個表示式為假,則執行緊接著else之後的代碼. 只使用 if不搭配else是被允許的。 範例:
if (val == 1) {
digitalWrite(LED,HIGH);
}
for 用來明定一段區域代碼重覆指行的次數。 範例:
for (int i = 0; i < 10; i++) {
Serial.print("ciao");
}
switch case if 敘述是程式裡的分叉路口,switch case 是更多選項的路口。Swith case 根據變數值讓程式有更多的選擇,比起一串冗長的if敘述,使用swith case可使程式代碼看起來比較簡潔。 範例 :
switch (sensorValue) {
case 23:
digitalWrite(13,HIGH);
break;
case 46:
digitalWrite(12,HIGH);
break;
default: // 以上條件都不符合時,預設執行的動作
digitalWrite(12,LOW);
digitalWrite(13,LOW);
}
while 當while之後的條件成立時,執行括號內的程式碼。 範例 :
// 當sensor值小於512,閃爍LED燈
sensorValue = analogRead(1);
while (sensorValue < 512) {
digitalWrite(13,HIGH);
delay(100);
digitalWrite(13,HIGH);
delay(100);
sensorValue = analogRead(1);
}
do … while 和while 相似,不同的是while前的那段程式碼會先被執行一次,不管特定的條件式為真或為假。因此若有一段程式代碼至少需要被執行一次,就可以使用do…while架構。 範例 :
do {
digitalWrite(13,HIGH);
delay(100);
digitalWrite(13,HIGH);
delay(100);
sensorValue = analogRead(1);
} while (sensorValue < 512);
break Break讓程式碼跳離迴圈,並繼續執行這個迴圈之後的程式碼。此外,在break也用於分隔switch case 不同的敘述。 範例 :
//當sensor值小於512,閃爍LED燈
do {
// 按下按鈕離開迴圈
if (digitalRead(7) == HIGH)
break;
digitalWrite(13,HIGH);
delay(100);
digitalWrite(13,HIGH);
delay(100);
sensorValue = analogRead(1);
} while (sensorValue < 512);
continue continue 用於迴圈之內,它可以強制跳離接下來的程式,並直接執行下一個迴圈。 範例 :
for (light = 0; light < 255; light++)
{
// 忽略數值介於 140 到 200之間
if ((x > 140) && (x < 200))
continue;
analogWrite(PWMpin, light);
delay(10);
}
return 函數的結尾可以透過return回傳一個數值。 例如,有一個計算現在溫度的函數叫 computeTemperature(),你想要回傳現在的溫度給temperature變數,你可以這樣寫:
int temperature = computeTemperature();
int computeTemperature() {
int temperature = 0;
temperature = (analogRead(0) + 45) / 100;
return temperature;
}
算術運算和方程式 你可以透過特殊的語法用 Arduino 去做一些複雜的計算。 + 和 –就是一般學校教的加減法,乘法用*示,而除法用 /表示。 另外餘數除法(%),用於計算整數除法的餘數值。你可以透過多層次的括弧去指定算術之間的循序。和數學函式不一樣,中括號和大括號在此被保留在不同的用途(分別為陣列索引,和宣告區域程式碼)。 範例 : a = 2 + 2; light = ((12 * sensorValue) - 5 ) / 2; remainder = 3 % 2; 比較運算符號 當你在指定if,while, for 敘述句時,可以運用下面這個運算符號: == 等於 != 不等於 < 小於 > 大於 <= 小於等於 >= 大於等於 當你想要結合多個條件式時,可以使用布林運算符號。 例如你想要檢查從感測器傳回的數值是否於5到10,你可以這樣寫: if ((sensor => 5) && (sensor <=10)) 這裡有三個運算符號: 交集(and)用 && 表示; 聯集(or)用 || 表示; 反相(finally not)用 !表示。 有一般特殊的運算符號可以使程式碼比較簡潔,例如累加運算符號。 例如將一個值加1,你可以這樣寫: value = value +1;
你也可以用一個復合運算符號累加(++): value++; 累加和遞減 (++和 --) 當你在累加1或遞減1到一個數值時。請小心i++和++i之間的不同。如果你用的是 i++,i會被累加並且i的值等於i+1;但當你使用++i 時,i的值等於i,直到這行指令被執行完時i再加1。同理應用於––。
+= , –=, *= and /= 這些運算符號可讓表示式更精簡,下面二個表示式是等價的: a = a + 5; a += 5; 輸入輸出函數 Arduino 內含了一些處理輸出與輸入的切換功能,相信已經從書中程式範例略知一二。
pinMode(pin, mode) 將數位腳位(digital pin)指定為輸入或輸出。 範例 : pinMode(7,INPUT); // 將腳位 7 設定為輸入模式
digitalWrite(pin, value) 將數位腳位指定為開或關。腳位必須先透過pinMode明示為輸入或輸出模式digitalWrite才能生效。 範例 : digitalWrite(8,HIGH); //將腳位 8設定輸出高電位
int digitalRead(pin) 將輸入腳位的值讀出,當感測到腳位處於高電位時時回傳HIGH,否則回傳LOW。 範例 : val = digitalRead(7); // 讀出腳位 7 的值並指定給 val
int analogRead(pin) 讀出類比腳位的電壓並回傳一個 0到1023 的數值表示相對應的0到5的電壓值。 範例 : val = analogRead(0); //讀出類比腳位 0 的值並指定給 val變數
analogWrite(pin, value) 改變PWM腳位的輸出電壓值,腳位通常會在3、5、6、9、10與11。Value變數範圍0-255,例如:輸出電壓2.5伏特(V),該值大約是128。 範例 : analogWrite(9,128); // 輸出電壓約2.5伏特(V)
shiftOut(dataPin, clockPin, bitOrder, value) 把資料傳給用來延伸數位輸出的暫存器,函式使用一個腳位表示資料、一個腳位表示時脈。bitOrder用來表示位元間移動的方式(LSBFIRST最低有效位元或是MSBFIRST最高有效位元),最後value會以byte形式輸出。此函式通常使用在延伸數位的輸出。 範例 : shiftOut(dataPin, clockPin, LSBFIRST, 255);
unsigned long pulseIn(pin, value) 設定讀取腳位狀態的持續時間,例如使用紅外線、加速度感測器測得某一項數值時,在時間單位內不會改變狀態。 範例 : time = pulsein(7,HIGH); // 設定腳位7的狀態在時間單位內保持為HIGH
時間函數 控制與計算晶片執行期間的時間
unsigned long millis() 回傳晶片開始執行到目前的毫秒 範例: duration = millis()-lastTime; // 表示自"lastTime"至當下的時間
delay(ms) 暫停晶片執行多少毫秒 範例: delay(500); //暫停半秒(500毫秒)
delay Microseconds(us) 暫停晶片執行多少微秒 範例: delayMicroseconds(1000); //暫停1豪秒
數學函式 三角函數以及基本的數學運算
min(x, y) 回傳兩數之間較小者 範例: val = min(10,20); // 回傳10
max(x, y) 回傳兩數之間較大者 範例: val = max(10,20); // 回傳20
abs(x) 回傳該數的絕對值,可以將負數轉正數。 範例: val = abs(-5); // 回傳5
constrain(x, a, b) 判斷x變數位於a與b之間的狀態。x若小於a回傳a;介於a與b之間回傳x本身;大於b回傳b 範例: val = constrain(analogRead(0), 0, 255); // 忽略大於255的數
map(value, fromLow, fromHigh, toLow, toHigh) 將value變數依照fromLow與fromHigh範圍,對等轉換至toLow與toHigh範圍。時常使用於讀取類比訊號,轉換至程式所需要的範圍值。
例如: val = map(analogRead(0),0,1023,100, 200); // 將analog0 所讀取到的訊號對等轉換至100 – 200之間的數值。
double pow(base, exponent) 回傳一個數(base)的指數(exponent)值。 範例: double x = pow(y, 32); // 設定x為y的32次方
double sqrt(x) 回傳double型態的取平方根值。 範例: double a = sqrt(1138); // 回傳1138平方根的近似值 33.73425674438
double sin(rad) 回傳角度(radians)的三角函數sine值。 範例: double sine = sin(2); // 近似值 0.90929737091
double cos(rad) 回傳角度(radians)的三角函數cosine值。 範例: double cosine = cos(2); //近似值-0.41614685058
double tan(rad) 回傳角度(radians)的三角函數tangent值。 範例: double tangent = tan(2); //近似值-2.18503975868
亂數函式 產生亂數
randomSeed(seed) 事實上在Arduino裡的亂數是可以被預知的。所以如果需要一個真正的亂數,可以呼叫此函式重新設定產生亂數種子。你可以使用亂數當作亂數的種子,以確保數字以隨機的方式出現,通常會使用類比輸入當作亂數種子,藉此可以產生與環境有關的亂數(例如:無線電波、宇宙雷射線、電話和螢光燈發出的電磁波等)。 範例: randomSeed(analogRead(5)); // 使用類比輸入當作亂數種子
long random(max) long random(min, max) 回傳指定區間的亂數,型態為long。如果沒有指定最小值,預設為0。
範例: long randnum = random(0, 100); // 回傳0 – 99 之間的數字 long randnum = random(11); // 回傳 0 -10之間的數字 序列通訊 你可以在第五章看見一些使用序列埠與電腦交換訊息的範例,以下是函式解釋。
Serial.begin(speed) 你可以指定Arduino從電腦交換訊息的速率,通常我們使用9600 bps。當然也可以使用其他的速度,但是通常不會超過115,200 bps(每秒位元組)。
範例: Serial.begin(9600); Serial.print(data) Serial.print(data, encoding) 經序列埠傳送資料,提供編碼方式的選項。如果沒有指定,預設以一般文字傳送。
範例: Serial.print(75); // 列印出 "75" Serial.print(75, DEC); //列印出 "75" Serial.print(75, HEX); // "4B" (75 的十六進位) Serial.print(75, OCT); // "113" (75 in的八進位) Serial.print(75, BIN); // "1001011" (75的二進位) Serial.print(75, BYTE); // "K" (以byte進行傳送,顯示以ASCII編碼方式)
Serial.println(data) Serial.println(data, encoding) 與Serial.print()相同,但會在資料尾端加上換行字元( )。意思如同你在鍵盤上打了一些資料後按下Enter。 範例: Serial.println(75); //列印出"75 " Serial.println(75, DEC); //列印出"75 " Serial.println(75, HEX); // "4B " Serial.println(75, OCT); // "113 " Serial.println(75, BIN); // "1001011 " Serial.println(75, BYTE); // "K "
int Serial.available() 回傳有多少位元組(bytes)的資料尚未被read()函式讀取,如果回傳值是0代表所有序列埠上資料都已經被read()函式讀取。 範例: int count = Serial.available();
int Serial.read() 讀取1byte的序列資料 範例: int data = Serial.read();
Serial.flush() 有時候因為資料速度太快,超過程式處理資料的速度,你可以使用此函式清除緩衝區內的資料。經過此函式可以確保緩衝區(buffer)內的資料都是最新的。 範例: Serial.flush();
|
|||||||||
| 最近更新在 週一, 07 六月 2010 20:35 |