以下內容源自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開發問題: