1. 程式人生 > >Arduino 基本語法

Arduino 基本語法

這裡給你提供一個Arduino語法函式的操作指令講解。

詳細內容請參考:http://arduino.cc/en/Reference/HomePage

程式結構

一個Arduino程式分為兩部分:

void setup()

在這個函式裡防止初始化Arduino的程式,使主迴圈程式在開始之前設定好相關引數。

void loop()

這是Arduino的主函式。這套程式會一直重複執行,直到電源被斷開。

特殊標點及符號

Arduino語言運用了一些符號來描繪程式程式碼,例如,註釋和程式部分。

;(分號)

Arduino每條指令(程式碼行)都以分號結束。這樣的語法可以讓你自由安排車剛需程式碼,甚至可以將兩條指令放在同一行,只要你用一個分號把它們隔開就行了(然而,這樣做會讓你的程式程式碼更難以閱讀)。

例如:

delay(100);

{}(大括號)

用來註釋程式程式碼的分割槽。例如,當你為loop()函式編寫程式碼時,必須咱編碼的前後用大括號括起來。

例如:

void loop(){

serial.println(“TSRobot”);

}

註釋

這是Arduino程式編譯中忽略的一部分,但是它有助於提醒你自己或別人這小段程式程式碼的功能。

在Arduino裡有兩種形式的註釋。

//單行註釋:這行會被忽略掉

/*多行註釋:

你可以

在這裡

寫出

一整首詩

*/

常量

Arduino語言有一些特殊意義的關鍵字。

例如:

HIGH和LOW用來表示你開啟或關閉(高電平或者低電平);

Arduino的一個引腳(pin),INPUT和OUTPUT用來設定某個特定引腳是輸入介面還是輸出介面;

INPUT_PULLUP用來設定某個引腳為輸入,並且被拉高;

True和False,像它們的字面意思一樣;表示一個條件或一個運算是真還是假。

變數

變數儲存在Arduino記憶體中,它可以用來儲存資料,你可以應用這個變數的資料來計算或者將這個資料應用到程式中。正如字面意思,變數在程式中是可以隨便更改的。

因為Arduino是一個非常簡單的微處理器,所以當你宣告一個變數時,還必須指定它的型別。這意味著告訴處理器為你所要儲存的資料留出多大的空間。

下面是一些常見的資料型別:

Boolean(布林)

只能是真或者假兩種值。

char(字元)

儲存一個字元,如“A”。和任何計算機一樣,Arduino將字元儲存為一個數字,雖然你拷打的是文字。當字元用數字裡儲存時,數值範圍是-128到127。

注意:在計算機系統裡主要有兩組有效字元:ASCII和UNICODE。ASCII有127個可用字元,主要用於序列終端之間文字的傳輸,相應的計算機系統的例子如大型機、小型機之間傳送文字。UNICODE在現代計算機作業系統中有大量的實用字元,可以代表多種語言。在傳輸短位元組語言方面,ASCII仍很實用,如只用拉丁文(義大利語、英語)、阿拉伯數字、常見的印表機符號、標點符號等情況。

byte(位元組)

儲存0-255的數字。像char一樣,byte只能用一個位元組(8位)的儲存空間。

int(整型)

用2個位元組表示一個記憶體空間,從-32768到32767之間的整數,這是用於Arduino的最普遍的資料型別之一。

unsigned int(無符號整型)

像int一樣,也用2個位元組的空間,但是無符號的字首意味著它不能儲存負數,它的範圍是0-65535。

long(長整型)

它是int的兩倍大小。能夠儲存-2147483648到2417483647之間的數字。

unsigned long(無符號長整型)

無符號長整型的範圍是0到4294967295

float(浮點型)

它的儲存空間很大,能夠儲存浮點值,你能用它儲存帶小數的數字,每個浮點型會用掉四個位元組,所以要謹慎使用。

double(雙精度浮點型)

雙精度浮點數最大值為1.797 693 134 862 315 7乘以10的308次方。哇,非常大!

string(字串)

用一組ASCII字元來儲存文字資訊(你可以用字串通過串列埠傳送一條資訊、或者在LCD顯示屏上展示)。字串的每一個字元會佔用一個位元組的儲存空間,加上一個零字元。表示字串的結束。

用兩種表達方:

char string1[] = “Arduino”; //7個字元 + 1個零字元

char string2[] = “Arduino”; //同上

array(陣列)

陣列就是通過索引存取的變數列表,它們用來建立數值的表格。例如,如果你想儲存不同亮度的LED值,你固然可以創立6個變數,分別為light01、light02等,但更好的方法是用一個像int light[6] = {0,20,50,75,100,150};這樣的陣列。

array這個詞實際上不用在變數宣告:陣列用符號[]和{}來表示即可。

控制指令

Arduino利用了一些關鍵字控制了程式的執行流程。

If…else

If後面的括號裡必須要有一個表示判斷的表示式。如果表示式為真,則繼續執行下面的語句;如果是假,則下面的程式碼將被跳過,執行else下的指令程式碼。你也可以只用if而不搭配else。

例如:

If(val == 1){

digtalWrite(LED,HIGH);

}

for

用來指明一段程式碼重複的次數。

例如:

for(int I = 0; i< 10; i++){

Serial.print(“TSRobot”);

}

switch case

如果說if就像程式的岔路口,那麼switch case就像一個多選擇環形路口。switch case根據變數的數值讓程式有了更多的選擇,比起一長串的if函式,switch case可以讓程式看上去更為簡潔。

例如:

switch (sensorValue){

case 23:

digitalWrite(13,HIGH);

break;

case 46:

digitalWrite(12,HIGH);

break;

default: //以上條件都不滿足時執行預設指令

digitalWrite(13,LOW);

digitalWrite(12,LOW);

}

While

當whileh後的條件成立時,執行大括號內的程式程式碼。

例如:

// 當sensor值小於512時,讓LED閃爍

sensorValue = analogRead(1);

while(sensorValue < 512){

digitalWrite(13,HIGH);

delay(100);

digitalWrite(13,LOW);

delay(100);

sensorValue = aalogRead(1);

}

do…while

與while相似,但不同之處在於:while函式是先判斷while後的表示式;而do…while是先執行do後的程度段,再對while後的表示式進行判斷。因此do…while的主程式段至少會被執行一次。

例如:

do {

digtialWrite(13,HIGH);

delay(100);

digtialWrite(13,LOW);

delay(100);

sensorVaule = analogRead(1);

} while(sensorVaule < 512);

break

這個語句可以讓程式跳出一個迴圈,然後繼續執行迴圈之後的程式程式碼段。也用於分隔switch case語句的不同部分。

例如:

// 當sensor值小於512時,讓LED閃爍。

do {

// 當按鍵按下時跳出迴圈

If(digitalRead(7) == HIGH)

Break;

digtialWrite(13,HIGH);

delay(100);

digtialWrite(13,LOW);

delay(100);

sensorVaule = analogRead(1);

} while(sensorVaule < 512);

continue

在迴圈程式中使用,能讓你跳過程式裡的某些部分,然後再次判斷表示式。

例如:

for( light = 0; light <255; light++){

// 忽略介於140至200之間的數值

If((x > 140) && (x < 200))

continue;

analogWrite(PWMpin, light);

delay(10);

}

return

用return在一個函式的結尾返回一個數值。例如,現在有一個函式叫做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; // 返回1,因為3除以2餘1

比較運算子

當你在運用if,while,for,函式時,可以用到下列比較運算子:

==等於

!=不等於

<小於

>大於

<=小於等於

>=大於等於

布林運算子

當你要結合多個判斷條件時,可以用到布林運算子。

例如,你要檢測一個感測器的返回值是否是5至10之間的數,你可以這樣寫程式:

if((sensor >= 5) && (sensor <= 10))

布林運算子有三種:&&邏輯與、||邏輯或、!邏輯非

複合運算子

這些運算子常用唉類似於“遞增”這些常見的函式中,讓程式程式碼看上去更整潔。

例如,讓變數自身加1可以寫成:

value = value + 1;

但也可以使用複合運算子把上面的式子簡化成:

value++;

遞增和遞減(++和 —)

當對一個數值進行遞增或遞減時,要注意一點,那就是i++和++i之間的不同。i++是將i的值加1使i的值等於i+1;而當使用++i時,i在第一次執行程式時是i,直到第二次執行程式時才會被加1。這個原理同樣適用於—。

+=,-=,*=及/=

這些運算子可以使程式運算式更加精簡,下面是兩個等價式:

a = a + 5;

a += 5;

輸入輸出函式

Arduino有一些處理輸入輸出功能的函式,在書中的一些例程裡我們已經用到了一些。

pinMode(pin, mode)

將一個引腳配置成輸入或者輸出。

例如:

pinMode(7, INPUT); // 將引腳7定義為輸入介面

digitalWrite(pin, value)

開啟一個數值引腳並將其賦值高電平或者低電平,此引腳必須是前面定義過的輸入或者輸出模式,否則digitalWrite不生效。

例如:

digitalWrite(8, HIGH); // 給8號引腳高電平

int digitalRead(pin)

讀取一個輸入狀態的引腳值。當引腳處於高電平狀態時返回HIGH,否則返回LOW。

例如:

val = digitalRead(7); // 讀取7號引腳的值並賦值給val

int analogRead(pin)

讀取模擬輸入引腳的值,並將其表示為0至1023之間的數值,對應0至5V的電壓。

例如:

val = analogRead(0); // 讀取模擬介面0的值,並賦值給val

analogWrite(pin, value)

改變該引腳的PWM輸出數值,引腳(pin)可以是3、5、6、9、10、11。PWM值的改變範圍是0至255,對應的電壓輸出值是0至5V。

例如:

analogWrite(9, 128); // 將9號引腳的LED點亮至50%亮度

shiftOut(dataPin, clockPin, bitOrder, value)

傳送資料到移位暫存器,用來擴大數字輸出範圍,此函式使用時有一個引腳作為資料輸出,另一個引腳用來表示時鐘,bitOrder用來表示位元組的格式(LSBFIRST是最低有效位,MSBFIRST是最高有效位),value則要輸出位元組的值。

例如:

shiftOut(dataPin, clockPin, LSBFIRST, 255);

unsigned long pulseIn(pin, value)

讀取一個引腳的脈衝持續時間,例如使用紅外感測器或者加速度計時。它們都是利用單位時間不同的脈衝來獲得狀態值的感測器。

例如:

time = pulseIn(7,HIGH); // 讀取7號引腳持續為高電平的時間

時間函式

計算與控制晶片執行程式的時間。

unsigned long millis()

檢測程式執行開始到當前的時間。

例如:

duration = millis()-lastTime; //表示從lastTime到當前的時間

delay(ms)

延遲一定毫秒的時間。

例如:

delay(500); // 延遲500ms

delayMicroseconds(us)

延遲一定微秒的時間。

例如:

delayMicroseconds(1000); //延時1000us

數學函式

Arduino也有很多自帶的數學函式,包括三角函式等。

min(x, y)

x和y中返回最小值。

例如:

val = min(10, 20); // val 的值為10

max(x, y)

x和y中返回最大值。

例如:

val = max(10, 20); // val 的值為20

abs(x)

傳回x的絕對值,正數的絕對值是其本身,負數的絕對值是其相反的數。例如:

val = abs(-5); // val 的值是5

constrain(x, a, b)

判斷x與a和b的關係,若x小於a,則傳回a;若x介於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);

//將模擬介面0讀取的0~1023的值轉換成0~100的值

double pow(base, exponent)

傳回一個數(base)的指數(exponent)的值

例如:

double x = pow(y, 32); //使x是y的32次方

double sqrt(x)

去x的平方根。

例如:

double a = sqrt(1138); // 1138的平方根是33.73425674438

double sin(rad)

傳回某個角度(用弧度單位)的正弦值。

例如:

double sine = sin(2); // 2弧度的正弦值近似為0.90929737091

double cos(rad)

傳回某個角度(用弧度單位)的餘弦值。

例如:

double cosine = cos(2); // 2弧度的餘弦值近似為 -0.41614685058

double tan(rad)

傳回某個角度(用弧度單位)的正切值。

例如:

double tangent = tan(2); // 2弧度的正切值近似為 -2.18503975868

隨機數函式

如果你需要隨機數,你可以利用Arduino的隨機數函式來產生隨機數。

randomSeed(seed)

復位Arduino的隨機數發生器,會產生一系列的隨機數,雖然這些數字貌似是隨機產生,但是它們的順序其實還是可以被預測的。所以如果我們需要真正的一組隨機數,我們就要重新設定隨機數的種子。若我們沒有連線一個模擬值引腳,它可以從周圍環境(無線電波、宇宙射線、手機或者熒光燈的電磁干擾等)獲得隨機噪聲。

例如:

randomSeed(analogRead(5)); // 利用5號引腳的噪聲

long random(max)

long random(min, max)

傳回指定區間的長整型隨機數。如果沒有規定最小值,則預設最小值為0。

例如:

long randnum = random(o, 100); //傳回一個介於0~100之間的數

long randnum = random(11); //傳回一個介於0~10之間的數

序列通訊

前面實驗課我們介紹過,可以通過USB與Arduino進行串列埠通訊。下面我們介紹一些相關串列埠通訊的函式。

Serial.begin(speed)

為與Arduino串列埠通訊做準備,我們可以通過Arduino的上位機軟體檢測返回值,這裡設定通訊的波特率,我們通常使用9600,我們也可以使用其他的通訊波特率,但最大值是115200.

例如:

Serial.begin(9600);

Serial.print(data)

Serial.print(data, encoding)

將資料通過串列埠傳回,encoding指明資料傳回型別,預設為純文字格式。

例如:

Serial.print(75); //顯示75

Serial.print(75, DEC); //同上

Serial.print(75, HEX); //“4B”(75的十六進位制表達)

Serial.print(75,OCT); //“113”(75的八進位制表達)

Serial.print(75, BIN); //“1001011”(75的二進位制表達)

Serial.print(75, BYTE); //“K”(K的ASCII碼值是75)

Serial.println(data)

Serial.println(data, encoding)

與Serial.print(data)相同,只是在傳回資料的末尾多加一個換行符(\r\n)。換行符的意義就等於你在輸入一些文字後敲入的回車鍵。

例如:

Serial.println(75); //顯示“75\r\n”

Serial.println(75, DEC); //同上

Serial.println(75, HEX); //“4B\r\n”

Serial.println(75,OCT); //“113\r\n”

Serial.println(75, BIN); //“1001011\r\n”

Serial.println(75, BYTE); //“K\r\n”

int Serial.available()

傳回一個數值,告訴上位機有多少位元組沒有被read()函式讀取,若Serial.available()返回值是0,則代表序列資料都已被read()讀取。

例如:

int count = Serial.available();

int Serial.read()

讀取一個位元組的序列資料

例如:

int data = Serial.read();

Serial.flush()

因為資料傳輸的速度要大於Arduino程式處理速度,所以Arduino會將資料先存放在快取區中。如果有需要,我們可以利用Serial.flush()函式來清空快取區,以確保快取區的資料是最新的。

例如:

Serial.flush();

語法的學習很重要,它是我們與Arduino主機板交流互動的橋樑,當然你也不用一口氣全學會,可以先學習基礎的,以後的實驗中再累積!

轉載請註明:More » Arduino語法參考