本系列文章為作者原創(chuàng),未經(jīng)作者書面同意,不得轉(zhuǎn)載!
幾乎所有的編程學(xué)習(xí)都是從“hello,world”程序開始的,這幾乎已經(jīng)成為學(xué)習(xí)編程的一個(gè)傳統(tǒng),既然本系列文章的標(biāo)題是《Arduino項(xiàng)目實(shí)戰(zhàn):從點(diǎn)亮Led到物聯(lián)網(wǎng)》,那么我們還是從點(diǎn)亮Led來(lái)開始我們的Arduino項(xiàng)目實(shí)戰(zhàn)之旅。
作為本系列的第一個(gè)項(xiàng)目,其實(shí)實(shí)現(xiàn)起來(lái)非常的簡(jiǎn)單,您幾乎不用設(shè)計(jì)任何電路和做任何的連線,甚至都不需要編寫任何代碼,可以直接從Arduino IDE的示例代碼中找到一個(gè)例程,然后完成程序的上傳即可。
但本文對(duì)于初學(xué)者來(lái)說(shuō)非常重要,它會(huì)告訴你怎么通過(guò)數(shù)據(jù)線連接Arduino電路板、Arduino程序的基本結(jié)構(gòu)、怎么上傳程序到Arduino電路板,還有幾個(gè)重要的函數(shù),也許是Arduino中最常用的函數(shù)。所以如果你是一個(gè)初學(xué)者,請(qǐng)跟著本文完成您的第一個(gè)項(xiàng)目。
1 項(xiàng)目介紹
點(diǎn)亮LED燈,并讓LED燈閃動(dòng)。
在這個(gè)項(xiàng)目中,我們先不用自己準(zhǔn)備LED燈,我們先使用Arduino UNO電路板上面集成的LED燈,如下圖紅箭頭所示的位置。

在Arduino系列的電路板上,有不少型號(hào)都集成了一個(gè)可控制的LED燈,但是它們的引腳PIN并不完全相同,Ardunio Uno, MEGA, ZERO是PIN13,而Ardunio MKR1000是PIN6。本文使用的是UNO電路板,如果您手上的電路板不是UNO,還請(qǐng)確認(rèn)一下它是否集成有可控LED,然后它的引腳是哪一個(gè)。
2 所需元器件
| 元器件 | 型號(hào) | 數(shù)量 | 備注 |
|---|---|---|---|
| 主控板 | arduino Uno | 1 | |
| 數(shù)據(jù)線 | Uno數(shù)據(jù)線 | 1 |
3 設(shè)備連接
您只需要將Arduino UNO電路板通過(guò)數(shù)據(jù)線跟電腦的USB口連接即可,如下圖所示,數(shù)據(jù)線一端插入U(xiǎn)NO電路板的數(shù)據(jù)接口,另一端插入電腦USB接口。

當(dāng)UNO電路板跟電腦連接上后,如果您使用的是WIN10操作系統(tǒng),電腦會(huì)自動(dòng)安裝USB轉(zhuǎn)串口驅(qū)動(dòng)程序。Arduino電路板是通過(guò)串口跟電腦進(jìn)行通信的,目前大部分的電腦都不再配備串口,老式的電腦會(huì)有,串口是長(zhǎng)這個(gè)樣子的:

現(xiàn)在的個(gè)人電腦一般不會(huì)配置串口(如果它不是上個(gè)世紀(jì)購(gòu)買的話),所以我們使用USB口跟Arduino電路板進(jìn)行通信,這時(shí)候我們就需要實(shí)現(xiàn)USB口跟串口的轉(zhuǎn)換,Arduino電路板上都集成了USB轉(zhuǎn)串口的芯片,我們只需要安裝驅(qū)動(dòng)即可。如果您的電腦安裝驅(qū)動(dòng)成功,在電腦的設(shè)備管理(鼠標(biāo)點(diǎn)擊電腦桌面“我的電腦”-點(diǎn)擊鼠標(biāo)右鍵-在彈出菜單中選擇“管理”)中會(huì)看到USB串行設(shè)備,如下圖所示:

如果您的電腦沒有自動(dòng)安裝驅(qū)動(dòng),您可能需要手動(dòng)安裝一下。詳情請(qǐng)見附錄《Arduino電路板USB轉(zhuǎn)串口驅(qū)動(dòng)安裝方法》鏈接地址
4 程序代碼
前面介紹過(guò),我們的第一個(gè)項(xiàng)目并不需要您敲任何代碼,在Arduino IDE的文件菜單---示例---01. Basics---Blink,打開Blink文件,如下圖所示:

下面是Blink程序的代碼:
/*
Blink
Turns an LED on for one second, then off for one second, repeatedly.
Most Arduinos have an on-board LED you can control. On the UNO, MEGA and ZERO
it is attached to digital pin 13, on MKR1000 on pin 6. LED_BUILTIN is set to
the correct LED pin independent of which board is used.
If you want to know what pin the on-board LED is connected to on your Arduino
model, check the Technical Specs of your board at:
https://www.arduino.cc/en/Main/Products
modified 8 May 2014
by Scott Fitzgerald
modified 2 Sep 2016
by Arturo Guadalupi
modified 8 Sep 2016
by Colby Newman
This example code is in the public domain.
http://www.arduino.cc/en/Tutorial/Blink
*/
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
在上面的程序中,我們發(fā)現(xiàn)其實(shí)大部分內(nèi)容都被“ /* ”和“ */ ”包裹,這部分內(nèi)容是程序中的注釋,注釋并不是程序的一部分,在程序編譯時(shí),這部分內(nèi)容會(huì)被編譯器忽略,注釋的目的是解釋某一小段或者某一行代碼的功能,便于今后自己或者別人讀到這段代碼時(shí)能夠很快的理解。
在Arduino程序中,有兩種形式的注釋:
- 單行注釋:以 // 開始,直到行末為止;
- 多行注釋:以 /* 開始,以 */ 終止。
所以我們?nèi)サ羯厦娲a中注釋的部分,程序如下:
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
}
是不是看起來(lái)清爽了許多,不過(guò)如果你不熟悉Arduino編程的話,這段代碼看起來(lái)就不知所云了,帶注釋的代碼看起來(lái)冗余,但我們大體能夠讀明白程序的功能。好吧,下面我們對(duì)上面的程序做一個(gè)解釋。
4.1 程序結(jié)構(gòu)
Arduino程序結(jié)構(gòu)主要包含兩部分:setup()函數(shù)和loop()函數(shù)。
setup()函數(shù)
Arduino程序啟動(dòng)時(shí)會(huì)調(diào)用 setup()函數(shù)。在程序中一般使用它來(lái)初始化變量,引腳模式,啟用庫(kù)等。setup函數(shù)只能在Arduino電路板每次上電或復(fù)位后運(yùn)行一次。
loop()函數(shù)
loop() 函數(shù),正如它的函數(shù)名稱所指,這個(gè)函數(shù)會(huì)在Arduino上電或者復(fù)位并調(diào)用完setup()函數(shù)后連續(xù)循環(huán)的調(diào)用執(zhí)行。loop()函數(shù)是Arduino程序的主體,允許你的程序連續(xù)循環(huán)的獲得外部輸入、進(jìn)行程序處理和向外輸出。這句話您目前理解起來(lái)也許有點(diǎn)費(fèi)勁,沒關(guān)系,我們可以暫時(shí)放一放,隨著學(xué)習(xí)的深入,您慢慢就會(huì)理解,現(xiàn)在您需要了解的是:loop()函數(shù)中的語(yǔ)句,會(huì)被Arduino電路板一遍又一遍的從頭到尾的反復(fù)執(zhí)行,直到Arduino電路板復(fù)位或者掉電關(guān)閉。
4.2 代碼講解
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
setup()函數(shù)中就一條語(yǔ)句:
pinMode(LED_BUILTIN, OUTPUT);
這條語(yǔ)句的作用是告訴Arduino主控板將LED_BUILTIN(這是一個(gè)宏,在Arduino的核心庫(kù)文件“pins_arduino.h”中已經(jīng)定義,它代表13)引腳,即13引腳,設(shè)置為輸出模式。
請(qǐng)注意Arduino的語(yǔ)法規(guī)則,每條語(yǔ)句都必須以分號(hào)結(jié)束,必須是英文字符的分號(hào)";",請(qǐng)一定跟中文字符的分號(hào)“;”區(qū)分開,請(qǐng)?jiān)谟⑽妮斎敕ㄏ逻M(jìn)行輸入,否則程序編譯時(shí)會(huì)出錯(cuò)。
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
}
loop()函數(shù)中有四條語(yǔ)句:
digitalWrite(LED_BUILTIN, HIGH);
這條語(yǔ)句的作用是向第13引腳寫入HIGH值,由于該引腳已在setup()函數(shù)中通過(guò)pinMode()配置為OUTPUT,其電壓將被設(shè)置為相應(yīng)的值:HIGH為5V,LOW為0V(接地),這條語(yǔ)句執(zhí)行后,13引腳的電壓將設(shè)置為5V。
由于UNO板載LED燈的正極接著13引腳,負(fù)極接著GND(0V),根據(jù)電路原理,當(dāng)13引腳的電壓為5V時(shí),LED燈將被點(diǎn)亮。
delay(1000);
這條語(yǔ)句的作用是告訴Arduino電路板,在執(zhí)行下一條語(yǔ)句之前先等待1000毫秒(1秒等于1000毫秒)。
digitalWrite(LED_BUILTIN, LOW);
這條語(yǔ)句的作用是向第13引腳寫入LOW值,其電壓將被設(shè)置為0V,根據(jù)前面的說(shuō)明,如果13引腳電壓為0V,板載LED燈將熄滅。
delay(1000);
這條語(yǔ)句的作用是告訴Arduino電路板,在執(zhí)行下一條語(yǔ)句之前再等待1000毫秒。
由于這是loop()函數(shù),所以Arduino在執(zhí)行完第四條語(yǔ)句后,又開始重復(fù)執(zhí)行l(wèi)oop()函數(shù)的第一條語(yǔ)句,如此反復(fù)。
這個(gè)時(shí)候,我們?cè)賮?lái)一條一條的回顧這段代碼:
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
}
您是不是覺得它已經(jīng)變得非常簡(jiǎn)單,它所實(shí)現(xiàn)的功能也非常清晰了,那就是:讓板載LED燈按照亮一秒、熄一秒的頻率閃爍。
5 執(zhí)行效果
當(dāng)您完成上面的一切,您是不是有點(diǎn)迫不及待的想上傳程序到Arduino電路板上看看程序的執(zhí)行效果了?好吧,開始上傳吧,按照本文之前介紹的,先確認(rèn)電路板跟電腦的連接,如果沒問(wèn)題,選擇好COM通信端口,點(diǎn)擊“上傳”按鈕。
當(dāng)程序上傳成功后,Arduino電路板會(huì)自動(dòng)重啟,如果一切正常,您會(huì)看到UNO的板載LED開始按照1秒1次的頻率閃爍了。
恭喜您,您的第一個(gè)Arduino項(xiàng)目完成了,雖然簡(jiǎn)單,但是意義非凡。您已經(jīng)推開了一扇窗,一扇從虛擬的軟件世界到真實(shí)的物理世界的窗戶,窗戶那一側(cè)的世界無(wú)疑非常精彩,等待著您一起來(lái)探索!
如果您喜歡本文,您可以點(diǎn)擊一下下面的喜歡按鈕,您也可以關(guān)注我,謝謝您的支持!