Arduino 基本語法
阿新 • • 發佈:2019-01-24
這裡給你提供一個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語法參考
詳細內容請參考: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語法參考