很多剛接觸Arduino的同學(xué)可能不太清楚Arduino的編程方法和代碼運(yùn)行的流程,所以這一講我簡(jiǎn)單介紹一下。Arduino為了降低編程的難度把很多常用的函數(shù)都做了封裝,很多常用的一些傳感器和外設(shè)也有相關(guān)的類庫(kù),而且除了官方的庫(kù),也有很多第三方的庫(kù)可用,開發(fā)者只需要根據(jù)自己的實(shí)際需要添加庫(kù)調(diào)用API即可,這對(duì)于項(xiàng)目初期驗(yàn)證方案來(lái)說(shuō)很方便。
一、Arduino項(xiàng)目最基本的函數(shù)
不管是什么程序,都會(huì)有一個(gè)程序的入口,比如傳統(tǒng)C/C++程序,它的入口就是main函數(shù),但是在Arduino項(xiàng)目中我們并沒有看到這個(gè)函數(shù),那Arduino的程序是從哪里開始運(yùn)行的呢?
實(shí)際上Arduino的程序入口也是main函數(shù),只不過(guò)它是封裝在Arduino核心庫(kù)中的,我們看不到而已,為了簡(jiǎn)化開發(fā)的流程,Arduino只給出了setup() 函數(shù)和loop()函數(shù),而這兩個(gè)函數(shù)實(shí)際上是在main函數(shù)里面被調(diào)用執(zhí)行的。下面我們來(lái)具體講解一下這兩個(gè)函數(shù)的作用。
1、setup() 函數(shù)
Arduino控制器通電或復(fù)位后,即會(huì)開始執(zhí)行setup() 函數(shù)中的程序,該部分只會(huì)執(zhí)行一次。
通常我們會(huì)在setup() 函數(shù)中完成Arduino的初始化設(shè)置,如配置I/O口狀態(tài),初始化串口等操作。
2、loop()函數(shù)
在setup() 函數(shù)中的程序執(zhí)行完后,Arduino會(huì)接著執(zhí)行l(wèi)oop() 函數(shù)中的程序。而loop()函數(shù)是一個(gè)死循環(huán),其中的程序會(huì)不斷的重復(fù)運(yùn)行。
通常我們會(huì)在loop() 函數(shù)中完成程序的主要功能,如驅(qū)動(dòng)各種模塊,采集數(shù)據(jù)等。
二、Arduino常用的功能函數(shù)
1、GPIO
1)在使用輸入或輸出功能前,需要先通過(guò)pinMode() 函數(shù)配置引腳的模式為輸入模式或輸出模式。
pinMode(pin, mode)
參數(shù) | 說(shuō)明 |
---|---|
pin | 指定配置的引腳編號(hào) |
mode | 指定的配置模式。通常可用模式有三種, INPUT:輸入模式,OUTPUT:輸出模式,INPUT_PULLUP :輸入上拉模式 |
2)讓某個(gè)引腳輸出高電平或者是低電平。
digitalWrite(pin, value)
參數(shù) | 說(shuō)明 |
---|---|
pin | 指定配置的引腳編號(hào) |
value | 指定輸出的電平。HIGH:輸出高電平,LOW:輸出低電平 |
3)讀取某個(gè)引腳的電平狀態(tài),返回值為獲取到的信號(hào)狀態(tài),1為高電平,0為低電平。
digitalRead(pin)
參數(shù) | 說(shuō)明 |
---|---|
pin | 指定配置的引腳編號(hào) |
2、外部中斷
1)對(duì)中斷引腳進(jìn)行初始化配置,以開啟Arduino的外部中斷功能。
attachInterrupt(pin, ISR, mode)
參數(shù) | 說(shuō)明 |
---|---|
pin | 指定配置的引腳編號(hào) |
ISR | 中斷服務(wù)函數(shù)名,該函數(shù)由用戶自己定義 |
mode | 中斷模式,HIGH:上升沿觸發(fā)、LOW:下降沿觸發(fā) |
示例:
attachInterrupt(2, Hello, LOW); 該語(yǔ)句會(huì)開啟Arduino Uno的 2號(hào)引腳(中斷編號(hào)0)的外部中斷功能,并指定下降沿時(shí)觸發(fā)該中斷。Hello() 函數(shù)是自己定義的一個(gè)函數(shù),函數(shù)里面執(zhí)行什么也是根據(jù)自己的需要來(lái)寫。
當(dāng)2號(hào)引腳上電平由高變低后,該中斷會(huì)被觸發(fā),Arduino即會(huì)運(yùn)行Hello() 函數(shù)中的語(yǔ)句。
2)中斷分離函數(shù),可以對(duì)已經(jīng)配置了中斷的引腳關(guān)閉中斷功能。
detachInterrupt(pin)
參數(shù) | 說(shuō)明 |
---|---|
pin | 指定配置的引腳編號(hào) |
3、時(shí)鐘相關(guān)
1)獲取Arduino通電后(或復(fù)位后)到現(xiàn)在的時(shí)間。返回值為系統(tǒng)運(yùn)行時(shí)間,單位毫秒ms。
millis()
2)獲取Arduino通電后(或復(fù)位后)到現(xiàn)在的時(shí)間。返回值為系統(tǒng)運(yùn)行時(shí)間,單位微秒us。
micros()
3)毫秒級(jí)延時(shí)。
delay(ms)
參數(shù) | 說(shuō)明 |
---|---|
ms | 延時(shí)時(shí)間,類型unsigned long |
4)微秒級(jí)延時(shí)。
delayMicroseconds(us)
參數(shù) | 說(shuō)明 |
---|---|
us | 延時(shí)時(shí)間,類型unsigned int |
4、串口
1)使用串口與計(jì)算機(jī)通信,需要先使用Serial.begin() 初始化Arduino的串口通信功能。
Serial.begin(speed, config)
參數(shù) | 說(shuō)明 |
---|---|
speed | 串口通信波特率,常用波特率:300、600、1200、2400、4800、9600、14400、19200、28800、38400、57600、115200 |
config | 數(shù)據(jù)位、校驗(yàn)位、停止位配置(也可以不配置) |
config可選配置 | 數(shù)據(jù)位 | 校驗(yàn)位 | 停止位 |
---|---|---|---|
SERIAL_5N1 | 5 | 無(wú) | 1 |
SERIAL_6N1 | 6 | 無(wú) | 1 |
SERIAL_7N1 | 7 | 無(wú) | 1 |
SERIAL_8N1(默認(rèn)配置) | 8 | 無(wú) | 1 |
SERIAL_5N2 | 5 | 無(wú) | 2 |
SERIAL_6N2 | 6 | 無(wú) | 2 |
SERIAL_7N2 | 7 | 無(wú) | 2 |
SERIAL_8N2 | 8 | 無(wú) | 2 |
SERIAL_5E1 | 5 | 偶 | 1 |
SERIAL_6E1 | 6 | 偶 | 1 |
SERIAL_7E1 | 7 | 偶 | 1 |
SERIAL_8E1 | 8 | 偶 | 1 |
SERIAL_5E2 | 5 | 偶 | 2 |
SERIAL_6E2 | 6 | 偶 | 2 |
SERIAL_7E2 | 7 | 偶 | 2 |
SERIAL_8E2 | 8 | 偶 | 2 |
SERIAL_5O1 | 5 | 奇 | 1 |
SERIAL_6O1 | 6 | 奇 | 1 |
SERIAL_7O1 | 7 | 奇 | 1 |
SERIAL_8O1 | 8 | 奇 | 1 |
SERIAL_5O2 | 5 | 奇 | 2 |
SERIAL_6O2 | 6 | 奇 | 2 |
SERIAL_7O2 | 7 | 奇 | 2 |
SERIAL_8O2 | 8 | 奇 | 2 |
例如:Serial.begin(9600, SERIAL_8E2) 是將串口波特率設(shè)為9600,數(shù)據(jù)位8,偶校驗(yàn),停止位2。
提示:Serial.begin函數(shù)也可以只配置波特率,如:Serial.begin(9600)
2)串口打印輸出。
Serial.print(val)
參數(shù) | 說(shuō)明 |
---|---|
val | 要輸出的數(shù)據(jù),各種類型的數(shù)據(jù)均可 |
3)在輸出完指定數(shù)據(jù)后,再輸出一組回車換行符。
Serial.println(val)
參數(shù) | 說(shuō)明 |
---|---|
val | 要輸出的數(shù)據(jù),各種類型的數(shù)據(jù)均可 |
4)接收串口數(shù)據(jù)。調(diào)用該語(yǔ)句,每次都會(huì)返回一個(gè)字節(jié)的數(shù)據(jù),這個(gè)返回值便是當(dāng)前串口讀取到的數(shù)據(jù)。
Serial.read()
提示:以上幾個(gè)是串口最常用最基礎(chǔ)的函數(shù),還有很多函數(shù)和用法這里沒有介紹,感興趣的同學(xué)可以自己去查閱。
5、PWM
1)PWM輸出功能。
在Arduino Uno中,提供PWM功能的引腳為3、5、6、9、10、11。
analogWrite(pin,value)
參數(shù) | 說(shuō)明 |
---|---|
pin | 要讀取模擬值的引腳,被指定的引腳必須是模擬輸入引腳 |
value | PWM的脈沖寬度,范圍為0~255 |
提示:在analogWrite() 函數(shù)內(nèi)部,已經(jīng)完成了引腳的初始化,因此不用在Setup() 函數(shù)中進(jìn)行初始化操作。
6、ADC
1)ADC輸入功能。
模擬輸入引腳是帶有ADC(Analog-to-Digital Converter,模數(shù)轉(zhuǎn)換器)功能的引腳。它可以將外部輸入的模擬信號(hào)轉(zhuǎn)換為芯片運(yùn)算時(shí)可以識(shí)別的數(shù)字信號(hào),從而實(shí)現(xiàn)讀入模擬值的功能。
Arduino Uno模擬輸入功能有10位精度,即可以將0~5V的電壓信號(hào)轉(zhuǎn)換為0~1023的整數(shù)形式表示。
analogRead(pin)
參數(shù) | 說(shuō)明 |
---|---|
pin | 要讀取模擬值的引腳,被指定的引腳必須是模擬輸入引腳 |
提示:在analogRead() 函數(shù)內(nèi)部,已經(jīng)完成了引腳的初始化,因此不用在Setup() 函數(shù)中進(jìn)行初始化操作。
示例:analogRead(A0),即是讀取A0引腳上的模擬值。
三、結(jié)束語(yǔ)
好了,關(guān)于Arduino編程基礎(chǔ)的介紹就講到這里,常用的函數(shù)我這里只是列舉了一部分,需要用到其他函數(shù)的話你們自行查閱。如果還有什么問(wèn)題,歡迎在評(píng)論區(qū)留言。如果這篇文章能夠幫到你,就給我點(diǎn)個(gè)贊吧,如果想了解更多Arduino的內(nèi)容,可以關(guān)注一下博主,后續(xù)我還會(huì)繼續(xù)分享更多的經(jīng)驗(yàn)給大家。