玩轉Mixly – 3、Arduino AVR編程 之 控制

以下內容源自Mixly官方技術文檔:

https://mixly.readthedocs.io/zh_CN/latest/Arduino/AVR/02Control.html

 

控制

控制類別中包括了時間延遲、條件執行、循環執行、獲取運行時間、初始化、Switch執行等 控制模塊中主要執行的內容是對程序結構進行的相應控制。

1.初始化

1

2

pinMode(3, OUTPUT);

digitalWrite(3,HIGH);

 

 

1.1 描述

在Arduino中程序運行時將首先調用 setup()函數。 用於初始化變量、設置針腳的輸出輸入類型、配置串口、引入類庫文件等等。

1.2 範例1

初始化時聲明變量。

1

2

3

4

5

6

volatile int item;

void setup(){

item = 0;

}

void loop(){

}

 

 

1.3 範例2

在初始化時定義中斷函數。

1

2

3

4

5

6

7

8

9

10

void attachInterrupt_fun_2() {

digitalWrite(13,HIGH);

}

void setup(){

pinMode(2, INPUT);

pinMode(13, OUTPUT);

attachInterrupt(digitalPinToInterrupt(2),attachInterrupt_fun_2,RISING);

}

void loop(){

}

 

 

注意

每次 Arduino 上電或重啓後,setup 函數只運行一次。

2.while 循環

2.1 描述

while循環會無限的循環,直到括號內的判斷語句變爲假。 必須要有能改變判斷語句的東西,要不然while循環將永遠不會結束。你可以使用一個傳感器的值,或者一個變量來控制什麼時候停止該循環。

2.2 參數

  • 滿足條件:爲真或爲假的一個條件。

2.3 範例

當溫度高於30度時,亮燈,否則滅燈。

1

2

3

4

5

6

7

8

9

void setup(){

pinMode(13, OUTPUT);

}

void loop(){

while (analogRead(A0)*0.488 > 30) {

digitalWrite(13,HIGH);

}

digitalWrite(13,LOW);

}

 

 

3.延時

1

delay(1000);

 

 

3.1 描述

使程序暫定設定的時間(單位毫秒)。(一秒等於1000毫秒)。

3.2 參數

  • 毫秒:暫停的毫秒數。

3.3 範例

13號引腳燈亮1秒,滅1秒,往復循環。

1

2

3

4

5

6

7

8

9

void setup(){

pinMode(13, OUTPUT);

}

void loop(){

digitalWrite(13,HIGH);

delay(1000);

digitalWrite(13,LOW);

delay(1000);

}

 

 

注意

雖然創建一個使用delay()的閃爍LED很簡單,並且許多例子將很短的delay用於消除開關抖動。

但delay()確實擁有很多顯著的缺點。在delay函數使用的過程中,讀取傳感器值、計算、引腳操作均無法執行,因此,它所帶來的後果就是使其他大多數活動暫停。大多數熟練的程序員通常避免超過10毫秒的delay(),除非arduino程序非常簡單。

利用定時器,就可以解決這個問題,可以避免由於delay()帶來的CPU暫停,也能很好地實現每隔一定時間執行動作。

4.如果(if)

1

2

if (false) {

}

 

 

4.1 描述

if 語句與比較運算符一起用於檢測某個條件是否達成,如某個傳感器的值是否等於某個值。

4.2 參數

  • 條件:比較表達式

4.3 用法

增加條件:如果需要增加條件,可以點開齒輪,然後將左側的“否則如果”或者“否則”模塊拖到右側的“如果”之中。

4.4 範例1

當連接在2號引腳的按鍵按下時,點亮13號引腳的燈。

1

2

3

4

5

6

7

8

9

void setup(){

pinMode(2, INPUT);

pinMode(13, OUTPUT);

}

void loop(){

if (digitalRead(2) == 1) {

digitalWrite(13,HIGH);

}

}

 

 

如果判斷的條件大於等於1時,可以省略等於判斷,因爲只要 該表達式的結果不爲0,則爲真。

所以,上面的寫法與下面的寫法等效。

1

2

3

4

5

6

7

8

9

void setup(){

pinMode(2, INPUT);

pinMode(13, OUTPUT);

}

void loop(){

if (digitalRead(2)) {

digitalWrite(13,HIGH);

}

}

 

 

4.5 範例2

當連接在2號引腳的按鍵按下時,點亮13號引腳的燈;當按鍵鬆開時,燈滅。

 

注意

另外一種進行多種條件分支判斷的語句是switch case語句。

5.如果(switch)

 

5.1 描述

和if語句相同,switch…case通過設定的在不同條件下執行的代碼控制程序的流程。

特別地,switch語句將變量值和case語句中設定的值進行比較。當一個case語句中的設定值與變量值相同時,這條case語句將被執行。

關鍵字break可用於退出switch語句,通常每條case語句都以break結尾。如果沒有break語句,switch語句將會一直執行接下來的語句(一直向下)直到遇見一個break,或者直到switch語句結尾。

5.2 參數

  • var: 用於與下面的case中的標籤進行比較的變量值

  • label: 與變量進行比較的值

5.3 用法

增加case:如果需要增加條件,可以點開齒輪,然後將左側的“case”或者“default”模塊拖到右側的“switch”之中。

5.4 範例

當連接在2號引腳的按鍵按下時,點亮13號引腳的燈,否則13號引腳的燈滅

 

注意

每個switch可以有多個case,但是最多不超過一個default,當不滿足任何一個case時,執行default中的程序。

6.for循環

 

6.1 描述

for循環用於重複執行一段的程序。通常使用一個增量計數器計數並終止循環。

for循環用於重複性的操作非常有效,通常與數組結合起來使用來操作數據、引腳。

6.2 參數

  • 變量名:用於記錄for循環次數的變量名。

  • 起始值:循環的計數起始值,一般從0開頭,也可以從其他數值開始。

  • 終點值:循環的計數終點值。

  • 步長:每次循環的步長,一般爲1,也可以是其他整數。

6.3 用法

可自行設置循環的變量名稱,並確定循環的開始和終止以及循環方向,最後一個數字可以爲負數。

6.4 範例

將連接在3號引腳的燈製作成呼吸燈,每一次亮度變化之間間隔50毫秒

 

注意

for循環中定義的變量有名字,可以用字母i,j,k或單詞red,state等有意義的詞語表示。

7.跳出循環

 

7.1 描述

跳出循環用於終止一段重複的程序,一般使用時作爲條件語句的執行部分,當循環中的變量滿足某個條件時,執行跳出循環語句。

跳出循環在處理循環中的特殊情況時十分有用。

7.2 參數

  • 操作:可以選擇跳出循環和跳到下一個循環兩種操作,結果不同。

7.3 範例

引腳3上的數字從0到255逐一增加,每一次增加之間間隔50毫秒,當數字增加到150時停止增加

 

注意

注意跳到下一個循環的使用,可以方便的將循環中不需要的步驟跳過。

8.系統運行時間

 

8.1 描述

返回自硬件啓動或重啓以來的時間值。

8.2 返回

自硬件啓動或重啓以來的時間,毫秒數或者微秒數。

8.3 範例

自動換行打印系統運行時間

 

9.MsTimer2 定時器

 

9.1 描述

每隔設置的毫秒數執行相應的程序

9.2 範例

利用定時器控制13號引腳LED每隔1秒亮滅一次。

 

注意

利用定時器可以提高硬件的工作效率。

但在一個程序中只能使用一個MsTimer2定時器,如果要實現多個時間的定時,可以配合變量計數來完成。

10.MsTimer2 定時器啓動

 

10.1 描述

MsTimer2定時器開始計時

11.MsTimer2 定時器停止

 

11.1 描述

MsTimer2定時器停止計時

12.簡單定時器

 

12.1 描述

設置不同的簡單定時器,每隔指定秒數執行相應的程序常用於多任務處理。

12.2 範例

D12,D13分別連接LED燈,每隔200ms,D12引腳LED燈切換亮滅; 每隔300ms,D13引腳LED燈切換亮滅;

 

13.允許中斷

 

13.1 描述

允許輸入/輸出模塊中管腳中斷的運行

13.2 範例

使用按鈕模擬開關,每次按下,LED燈切換亮滅

 

14.禁止中斷

 

14.1 描述

禁止輸入/輸出模塊中管腳中斷的運行

14.2 範例

在允許中斷範例的基礎上,嘗試禁止中斷

 

15.SCoop Task

 

15.1 描述

SCoop模塊用於執行多線程任務,最多支持8個任務。

15.2 範例

利用SCoop,控制13號引腳LED燈以2秒的頻率閃爍,同時控制12號引腳的LED燈以200毫秒的頻率閃爍。

微信關注圖中張十三的博客公衆號,與張十三一起探討更多mixly開發問題:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章