玩转Mixly – 2、Arduino AVR编程 之 输入输出
以下內(nèi)容源自Mixly官方技術(shù)文檔:
https://mixly.readthedocs.io/zh_CN/latest/Arduino/AVR/01Input-Output.html
?
輸入/輸出
輸入/輸出所包含的指令主要分為四部分:控制管腳的輸入輸出(按信號類型可分為數(shù)字信號和模擬信號)、中斷、脈沖長度及ShiftOut。
-
輸入輸出:數(shù)字輸入、數(shù)字輸出、模擬輸入、模擬輸出
-
中斷控制:定義中斷,取消中斷
-
脈沖長度
-
移位輸出
1.數(shù)字輸出
| 1 2 | digitalWrite(0,HIGH);//輸出高電平 digitalWrite(0,LOW);//輸出低電平 ? |
?
1.1 描述
給一個數(shù)字引腳寫入HIGH或者LOW。
1.2 參數(shù)
-
管腳: 引腳編號(如1,5,10,A0,A3)
-
值: 高 或 低
1.3 范例
將13號端口設(shè)置為高電平,延遲一秒,然后設(shè)置為低電平,再延遲一秒,如此往復(fù)。
| 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); } ? |
?
注意
數(shù)字13號引腳難以作為數(shù)字輸入使用,因為大部分的控制板上使用了一顆LED與一個電阻連接到他。如果啟動了內(nèi)部的20K上拉電阻,他的電壓將在1.7V左右,而不是正常的5V,因為板載LED串聯(lián)的電阻把他使他降了下來,這意味著他返回的值總是LOW。如果必須使用數(shù)字13號引腳的輸入模式,需要使用外部上拉下拉電阻。
注意
模擬引腳也可以當(dāng)做數(shù)字引腳使用,使用方法是管腳設(shè)置為A0,A1,A2等。
2.數(shù)字輸入
| 1 | digitalRead(0); ? |
?
2.1 描述
讀取指定引腳的值,HIGH或LOW。
2.2 參數(shù)
-
管腳: 引腳編號(如1,5,10,A0,A3)
2.3 返回
HIGH 或 LOW
2.4 范例
讀取數(shù)字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 描述
從指定的模擬引腳讀取數(shù)據(jù)值。
Arduino板包含一個6通道(Mini和Nano有8個通道,Mega有16個通道),10位模擬數(shù)字轉(zhuǎn)換器。這意味著它將0至5伏特之間的輸入電壓映射到0至1023之間的整數(shù)值。
3.2 參數(shù)
-
管腳: 引腳編號(如A0,A1,A2,A3)不同的開發(fā)板模擬輸入引腳數(shù)量不一樣。
3.3 返回
從0到1023的整數(shù)值
3.4 范例
讀取模擬A0引腳的值,并通過串口打印出來。
| 1 2 3 4 5 6 | void setup(){ Serial.begin(9600); } void loop(){ Serial.println(analogRead(A0)); } ? |
?
注意
如果模擬輸入引腳沒有連入電路,由analogRead()返回的值將根據(jù)多項因素(例如其他模擬輸入引腳,你的手靠近板子等)產(chǎn)生波動。
4.模擬輸出
| 1 | analogWrite(3,100); ? |
?
4.1 描述
從一個引腳輸出模擬值(PWM)。 可用于讓LED以不同的亮度點亮或驅(qū)動電機以不同的速度旋轉(zhuǎn)。
4.2 參數(shù)
-
管腳:引腳編號(如3,5,6,9,10,11)不同的開發(fā)板模擬輸入引腳數(shù)量不一樣。
-
賦值:0(完全關(guān)閉)到255(完全打開)之間。
4.3 范例
控制LED實現(xiàn)呼吸燈效果。
| 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函數(shù)與模擬引腳、analogRead函數(shù)沒有直接關(guān)系。 在大多數(shù)Arduino板(ATmega168或ATmega328),只有引腳3,5,6,9,10和11可以實現(xiàn)該功能。 在Arduino Mega上,引腳2到13可以實現(xiàn)該功能。
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 描述
當(dāng)發(fā)生外部中斷時,調(diào)用一個指定函數(shù)。當(dāng)中斷發(fā)生時,該函數(shù)會取代正在執(zhí)行的程序。
大多數(shù)的Arduino板有兩個外部中斷:0(數(shù)字引腳2)和1(數(shù)字引腳3)。
Arduino Mege有四個外部中斷:數(shù)字2(引腳21),3(20針),4(引腳19),5(引腳18)。
ESP8266 、ESP32系列有更多中斷。
5.2 參數(shù)
-
管腳: 引腳編號(如2,3)不同的開發(fā)板中斷引腳不一樣。
-
模式:
改變:當(dāng)引腳電平發(fā)生改變時,觸發(fā)中斷
上升:當(dāng)引腳由低電平變?yōu)楦唠娖綍r,觸發(fā)中斷
下降:當(dāng)引腳由高電平變?yōu)榈碗娖綍r,觸發(fā)中斷
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(){ } ? |
?
注意
當(dāng)中斷函數(shù)發(fā)生時,delay()和millis()的數(shù)值將不會繼續(xù)變化。當(dāng)中斷發(fā)生時,串口收到的數(shù)據(jù)可能會丟失。你應(yīng)該聲明一個變量來在未發(fā)生中斷時儲存變量。
6.取消中斷
| 1 | detachInterrupt(digitalPinToInterrupt(2)); ? |
?
6.1 描述
關(guān)閉給定的中斷。
6.2 參數(shù)
-
管腳: 引腳編號(如2,3)不同的開發(fā)板中斷引腳不一樣。
7. 脈沖長度
| 1 2 | pulseIn(0, HIGH); pulseIn(0, HIGH, 1000000); ? |
?
7.1 描述
讀取一個引腳的脈沖(HIGH或LOW)。
例如,如果value是HIGH,pulseIn()會等待引腳變?yōu)镠IGH,開始計時,再等待引腳變?yōu)長OW并停止計時。返回脈沖的長度,單位微秒。如果在指定的時間內(nèi)無脈沖,函數(shù)返回。 此函數(shù)的計時功能由經(jīng)驗決定,長時間的脈沖計時可能會出錯。計時范圍從10微秒至3分鐘。(1秒=1000毫秒=1000000微秒)
7.2 參數(shù)
-
管腳:你要進行脈沖計時的引腳號(int)。
-
狀態(tài):要讀取的脈沖類型,HIGH或LOW(int)。
-
超時 (可選):指定脈沖計數(shù)的等待時間,單位為微秒,默認(rèn)值是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 描述
設(shè)置指定管腳的模式。
8.2 參數(shù)
-
管腳: 引腳編號(如2,3)不同的開發(fā)板中斷引腳不一樣。
-
模式: 要將管腳設(shè)置成的模式,包括輸入、輸出、上拉輸入。
9.ShiftOut
| 1 2 | shiftOut(0,0,MSBFIRST,0);//高位先入 shiftOut(0,0,LSBFIRST,0);//低位先入 ? |
?
9.1 描述
將一個數(shù)據(jù)的一個字節(jié)一位一位的移出。從最高有效位(最左邊)或最低有效位(最右邊)開始。依次向數(shù)據(jù)腳寫入每一位,之后時鐘腳被拉高或拉低,指示剛才的數(shù)據(jù)有效。
9.2 參數(shù)
-
數(shù)據(jù)管腳:輸出每一位數(shù)據(jù)的引腳(int)
-
時鐘管腳:時鐘腳,當(dāng)數(shù)據(jù)管腳有值時此引腳電平變化(int)
-
順序:輸出位的順序,最高位優(yōu)先或最低位優(yōu)先
-
數(shù)值: 要移位輸出的數(shù)據(jù)(byte)
10.管腳中斷
| 1 | PCintPort::attachInterrupt(0,attachPinInterrupt_fun_0,RISING); ? |
?
10.1 描述
當(dāng)發(fā)生外部中斷時,調(diào)用一個指定函數(shù)。當(dāng)中斷發(fā)生時,該函數(shù)會取代正在執(zhí)行的程序。
本模塊為模擬中斷,支持所有管腳使用。
10.2 參數(shù)
-
管腳: 引腳編號(如2,3)不同的開發(fā)板中斷引腳不一樣。
-
模式:
改變:當(dāng)引腳電平發(fā)生改變時,觸發(fā)中斷
上升:當(dāng)引腳由低電平變?yōu)楦唠娖綍r,觸發(fā)中斷
下降:當(dāng)引腳由高電平變?yōu)榈碗娖綍r,觸發(fā)中斷
10.3 范例
利用中斷,控制13號引腳的LED亮滅。
注意
當(dāng)中斷函數(shù)發(fā)生時,delay()和millis()的數(shù)值將不會繼續(xù)變化。當(dāng)中斷發(fā)生時,串口收到的數(shù)據(jù)可能會丟失。你應(yīng)該聲明一個變量來在未發(fā)生中斷時儲存變量。
11.取消管腳中斷
| 1 | detachInterrupt(digitalPinToInterrupt(2)); ? |
?
11.1 描述
關(guān)閉給定的中斷。
11.2 參數(shù)
-
管腳: 引腳編號(如2,3)不同的開發(fā)板中斷引腳不一樣。
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 描述
設(shè)置特定管腳連接的按鈕為多功能按鈕,并確定不同模式下執(zhí)行不同的程序。
12.2 參數(shù)
-
多功能按鍵: 引腳編號(如1,5,10,A0,A3)
-
模式: 單擊 雙擊 長按開始 長按中 長按結(jié)束
12.3 范例
將2號端口連接的按鈕設(shè)置為多功能按鈕,單擊時串口提示“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(); } ? |
微信關(guān)注圖中張十三的博客公眾號,與張十三一起探討更多mixly開發(fā)問題:
總結(jié)
以上是生活随笔為你收集整理的玩转Mixly – 2、Arduino AVR编程 之 输入输出的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab从图表中提取数据
- 下一篇: 玩转Mixly – 3、Arduino