登录站点

用户名

密码

最新:facebook脸书下载地址


福利:怎么注册一个可以看明星名人福利的facebook账号?


推荐:facebook脸谱邀请码(最新免费)

Arduino常用程式與語句

已有 189 次阅读   2010-10-24 15:06   标签程式  Arduino  语法 
 

這段時間一直在學習arduino的基本語句,這裡有些程式與語句,在arduino中國上似乎没有詳細的說明與解釋,这里是自己整理的一些,希望和感兴趣的同志们分享下,如有不足或錯誤望大家提出以便更正

 

語法與程式详情请见arduino官网:http://www.arduino.cc/en/Reference/HomePage(特此申明:本人所整理以下全来源于此网站)

 

一個Arduino腳本程式碼(SKETCH)由兩部分組(基本是以c為平臺,也可用Java進行編譯)


void setup()


在這個函數範圍內放置初始化Arduino 板的程式 - 在主要程式開始撰寫前, 使Arduino 板裝置妥當的指令。


void loop()


在此放置你的Arduino腳本。這部份的程式會一直重複的被執行(運行arduino的主題思想精髓),直到Arduino 板被關閉。

 

 

 


特殊符號

Arduino 語言用了一些符號描繪程式碼,例如註釋和程式區塊。


; //(分號)


Arduino 語言每一行程序都是以分號為結尾。這樣的語法讓你可以自由地安排代碼,你可以將

兩個指令放置在同一行,只要中間用分號隔開。(但這樣做可能降低程式的可讀性。)


範例:


delay(100);

 


{}(大括號)


大括號用來將程式代碼分成一個又一個的區塊,如以下範例所示,在loop()函數的前、後,必

須用大括號括起來。


範例:


void loop(){


    Serial.pritln("arduino");


}

 


註釋


程式的註釋就是對代碼的解釋和說明,編寫註釋有助於程式設計師(或其他人)了解代碼的功能


Arduino處理器在對程式碼進行編譯時會忽略註釋的部份。


Arduino 語言中的編寫註釋有兩種方式


//單行註釋:這整行的文字會被處理器忽略


/*多行註釋:


   在這個範圍內你可以


   寫一整首詩


*/


 

 

 


常量

在Arduino語言中事先定義了一些具特殊用途的保留字。HIGH  和 LOW 用來表示你開啟或是

關閉了一個Arduino的腳位(pin)。INPUT 和 OUTPUT 用來指示這個Arduino的腳位(pin)是屬

於輸入或是輸出用途。true 和 false 用來指示一個條件或表示式為真或是假。


變量

變量用來指定Arduino 記憶體中的一個位置,變量可以用來儲存資料,程式人員可以透過腳本

代碼去不限次數的操作變量的值。


 


因為Arduino 是一個非常簡易的微處理器,但你要宣告一個變量時必須先定義他的資料型態,

好讓微處理器知道準備多大的空間以儲存這個變數值。


 


Arduino 語言支援的變量型態:


 


布林boolean


布林變數的值只能為真(true)或是假(false)


 


字符char


單一字符例如 A,和一般的電腦做法一樣Arduino 將字符儲存成一個數字,即使你看到的明明

就是一個文字。


用數字表示一個字节時,它的值有效範圍為 -128 到127。(arduino主要採用ASCII機制)


-----------------------------------------------------------------------------------------------------------------


注示:有兩種主流的電腦編碼系統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字元組成(可以透過序串埠發送一個文字訊息或者

將之顯示在液晶顯示器上)。字符串中的每一個字符都用一個字元組空間儲存,並且在字符串的

最尾端加上一個空字節(/o)以提示Ardunio處理器字串的結束。下面兩種宣告方式是相同的


char string1[]  = "Arduino"; // 7 字節 + 1 空字節(/o)=8字節


char string2[8] = "Arduino"; // 同上


 


數組array


一串變量可以透過索引去直接取得。假如你想要儲存不同程度的LED亮度時,你可以宣告六個

變量light01,light02,light03,light04,light05,light06,但其實你有更好的選擇,

例如宣告一個整數數组變量如下:


int light[6] = {0, 25, 75, 150, 225};


"array" 這個字為沒有直接用在變數宣告,而是[]和{}宣告數組。

 

 


控制指令

Ardunio 利用一些關鍵字控制程式碼的邏輯。(基本和C一樣)


if … else


If必須緊接著一個問題表示式(expression),若這個表示式為真,緊連著表示式後的代碼就會

被執行。若這個表示式為假,則執行緊接著else之後的代碼. 只使用 if不搭配else是被允許

的。(也可用if······else if······else if·····   ·······

else)


例:


if (val 1== 1) {


  digitalWrite(LED,HIGH);}

else if(val2==1){

  digitalWrite(LED2,HIGH);}

else{

  digitalWrite(LED,HIGH);

 digitalWrite(LED2,HIGH);}


 


for


用來明定一段區域代碼重覆指行的次數。


例:


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


    Serial.print("Arduino");


}


 


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);


}//sensorValue须是整形变量,退出switch case必需使用break;


 


while(先判断再执行)


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


例 :


// 當sensor值小於512,閃爍LED燈(13脚)


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  {


   // 按下按鈕離開迴圈(設定為數字7號口為按鈕輸入端)


   if (digitalRead(7) == HIGH)


     {break;}

   else{

   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(10,INPUT); // 將腳位 10 設定為輸入模式
pinMode(11,OUTPUT);// 將腳位 11 設定為輸出模式


 


digitalWrite(pin, value)


將數位腳位指定為開或關。腳位必須先透過pinMode明示為輸入或輸出模式digitalWrite才能

生效。


例 :


digitalWrite(10,HIGH); //將腳位10設定輸出高電位
digitalWrite(9,LOW);   //將腳位 9設定輸出低電位


 


int digitalRead(pin)


將輸入腳位的值讀出,當感測到腳位處於高電位時時回傳HIGH,否則回傳LOW。


例 :


val = digitalRead(8); // 讀出腳位 8 的值並指定給 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,例如

:輸出電壓5伏特(V),該值為255。


例 :


analogWrite(10,255); // 輸出電壓約5伏特(V),先設定10號管腳為輸出端


 


shiftOut(dataPin, clockPin, bitOrder, value)


把資料傳給用來延伸數位輸出的暫存器,函式使用一個腳位表示資料、一個腳位表示時脈。

bitOrder用來表示位元間移動的方式(LSBFIRST最低有效位元或是MSBFIRST最高有效位元)

,最後value會以byte形式輸出。此函式通常使用在延伸數位的輸出。


例 :


shiftOut(dataPin, clockPin, LSBFIRST, 255);


 


unsigned long pulseIn(pin, value)


設定讀取腳位狀態的持續時間,例如使用紅外線、加速度感測器測得某一項數值時,在時間單位

內不會改變狀態。


例 :


time = pulsein(7,LOW); // 設定腳位7的狀態在時間單位內保持為LOW


 


時間函數

控制與計算晶片執行期間的時間


 


unsigned long millis()


回傳晶片開始執行到目前的毫秒


例:


duration = millis()-lastTime; // 表示自"lastTime"至運行到當下的時間


 


delay(ms)


暫停晶片執行多少毫秒


例:


delay(1000); //暫停一秒(1000毫秒)


 


delay Microseconds(us)


暫停晶片執行多少微秒


範例:


delayMicroseconds(1000); //暫停1豪秒


 


 


數學函式

三角函數(主要為sin,cos,tan)以及基本的數學運算
sin(x);
cos(x);
tan(x);


 


min(x, y)


回傳兩數之間較小者


例:


val = min(5,25); // 回傳5


 


max(x, y)


回傳兩數之間較大者


例:


val = max(5,25); // 回傳20


 


abs(x)


回傳該數的絕對值,可以將負數轉正數。


例:


val = abs(-25); // 回傳25


 


constrain(x, a, b)


判斷x變數位於a與b之間的狀態。x若小於a回傳a;介於a與b之間回傳x本身;大於b回傳b


例:


val = constrain(analogRead(0), 0, 255); // 忽略大於255的數與小於0的數


 


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, 3); // 設定x為y的3次方


 


double sqrt(x)


回傳double型態的取平方根值。


例:


double a = sqrt(64); // 回傳64平方根的值8

 


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(4)); // 使用模擬輸入當作亂數種子


 

 

long random(max)


long random(min, max)


回傳指定區間的亂數,型態為long。如果沒有指定最小值,預設為0。


 


例:


long randnum = random(0, 200);  // 回傳0 – 199 之間的數字


long randnum = random(16);     // 回傳 0 -15之間的數字

 

 

 

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();

更多