2013年9月24日 星期二

一些常用的Arduino語法筆記

看了Arduino的範例程式也好一陣子,但最近因為單純一行一行下來的command flow不夠用。
就上網找了一些語法的網站來看,如下:
1. 官方:http://arduino.cc/en/Reference/HomePage
2. 中文語法手冊:http://www.game7777.net/doku.php?id=arduino:arduinoreference

因為自己不太懂,所以給自己留一點筆記:

一般會先做(1) Pin腳的宣告,(2) void setup (),(3) void loop ()
然後跟資料定義有關的:int, unsigned int, log, const, #define
跟loop結構有關的:if...else架構,while迴圈,for迴圈

int
整數是基底資料型別,佔用2位元組。
整數的範圍為-32,76832,767 -2^15 ~2^15)-1
整數類型使用2的補數方式存儲負數。
最高位元通常為符號位元,表示數的正負。
其餘位被取反加1”(此處請參考補數相關資料,不再贅述)

unsigned int
unsigned int(無符號整型)與整型資料同樣大小,佔據2位元組。
它只能用於存儲正數而不能存儲負數,範圍 0~65,535 (2^16) - 1)

無符號整型和整型最重要的區別是它們的最高位元不同,既符號位元。
Arduino整型類型中,如果最高位是1,則此數被認為是負數,
剩下的15位為按2的補數計算所得值。

long
長整數型變數是擴展的數位存儲變數,它可以存儲32位元(4位元組)大小的變數,
-2,147,483,6482,147,483,647

const
const關鍵字代表常數。
它是一個變數限定詞,用於修改變數的性質,使其變為唯讀狀態。
這表示該變數就像任何相同類型的其他變數一樣使用,但不能改變其值。
如果嘗試為一個const變數賦值,編譯時將會報錯。
const關鍵字定義的常數,遵守 variable scoping 管轄的其他變數的規則。
這一點加上使用 #define 的易犯錯誤,使 const 關鍵字成為定義常量的一個的首選方法。

#define
#define它允許程式設計師在程式編譯之前給常數命名。
Arduino中,定義的常數不會佔用晶片上的任何程式記憶體空間。
在編譯時編譯器會用事先定義的值來取代這些常數。
然而這樣做會產生一些副作用, 例如,一個已被定義的常量名已經包含在了其他常數名或者變數名中。 在這種情況下,程式內的常數將被 #defined 定義的數值或字串所取代。
通常情況下,優先考慮使用 const 關鍵字替代 #define 來定義常數。

例子
#define ledPin 3
//在編譯時,編譯器將使用數值 3 取代任何用到 ledPin 的地方。

注意:
#define 聲明後不能有分號。
如果存在分號,編譯器會拋出語義不明的錯誤,甚至關閉程式。
#define ledPin 3; //這是一種錯誤寫法
同樣的,在 #define 聲明中包含等號也會產生語義不明的編譯錯誤從而導致關閉程式。
#define ledPin = 3 //這是一種錯誤寫法

if(條件判斷語句)和 ==!=<>(比較運算子)
if 語句與比較運算子一起用於檢測某個條件是否達成,如某輸入值是否在特定值之上等。

if 語句的語法是:
if (someVariable > 50);
{
  // 執行某些語句;
}
本程式測試 someVariable 變數的值是否大於 50 當大於 50 時,執行一些語句。
換句話說,只要 if 後面括弧裡的結果(稱之為測試運算式)為真, 則執行大括弧中的語句(稱之為執行語句塊); 若為假,則跳過大括弧中的語句

在小括弧裡求值的運算式,需要以下操作符:
比較運算操作符
 x == yx 等於 y
 x != yx 不等於 y
 x <  yx 小於 y
 x >  yx 大於 y
 x <= yx 小於等於 y
 x >= yx 大於等於 y

警告:
注意使用設定運算子的情況(如 if (x = 10))。
一個“=”表示的是設定運算子,作用是將 x 的值設為 10(將值 10 放入 x 變數的記憶體中)。
兩個“==”表示的是比較運算子(如 if (x == 10)),用於測試 x 10 是否相等。
 
後面這個語句只有 x 10 時才為真,而前面賦值的那個語句則永遠為真。
這是因為 C 語言按以下規則進行運算 if (x=10)
10
賦值給x(只要非 0 的數賦值的語句,其賦值運算式的值永遠為真)

if / else
if/else是比if更為高級的流程控制語句,它可以進行多次條件測試。 比如,檢測模擬輸入的值,當它小於500時該執行哪些操作, 大於或等於500時執行另外的操作。代碼如下:
if (pinFiveInput < 500)
{
  // 執行A操作;
}
else
{
  // 執行B操作;
}

警告:
此時該測試相關的執行語句塊將被運行,然後程式就跳過剩下的檢測, 直接執行到if/else的下一條語句。注意: 當所有檢測都為假時,若存在else語句塊,將執行預設的else語句塊。
注意else if語句塊可以沒有else語句塊。else if分支語句的數量無限制。
if (pinFiveInput < 500) {
  // 執行A操作;
}
else if (pinFiveInput >= 1000) {
  // 執行B操作;
}
else {
  // 執行C操作;
}

while迴圈
while迴圈會無限的循環,直到括弧內的判斷語句變為假。
必須要有能改變判斷語句的程式,要不然 while迴圈 將永遠不會結束。
這在您的程式裡面表現為一個遞增的變數,或一個外部條件,如感測器的返回值。
語法
while(expression){
   //語句
}
參數
expression:為真或為假的一個計算結果
例子
var = 0;
while(var < 200){
  //重複一件事200
  var++
}

for迴圈
for語句用於重複執行一段在花括弧之內的代碼。
通常使用一個增量計數器計數並終止迴圈。
for
語句用於重複性的操作非常有效,通常與陣列結合起來使用來運算數據、針腳。
for迴圈開頭有3個部分:
for (初始化;條件;增量計數){
//語句
}

初始化只在迴圈開始執行一次。
每次迴圈,都會檢測一次條件;如果條件為真,則執行語句和增量計數
之後再檢測條件。當條件為假時,迴圈終止。

例子://PWM引腳將LED變暗
int PWMpin = 10;            //將一個LED47Ω電阻串聯接在10
 void setup()    {               //無需設置
        }
 void loop()      {
        for (int i=0; i <= 255; i++){
        analogWrite(PWMpin, i);
        delay(10);
        }
}
程式設計提示
1. 增量計數不只可以"++",還有其它做法,例如
                for(int x = 2; x < 100; x = x * 1.5)
2. 另使用if for迴圈裡,可以產生持續反轉的效果。
        int x = 1;
        for (int i = 0; i > -1; i = i + x) {
                analogWrite(PWMpin, i);
                if (i == 255) x = -1;             // 在峰值轉變方向
        }

1 則留言:

  1. 你好請問
    你知道哪裡可以有人為人解釋arduino code的嗎, 付費諮詢的也可以 ,
    有一組手電同程式很想做來實驗 ,但看不懂程式 ,國外公開的網站的分享沒有版權問題
    麻煩你 無限感激
    聯絡:eddie5492001t@yahoo.com.tw

    回覆刪除