玩轉Mixly – 2、Arduino AVR編程 之 輸入輸出

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

https://mixly.readthedocs.io/zh_CN/latest/Arduino/AVR/01Input-Output.html

 

輸入/輸出

輸入/輸出所包含的指令主要分爲四部分:控制管腳的輸入輸出(按信號類型可分爲數字信號和模擬信號)、中斷、脈衝長度及ShiftOut。

  • 輸入輸出:數字輸入、數字輸出、模擬輸入、模擬輸出

  • 中斷控制:定義中斷,取消中斷

  • 脈衝長度

  • 移位輸出

1.數字輸出

1

2

digitalWrite(0,HIGH);//輸出高電平

digitalWrite(0,LOW);//輸出低電平

 

 

1.1 描述

給一個數字引腳寫入HIGH或者LOW。

1.2 參數

  • 管腳: 引腳編號(如1,5,10,A0,A3)

  • 值: 高 或 低

1.3 範例

將13號端口設置爲高電平,延遲一秒,然後設置爲低電平,再延遲一秒,如此往復。

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

}

 

 

注意

數字13號引腳難以作爲數字輸入使用,因爲大部分的控制板上使用了一顆LED與一個電阻連接到他。如果啓動了內部的20K上拉電阻,他的電壓將在1.7V左右,而不是正常的5V,因爲板載LED串聯的電阻把他使他降了下來,這意味着他返回的值總是LOW。如果必須使用數字13號引腳的輸入模式,需要使用外部上拉下拉電阻。

注意

模擬引腳也可以當做數字引腳使用,使用方法是管腳設置爲A0,A1,A2等。

2.數字輸入

1

digitalRead(0);

 

 

2.1 描述

讀取指定引腳的值,HIGH或LOW。

2.2 參數

  • 管腳: 引腳編號(如1,5,10,A0,A3)

2.3 返回

HIGH 或 LOW

2.4 範例

讀取數字0號引腳的值,並通過串口打印出來。

1

2

3

4

5

6

7

void setup(){

Serial.begin(9600);

pinMode(0, INPUT);

}

void loop(){

Serial.println(digitalRead(0));

}

 

 

注意

如果引腳懸空,digitalRead()會返回HIGH或LOW(隨機變化)。

3.模擬輸入

1

analogRead(A0);

 

 

3.1 描述

從指定的模擬引腳讀取數據值。

Arduino板包含一個6通道(Mini和Nano有8個通道,Mega有16個通道),10位模擬數字轉換器。這意味着它將0至5伏特之間的輸入電壓映射到0至1023之間的整數值。

3.2 參數

  • 管腳: 引腳編號(如A0,A1,A2,A3)不同的開發板模擬輸入引腳數量不一樣。

3.3 返回

從0到1023的整數值

3.4 範例

讀取模擬A0引腳的值,並通過串口打印出來。

1

2

3

4

5

6

void setup(){

Serial.begin(9600);

}

void loop(){

Serial.println(analogRead(A0));

}

 

 

注意

如果模擬輸入引腳沒有連入電路,由analogRead()返回的值將根據多項因素(例如其他模擬輸入引腳,你的手靠近板子等)產生波動。

4.模擬輸出

1

analogWrite(3,100);

 

 

4.1 描述

從一個引腳輸出模擬值(PWM)。 可用於讓LED以不同的亮度點亮或驅動電機以不同的速度旋轉。

4.2 參數

  • 管腳:引腳編號(如3,5,6,9,10,11)不同的開發板模擬輸入引腳數量不一樣。

  • 賦值:0(完全關閉)到255(完全打開)之間。

4.3 範例

控制LED實現呼吸燈效果。

1

2

3

4

5

6

7

8

9

10

11

12

void setup(){

}

void loop(){

for (int i = 0; i <= 255; i = i + (1)) {

analogWrite(10,i);

delay(10);

}

for (int i = 255; i >= 0; i = i + (-1)) {

analogWrite(10,i);

delay(10);

}

}

 

 

注意

analogWrite函數與模擬引腳、analogRead函數沒有直接關係。 在大多數Arduino板(ATmega168或ATmega328),只有引腳3,5,6,9,10和11可以實現該功能。 在Arduino Mega上,引腳2到13可以實現該功能。

5.中斷指令

1

2

3

4

5

6

7

8

void attachInterrupt_fun_2() {

}

void setup(){

pinMode(2, INPUT);

}

void loop(){

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

}

 

 

5.1 描述

當發生外部中斷時,調用一個指定函數。當中斷髮生時,該函數會取代正在執行的程序。

大多數的Arduino板有兩個外部中斷:0(數字引腳2)和1(數字引腳3)。

Arduino Mege有四個外部中斷:數字2(引腳21),3(20針),4(引腳19),5(引腳18)。

ESP8266 、ESP32系列有更多中斷。

5.2 參數

  • 管腳: 引腳編號(如2,3)不同的開發板中斷引腳不一樣。

  • 模式:

改變:當引腳電平發生改變時,觸發中斷

上升:當引腳由低電平變爲高電平時,觸發中斷

下降:當引腳由高電平變爲低電平時,觸發中斷

5.3 範例

利用2號引腳中斷,控制13號引腳的LED亮滅。

1

2

3

4

5

6

7

8

9

10

11

12

13

volatile boolean state;

void attachInterrupt_fun_2() {

state = !state;

digitalWrite(13,state);

}

void setup(){

state = false;

pinMode(2, INPUT);

pinMode(13, OUTPUT);

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

}

void loop(){

}

 

 

注意

當中斷函數發生時,delay()和millis()的數值將不會繼續變化。當中斷髮生時,串口收到的數據可能會丟失。你應該聲明一個變量來在未發生中斷時儲存變量。

6.取消中斷

1

detachInterrupt(digitalPinToInterrupt(2));

 

 

6.1 描述

關閉給定的中斷。

6.2 參數

  • 管腳: 引腳編號(如2,3)不同的開發板中斷引腳不一樣。

7. 脈衝長度

1

2

pulseIn(0, HIGH);

pulseIn(0, HIGH, 1000000);

 

 

7.1 描述

讀取一個引腳的脈衝(HIGH或LOW)。

例如,如果value是HIGH,pulseIn()會等待引腳變爲HIGH,開始計時,再等待引腳變爲LOW並停止計時。返回脈衝的長度,單位微秒。如果在指定的時間內無脈衝,函數返回。 此函數的計時功能由經驗決定,長時間的脈衝計時可能會出錯。計時範圍從10微秒至3分鐘。(1秒=1000毫秒=1000000微秒)

7.2 參數

  • 管腳:你要進行脈衝計時的引腳號(int)。

  • 狀態:要讀取的脈衝類型,HIGH或LOW(int)。

  • 超時 (可選):指定脈衝計數的等待時間,單位爲微秒,默認值是1秒(unsigned long)。

7.3 返回

脈衝長度(微秒),如果等待超時返回0(unsigned long)

7.4 範例

讀取6號引腳脈衝時長。

1

2

3

4

5

6

7

void setup(){

Serial.begin(9600);

pinMode(6, INPUT);

}

void loop(){

Serial.println(pulseIn(6, HIGH));

}

 

 

8.管腳模式

1

pinMode(0, INPUT);

 

 

8.1 描述

設置指定管腳的模式。

8.2 參數

  • 管腳: 引腳編號(如2,3)不同的開發板中斷引腳不一樣。

  • 模式: 要將管腳設置成的模式,包括輸入、輸出、上拉輸入。

9.ShiftOut

1

2

shiftOut(0,0,MSBFIRST,0);//高位先入

shiftOut(0,0,LSBFIRST,0);//低位先入

 

 

9.1 描述

將一個數據的一個字節一位一位的移出。從最高有效位(最左邊)或最低有效位(最右邊)開始。依次向數據腳寫入每一位,之後時鐘腳被拉高或拉低,指示剛纔的數據有效。

9.2 參數

  • 數據管腳:輸出每一位數據的引腳(int)

  • 時鐘管腳:時鐘腳,當數據管腳有值時此引腳電平變化(int)

  • 順序:輸出位的順序,最高位優先或最低位優先

  • 數值: 要移位輸出的數據(byte)

10.管腳中斷

1

PCintPort::attachInterrupt(0,attachPinInterrupt_fun_0,RISING);

 

 

10.1 描述

當發生外部中斷時,調用一個指定函數。當中斷髮生時,該函數會取代正在執行的程序。

本模塊爲模擬中斷,支持所有管腳使用。

10.2 參數

  • 管腳: 引腳編號(如2,3)不同的開發板中斷引腳不一樣。

  • 模式:

改變:當引腳電平發生改變時,觸發中斷

上升:當引腳由低電平變爲高電平時,觸發中斷

下降:當引腳由高電平變爲低電平時,觸發中斷

10.3 範例

利用中斷,控制13號引腳的LED亮滅。

注意

當中斷函數發生時,delay()和millis()的數值將不會繼續變化。當中斷髮生時,串口收到的數據可能會丟失。你應該聲明一個變量來在未發生中斷時儲存變量。

11.取消管腳中斷

1

detachInterrupt(digitalPinToInterrupt(2));

 

 

11.1 描述

關閉給定的中斷。

11.2 參數

  • 管腳: 引腳編號(如2,3)不同的開發板中斷引腳不一樣。

12.多功能按鍵

1

2

3

4

5

6

7

8

9

OneButton button0(0,true);

void attachClick0() {

}

void setup(){

button0.attachClick(attachClick0);

}

void loop(){

button0.tick();

}

 

 

12.1 描述

設置特定管腳連接的按鈕爲多功能按鈕,並確定不同模式下執行不同的程序。

12.2 參數

  • 多功能按鍵: 引腳編號(如1,5,10,A0,A3)

  • 模式: 單擊 雙擊 長按開始 長按中 長按結束

12.3 範例

將2號端口連接的按鈕設置爲多功能按鈕,單擊時串口提示“one Click”

1

2

3

4

5

6

7

8

9

10

11

OneButton button2(2,true);

void attachClick2() {

Serial.println("one Click");

}

void setup(){

button2.attachClick(attachClick2);

Serial.begin(9600);

}

void loop(){

button2.tick();

}

 

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

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