查看: 457|回复: 4
打印 上一主题 下一主题

一個Arduino腳本程式

[复制链接] qrcode

22

主题

39

帖子

104

积分

注册会员

Rank: 2

积分
104
楼主
跳转到指定楼层
发表于 2014-6-17 09:41 AM | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

一個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");

 

}

回复

使用道具 举报

0

主题

91

帖子

6

积分

新手上路

Rank: 1

积分
6
沙发
发表于 2014-6-17 09:42 AM | 只看该作者

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;

 

}

回复 支持 反对

使用道具 举报

0

主题

91

帖子

4

积分

新手上路

Rank: 1

积分
4
板凳
发表于 2014-6-17 09:43 AM | 只看该作者

算術運算和方程式

你可以透過特殊的語法用 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)

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

回复 支持 反对

使用道具 举报

0

主题

84

帖子

38

积分

新手上路

Rank: 1

积分
38
地板
发表于 2014-6-17 09:44 AM | 只看该作者

範例 :

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之間的數字

序列通訊

你可以在第五章看見一些使用序列埠與電腦交換訊息的範例,以下是函式解釋。

回复 支持 反对

使用道具 举报

1

主题

83

帖子

13

积分

新手上路

Rank: 1

积分
13
5#
发表于 2014-6-17 09:46 AM | 只看该作者

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

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表