Arduino應(yīng)用技術(shù) 課件全 黃凌 第1-5講 初識arduino - 物聯(lián)網(wǎng)服務(wù)平臺_第1頁
Arduino應(yīng)用技術(shù) 課件全 黃凌 第1-5講 初識arduino - 物聯(lián)網(wǎng)服務(wù)平臺_第2頁
Arduino應(yīng)用技術(shù) 課件全 黃凌 第1-5講 初識arduino - 物聯(lián)網(wǎng)服務(wù)平臺_第3頁
Arduino應(yīng)用技術(shù) 課件全 黃凌 第1-5講 初識arduino - 物聯(lián)網(wǎng)服務(wù)平臺_第4頁
Arduino應(yīng)用技術(shù) 課件全 黃凌 第1-5講 初識arduino - 物聯(lián)網(wǎng)服務(wù)平臺_第5頁
已閱讀5頁,還剩292頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第一講初識ArduinoARDUINO簡介Arduino是源自意大利的一個(gè)開源代碼的硬件項(xiàng)目平臺,該平臺包括一塊具有簡單I/O功能的電路以及一套程序開發(fā)環(huán)境軟件。Arduino可以用來開發(fā)交互產(chǎn)品,比如它可以讀取大量的開關(guān)和傳感器信號,并可以控制電燈、電機(jī)和其他各式各樣的物理設(shè)備;Arduino也可以開發(fā)出與PC相連的周邊裝置,能在運(yùn)行時(shí)與PC上的軟件進(jìn)行通信。Arduino的硬件電路板可以自行焊接組裝,也可以購買已經(jīng)組裝好的模塊,而程序開發(fā)環(huán)境的軟件則可以從網(wǎng)上免費(fèi)下載與使用。ARDUINO的歷史講述人口頭介紹或略讀《Arduino開發(fā)實(shí)戰(zhàn)指南》,第一章,1.1小結(jié)Arduino的家族這是一款基本的Arduino產(chǎn)品,控制器采用Atmega168或Atmega328,支持直流電源供電和USB口供電,如圖所示。后續(xù)很多產(chǎn)品都是這款產(chǎn)品的基礎(chǔ)上發(fā)展而來的。1.ArduinoDuemilanoveArduinoNano在設(shè)計(jì)中去掉了直流電源接口,采用Mini-B標(biāo)準(zhǔn)的USB接口來連接電腦,除了外觀變了,其他接口及功能保持不變,控制器同樣采用Atmega168或Atmega328,是一款縮小版的ArduinoDuemilanove,如圖所示。2.ArduinoNano考慮到存在一些空間要求十分嚴(yán)格的使用者,Arduinomini在設(shè)計(jì)中甚至去掉了USB接口和復(fù)位開關(guān),這樣能夠減小Arduino的尺寸。唯一的問題是連接電腦或燒寫程序時(shí)需要一個(gè)USB或RS232轉(zhuǎn)換成TTL,Arduino官方也有相應(yīng)的適配座——MiniUSBAdapter。3.ArduinominiArduinoBT本身包含了一個(gè)BluegigaWT11藍(lán)牙模塊,支持藍(lán)牙無線串行通信,但不支持藍(lán)牙音頻設(shè)備。若沒有USB接口,連接電腦或燒寫程序可以通過藍(lán)牙適配器與ArduinoBT連接實(shí)現(xiàn)無線程序下載與控制。4.ArduinoBT這是一款真正有藝術(shù)氣質(zhì)的產(chǎn)品,面向的主要使用者是從事服裝設(shè)計(jì)之類工作的設(shè)計(jì)師,他可以使用導(dǎo)電線和或普通線縫在衣服或不料上,LilyPadArduino每個(gè)引腳上的小東大到足夠縫紉針可以輕松穿過,如圖。如果用導(dǎo)電線縫紉的話,即可以起到固定作用,又可以起到傳導(dǎo)作用。比起普通的Arduino板,LilyPadArduino相對比較脆弱,比較容易損壞,但是他的基本功能都保留了下來,除了一點(diǎn),它沒有USB接口,所以LilyPadArduino連接電腦或燒寫程序時(shí)需要一個(gè)USB或RS232轉(zhuǎn)換成TTL的適配座。5.LilyPadArduino設(shè)計(jì)ArduinoPro的目的是為了那些便利性和低成本的高級用戶。為了降低成本,它省去了USB接口、直流電源接口和引腳排針,連接電腦或燒寫程序時(shí)需要一個(gè)USB或RS232轉(zhuǎn)換成TTL的適配座。ArduinoPro更像是一個(gè)大號的Arduinomini,如圖。需要注意的是,ArduinoPro有3.3V/8MHz和5V/16MHz兩個(gè)版本,使用的時(shí)候要留意。另外ArduinoPro同樣有一個(gè)ArduinoProMini的版本,如圖。6.Arduinopro和ArduinoproMINI7.ArduinofioArduinoFio的工作電壓是3.3V,控制器的工作頻率是8MHz,采用Mini-B標(biāo)準(zhǔn)的USB接口,提供一個(gè)鋰聚合物電池接口,底部預(yù)留一個(gè)Xbee模塊插座,Xbee模塊可使Arduino方便的應(yīng)用于無線網(wǎng)絡(luò)。8.ARDUINOUNOArduinoUno是最新的Arduino產(chǎn)品系列,如圖所示,它與之前的Arduino板最大的區(qū)別在于它不是使用FTDIUSB-to-serial串行驅(qū)動(dòng)器芯片,而是采用Atmega8U2芯片進(jìn)行USB到串行數(shù)據(jù)轉(zhuǎn)換。目前ArduinoUno已成為Arduino的主推產(chǎn)品。9.Arduinomega2560ArduinoMega2560的控制器采用ATMega2560,他的資源要比之前的Arduino產(chǎn)品豐富很多,用于滿足需使用較多資源進(jìn)行產(chǎn)品設(shè)計(jì)與開發(fā)的用戶需求,同時(shí)ArduinoMega2560也兼容之前基于ArdinoDuemilanove第二章Arduino語言

2.1Arduino語言介紹及程序結(jié)構(gòu)Arduino語言使用C/C++語言編寫程序,其實(shí)也就是基礎(chǔ)的C語言,只不過把AVR單片機(jī)(微控制器)相關(guān)的一些參數(shù)設(shè)置都函數(shù)化了,不用去了解它的底層硬件,讓不了解AVR單片機(jī)(微控制器)的朋友也能輕松上手。2.1.1Arduino語言介紹Arduino基于AVR平臺,對AVR庫進(jìn)行了二次編譯封裝,把端口都打包好了,寄存器啦、地址指針之類的基本不用管。大大降低了軟件開發(fā)難度,適宜非專業(yè)愛好者使用。但優(yōu)點(diǎn)和缺點(diǎn)并存,因?yàn)槭嵌尉幾g封裝,代碼不如直接使用AVR代碼編寫精練,代碼執(zhí)行效率與代碼體積都弱于AVR直接編譯。在Arduino中,使用清楚明了的API替代復(fù)雜的寄存器配置過程,如以下代碼:pinMode(13,OUTPUT);digitalWrite(13,HIGH);2.1.1Arduino語言介紹Arduino程序中沒有main函數(shù)。其實(shí)并不是Arduino沒有main函數(shù),而是main函數(shù)的定義隱藏在了Arduino的核心庫文件中。Arduino開發(fā)一般不直接操作main函數(shù),而是使用setup和loop這兩個(gè)函數(shù)。2.1.2Arduino程序結(jié)構(gòu)----setup()

上電后setup()函數(shù)執(zhí)行一次2.1.2Arduino程序結(jié)構(gòu)--loop()loop()函數(shù)一直循環(huán)運(yùn)行面包板橫向相通、中間不通面包板連接示意電阻是對電流起阻礙作用的元件。電阻的作用有控制某一部份電路的電壓和電流比例。分配電路不同部份的電壓比例。限制流經(jīng)某一段電路的電流。釋放熱能。發(fā)熱線便是根據(jù)電阻的這個(gè)特性而產(chǎn)生出來的。通過電阻自身的一些特性,采集環(huán)境信息。比如根據(jù)阻值隨溫度變化特性,來采集環(huán)境溫度。電阻阻值讀取二極管是單向傳導(dǎo)電流的元件;發(fā)光二極管是可以發(fā)光的二極管;三極管是能夠起放大、振蕩或者開關(guān)等作用的元件;二極管、發(fā)光二極管(LED)、三極管導(dǎo)線、電纜和連接器導(dǎo)線的作用是為電流提供通路。電纜是由多根獨(dú)立導(dǎo)線組成的。實(shí)驗(yàn)材料:ArduinoUNO、面包板、1個(gè)LED、1個(gè)按鍵、1個(gè)220Ω電阻、1個(gè)10kΩ電阻。連接示意圖與電路原理圖實(shí)驗(yàn):按鍵控制LED實(shí)驗(yàn)開關(guān)簡介電路符號名稱:按扭開關(guān)類型:模擬組件控制:改變電壓電流之輸出(on/off)極性:無正負(fù)之分,但有接腳之別(in/out)一定要記得使用開關(guān)時(shí),在線路中一定要加上電阻,防止短路。開關(guān)使用下拉電阻『降低』輸出到GND(0volts)按下開關(guān)輸入5V按下為HIGH,放開為LOW上拉電阻連接到5V的輸入按下開關(guān)輸出到GND(0volts)按下為LOW,放開為HIGH上拉與下拉上(下)拉的目的的避免信號腳懸空,產(chǎn)生異常值。/?通過2號引腳連接的按鍵來控制13號引腳連接的LED?/constintbuttonPin=2;//連接按鍵的引腳constintledPin=13//連接LED的引腳intbuttonState=0;//存儲按鍵狀態(tài)的變量voidsetup(){//初始化LED引腳為輸出狀態(tài)pinMode(ledPin,OUTPUT);//初始化按鍵引腳為輸入狀態(tài)pinMode(buttonPin,INPUT);}程序代碼voidloop(){//讀取按鍵狀態(tài)并存儲在變量中buttonState

=digitalRead(buttonPin);//檢查按鍵是否被按下//如果按鍵被按下,則buttonState應(yīng)該為高電平if(buttonState

==HIGH){//點(diǎn)亮LEDdigitalWrite(ledPin,HIGH);}else{//熄滅LEDdigitalWrite(ledPin,LOW);}}使用內(nèi)部上拉電阻修改實(shí)驗(yàn)電路如右同時(shí)將原來的程序setup()部分中的

pinMode(buttonPin,INPUT);修改為

pinMode(buttonPin,INPUTPULLUP);這樣就可使能該引腳上的內(nèi)部上拉電阻,等效于在該引腳與VCC之間連接了一個(gè)阻值為20kΩ~50kΩ的電阻。,實(shí)現(xiàn)一個(gè)新的控制效果,即按一下按鍵點(diǎn)亮LED,再按一下按鍵熄滅LED。修改控制效果#defineLED13//SetD13astheLEDpin#defineBUTTON2//SetD12asthebuttonpin//Let'ssayyouhaveyourpushbuttononpin12intswitchState=0;//actualreadvaluefrompin12intoldSwitchState=0;//lastreadvaluefrompin12intlightsOn=0;//istheswitchon=1oroff=0,實(shí)現(xiàn)一個(gè)新的控制效果,即按一下按鍵點(diǎn)亮LED,再按一下按鍵熄滅LED。修改控制效果voidsetup(){pinMode(BUTTON,INPUT);//setthepushbuttonasinputpinMode(LED,OUTPUT);//anythingyouwanttocontrolusingaswitche.g.aLed}voidloop(){switchState=digitalRead(BUTTON);//readthepushButtonStateif(switchState!=oldSwitchState)//catchchange{oldSwitchState=switchState;if(switchState==HIGH){//togglelightsOn=!lightsOn;}}},實(shí)現(xiàn)一個(gè)新的控制效果,即按一下按鍵點(diǎn)亮LED,再按一下按鍵熄滅LED。修改控制效果if(lightsOn){digitalWrite(LED,HIGH);//settheLEDon}else{digitalWrite(LED,LOW);//settheLEDoff}}}2.2Arduino語言基礎(chǔ)

2.2.1數(shù)據(jù)類型類型存儲空間占用(字節(jié))取值范圍byte10~255int2-32768~32767unsignedint20~65535word20~65535long4-2147483648~2147483647unsignedlong40~4294967295short2-32768~32767boolean1取值為false和truechar1-128~127unsignedchar10~255float4–3.4028235E+38~3.4028235E+38double4–3.4028235E+38~3.4028235E+38string-根據(jù)具體情況確定String-根據(jù)具體情況確定array-根據(jù)具體情況確定void0只是一個(gè)標(biāo)識符,不占用存儲空間2.2.2數(shù)據(jù)類型轉(zhuǎn)換Arduino語言提供了一些函數(shù)可以將指定的值轉(zhuǎn)換為特定的類型。函數(shù)作用char()將指定值轉(zhuǎn)換為char類型byte()將指定值轉(zhuǎn)換為byte類型int()將指定值轉(zhuǎn)換為int類型word()將指定值轉(zhuǎn)換為word類型long()將指定值轉(zhuǎn)換為long類型float()將指定值轉(zhuǎn)換為float類型2.2.3常量常量非常容易理解,它是一個(gè)字面量,它只可以表示一個(gè)特定的量。常量名說明false邏輯假true邏輯真HIGH高電平LOW低電平INPUT輸入模式INPUT_PULLUP輸入模式(激活上拉電阻)OUTPUT輸出模式2.2.3常量1.數(shù)字引腳常量:INPUT和OUTPUT首先要記住這兩個(gè)常量必須是大寫的。通過pinMode()配置為INPUT的引腳即是將其配置在一個(gè)高阻抗的狀態(tài);配置為INPUT的引腳可以理解在引腳前串聯(lián)一個(gè)100兆歐姆的電阻。pinMode()配置為OUTPUT即是將其配置在一個(gè)低阻抗的狀態(tài)。這意味著它們可以為電路提供充足的電流。Atmega引腳可以向其他設(shè)備/電路提供或倒灌達(dá)40毫安(mA)的電流。這使得它們利于給LED供電,而不是讀取傳感器的數(shù)值。輸出(OUTPUT)引腳被短路或接5V電壓會(huì)受到損壞甚至燒毀;但是引腳在為繼電器或電機(jī)供電時(shí),由于電流不足,將需要一些外接電路來實(shí)現(xiàn)供電。2.2.3常量2.引腳電壓常量:HIGH和LOW這兩個(gè)常量也是必須大寫的。當(dāng)讀?。╮ead)或?qū)懭耄╳rite)數(shù)字引腳時(shí)只有兩個(gè)可能的值:HIGH和LOW。3.邏輯常量(布爾常量):false和truefalse的值為零,true通常情況下被定義為1,但true具有更廣泛的定義。在布爾含義里任何非零整數(shù)為true。所以在布爾含義中-1、2和-200都定義為true。2.2.3常量intledPin=13;intdelayTime=1000;voidsetup(){ pinMode(ledPin,OUTPUT);}voidloop(){ digitalWrite(ledPin,HIGH); delay(delayTime); //延時(shí) digitalWrite(ledPin,LOW); delay(delayTime); delayTime=delayTime+100; //每次增加延時(shí)時(shí)間0.1s}2.3Arduino的一些擴(kuò)展語法Arduino將分號(;)視為一條語句的結(jié)束符號。{}(花括號)也稱為大括號,是C編程語言中的一個(gè)重要組成部分;它們被用來區(qū)分幾個(gè)不同的結(jié)構(gòu)。左大括號“{”必須與一個(gè)右大括號“}”形成閉合。這稱為括號平衡的條件。在ArduinoIDE中有一個(gè)方便的功能來檢查大括號是否平衡。只需選擇一個(gè)括號,甚至單擊緊接括號的插入點(diǎn),就能知道這個(gè)括號的“伴侶括號”;養(yǎng)成一種很好的編程習(xí)慣可以避免錯(cuò)誤:2.3Arduino的一些擴(kuò)展語法注釋用來對代碼所實(shí)現(xiàn)的功能做一些描述,當(dāng)然也可以用來做一些相關(guān)說明。Arduino語言提供了兩種注釋方法?!?**/”為多行注釋,在“/*”和“*/”之間的內(nèi)容就是注釋內(nèi)容:2.4運(yùn)算符

2.4.1復(fù)合運(yùn)算符復(fù)合操作運(yùn)算符是部分?jǐn)?shù)學(xué)運(yùn)算符、位運(yùn)算符與賦值運(yùn)算的一種簡寫形式。運(yùn)算符名稱說明++遞增對操作數(shù)進(jìn)行加1運(yùn)算--遞減對操作數(shù)進(jìn)行減1運(yùn)算+=加等將左右操作數(shù)之和賦值給左操作數(shù)-=減等將左右操作數(shù)之差賦值給左操作數(shù)*=乘等將左右操作數(shù)之積賦值給左操作數(shù)/=除等將左右操作數(shù)之商賦值給左操作數(shù)&=與等將左右操作數(shù)按位與的結(jié)果賦值給左操作數(shù)|=或等將左右操作數(shù)按位或的結(jié)果賦值給左操作數(shù)2.4.2關(guān)系運(yùn)算符關(guān)系運(yùn)算符的結(jié)果是boolean類型的true或false。運(yùn)算符名稱作用>

大于判斷左操作數(shù)是否大于右操作數(shù)<

小于判斷左操作數(shù)是否大于右操作數(shù)==(雙等號)等于判斷左操作數(shù)是否等于右操作數(shù)>=大于等于判斷左操作數(shù)是否大于或者等于右操作數(shù)<=小于等于判斷左操作數(shù)是否小于或者等于右操作數(shù)!=不等于判斷左操作數(shù)是否不等于右操作數(shù)2.4.3布爾運(yùn)算符布爾運(yùn)算符用來對兩個(gè)布爾表達(dá)式進(jìn)行運(yùn)算,運(yùn)算的結(jié)果仍然為布爾值。運(yùn)算符名稱作用&&邏輯與對兩個(gè)操作數(shù)進(jìn)行邏輯與運(yùn)算||邏輯或?qū)蓚€(gè)操作數(shù)進(jìn)行邏輯或運(yùn)算!邏輯非對兩個(gè)操作數(shù)進(jìn)行邏輯非運(yùn)算符號為&(單符號)的位運(yùn)算符就是布爾運(yùn)算符的符號&&(雙符號);他們是完全不同的符號。同樣,不要混淆布爾運(yùn)算符||(雙豎)與位運(yùn)算符“或”符號為|(單豎)。2.4運(yùn)算符

2.4.4數(shù)學(xué)運(yùn)算符數(shù)學(xué)運(yùn)算符包括四則運(yùn)算符以及取模運(yùn)算符。運(yùn)算符名稱作用+加法對操作數(shù)執(zhí)行加法運(yùn)算-減法對操作數(shù)執(zhí)行減法運(yùn)算*乘法對操作數(shù)執(zhí)行乘法運(yùn)算/除法對操作數(shù)執(zhí)行除法運(yùn)算%求余對操作數(shù)進(jìn)行取模運(yùn)算=賦值將右操作數(shù)中的值賦給左操作數(shù)2.4.5位運(yùn)算符位運(yùn)算符用來按位操作數(shù)據(jù)。運(yùn)算符名稱作用&按位與按位進(jìn)行邏輯與操作|按位或按位進(jìn)行邏輯或操作^按位異或按位進(jìn)行異或操作~按位非按位進(jìn)行邏輯非操作<<

按位左移按位進(jìn)行左移操作>>

按位右移按位進(jìn)行右移操作2.4.6指針運(yùn)算符指針運(yùn)算符包括&(引用)和*(間接引用)。&運(yùn)算符用來引用變量或者函數(shù)的地址,*則是通過地址間接地引用指定地址中的內(nèi)容。2.5條件判斷2.5.1ifif(someVariable>50){ //執(zhí)行某些語句}2.5條件判斷2.5.2if...elseif(pinFiveInput<500){ //執(zhí)行A操作}else{ //執(zhí)行B操作}2.5條件判斷if(pinFiveInput<500){ //執(zhí)行A操作}elseif(pinFiveInput>=1000){ //執(zhí)行B操作}else{ //執(zhí)行C操作}2.6循環(huán)2.6.1while循環(huán)while(表達(dá)){//語句}while循環(huán)會(huì)無限的循環(huán),直到括號內(nèi)的判斷語句變?yōu)榧?。必須要有能改變判斷語句的東西,要不然while循環(huán)將永遠(yuǎn)不會(huì)結(jié)束。這可以表現(xiàn)為一個(gè)遞增的變量,或一個(gè)外部條件,如傳感器的返回值。2.6循環(huán)2.6.2do...whiledo{//語句}while(測試條件);do…while循環(huán)與while循環(huán)運(yùn)行的方式是相近的,不過它的條件判斷是在每個(gè)循環(huán)的最后,所以這個(gè)語句至少會(huì)被運(yùn)行一次,然后才結(jié)束。2.6循環(huán)2.6.3forfor循環(huán)開頭有3個(gè)部分:(初始化;條件;增量計(jì)數(shù)){//語句}while循環(huán)會(huì)無限的循環(huán),直到括號內(nèi)的判斷語句變?yōu)榧?。必須要有能改變判斷語句的東西,要不然while循環(huán)將永遠(yuǎn)不會(huì)結(jié)束。這可以表現(xiàn)為一個(gè)遞增的變量,或一個(gè)外部條件,如傳感器的返回值。2.6循環(huán)break用于跳出switch、while、do…while和for結(jié)構(gòu);continue用于在while、do…while和for循環(huán)結(jié)構(gòu)中結(jié)束當(dāng)前循環(huán);return用于立即結(jié)束當(dāng)前程序執(zhí)行;2.7

Arduino函數(shù)系統(tǒng)函數(shù)是Arduino語言默認(rèn)提供的函數(shù),這些函數(shù)可以直接拿來使用而不需要定義。系統(tǒng)函數(shù)類型作用數(shù)字I/O設(shè)置針腳屬性和進(jìn)行I/O操作模擬I/O設(shè)置針腳屬性和進(jìn)行I/O操作高級I/O操作波形和比特?cái)?shù)據(jù)等時(shí)間輸出時(shí)間和暫停程序等數(shù)學(xué)數(shù)學(xué)操作函數(shù),如求絕對值等三角進(jìn)行sin、cos和tan運(yùn)算隨機(jī)數(shù)產(chǎn)生隨機(jī)數(shù)位和比特操作位和比特的函數(shù)外部中斷響應(yīng)或者關(guān)閉外部中斷內(nèi)部中斷響應(yīng)或者關(guān)閉內(nèi)部中斷通信主機(jī)與Arduino設(shè)備之間進(jìn)行通信USB(只有Leonardo和Due具備)使用USB鍵盤和鼠標(biāo)1)pinMode(pin,mode)描述:將指定的針腳配置成輸出或輸入。語法:pinMode(pin,mode);參數(shù):pin,要設(shè)置模式的針腳;

mode,INPUT或OUTPUT(必須是大寫的)2)digitalWrite(pin,value)語法:digitalWrite(pin,value);參數(shù):pin,針腳編號(如1,5,10,A0,A3);

value,HIGH或LOW。(必須是大寫3)intdigitalRead(pin)描述:讀取指定針腳的值,HIGH或LOW。語法:digitalRead(PIN);參數(shù):pin,你想讀取的針腳號(int)。返回:HIGH或LOW。voidsetup(){

//初始化I/O口for(inti=2;i<=9;i++)pinMode(i,OUTPUT);}

voidloop(){

//從引腳2到引腳9,逐個(gè)點(diǎn)亮LED,等待1秒再熄滅LEDfor(inti=2;i<=9;i++){digitalWrite(i,HIGH);delay(1000);digitalWrite(i,LOW);}//從引腳9到引腳2,逐個(gè)點(diǎn)亮LED,等待1秒再熄滅LEDfor(inti=9;i>=2;i--){digitalWrite(i,HIGH);delay(1000);digitalWrite(i,LOW);}}//從引腳9到引腳2,逐個(gè)點(diǎn)亮LED,等待1秒再熄滅LEDfor(inti=9;i>=2;i--){digitalWrite(i,HIGH);delay(1000);digitalWrite(i,LOW);}}生活中接觸到的大多數(shù)信號都是模擬信號,如聲音和溫度的變化等。Arduino中,常用0~5V的電壓來表示模擬信號。Arduino控制器中,編號前帶有“A”的引腳是模擬輸入引腳。Arduino可以讀取這些引腳上輸入的模擬值,即讀取引腳上輸入的電壓大小。2.7.2模擬I/O模擬輸入引腳是帶有ADC(Analog?to?DigitalConverter,模/數(shù)轉(zhuǎn)換器)功能的引腳。它可以將外部輸入的模擬信號轉(zhuǎn)換為芯片運(yùn)算時(shí)可以識別的數(shù)字信號,從而實(shí)現(xiàn)讀入模擬值的功能。使用AVR芯片作主控器的Arduino模擬輸入功能有10位精度,即可以將0~5V的電壓轉(zhuǎn)換為0~1023的整數(shù)形式表示。模擬輸入功能需要使用

analogRead(pin);其中參數(shù)pin是要讀取模擬值的引腳,被指定的引腳必須是模擬輸入引腳,如analogRead(A0)即是讀取A0引腳上的模擬值。模擬輸入引腳模擬輸出功能使用analogWrite()函數(shù)來實(shí)現(xiàn),但該函數(shù)并不是輸出真正意義上的模擬值,而是以脈沖寬度調(diào)制(PulseWidthModulation,PWM)這種特殊的方式來達(dá)到輸出模擬值的效果,這種方式叫做PWM——脈沖寬度調(diào)制(PulseWidthModulation)。analogWrite(pin,value)參數(shù)value是PWM的脈沖寬度,范圍為0~255。模擬輸出功能大多數(shù)Arduino控制器的PWM引腳都會(huì)用“~”標(biāo)識;PWM引腳實(shí)驗(yàn)所需材料:ArduinoUNO、面包板、1個(gè)LED、1個(gè)220Ω電阻。實(shí)驗(yàn):呼吸燈電路原理圖voidsetup(){pinMode(3,OUTPUT);//聲明3腳為輸出}voidloop(){for(inta=0;a<=255;a++)//循環(huán)從0-255,增加亮度{analogWrite(3,a);//pwm輸出3腳delay(8);//等待8ms}

for(inta=255;a>=0;a--)//循環(huán)從255-0,減少亮度{analogWrite(3,a);//pwm輸出3腳delay(8);//等待8ms}delay(800);//等待800ms}實(shí)驗(yàn)材料:ArduinoUNO、面包板、1個(gè)LED、1個(gè)220Ω電阻、1個(gè)10kΩ電位器。實(shí)驗(yàn):電位器調(diào)節(jié)呼吸燈電位器是一個(gè)可調(diào)電阻,通過旋轉(zhuǎn)旋鈕改變2號引腳的位置,從而改變2號引腳到兩端的阻值。實(shí)驗(yàn)中需要將電位器的1、3號引腳分別接到5V和GND上,再通過模擬輸入引腳讀取電位器2號引腳輸出的電壓(0~5V)。電位器電路原理圖程序代碼intpotPin=A0;//selecttheinputpinforthepotentiometerintledPin=9;//selectthepinfortheLEDintval=0;//variabletostorethevaluecomingfromthesensorvoidsetup(){pinMode(ledPin,OUTPUT);//declaretheledPinasanOUTPUT}voidloop(){val=analogRead(potPin);//readthevaluefromthesensordigitalWrite(ledPin,HIGH);//turntheledPinondelay(val);//stoptheprogramforsometimedigitalWrite(ledPin,LOW);//turntheledPinoffdelay(val);//stoptheprogramforsometime}程序代碼constintanalogPin=A0;//theanaloginputpinattachtoconstintledPin=9;//theledattachtointinputValue=0;//variabletostorethevaluecomingfromsensorintoutputValue=0;//variabletostoretheoutputvaluevoidsetup(){}voidloop(){inputValue=analogRead(analogPin);//readthevaluefromthesensoroutputValue=map(inputValue,0,1023,0,255);//Convertfrom0-1023proportionaltothenumberofanumberoffrom0to255analogWrite(ledPin,outputValue);//turntheledondependontheoutputvalue}實(shí)驗(yàn)所需材料:ArduinoUNO、面包板、1個(gè)光敏電阻、1個(gè)10kΩ電阻。一個(gè)220Ω電阻。連接示意圖:實(shí)驗(yàn):光敏電阻檢測環(huán)境光亮度光敏電阻是一種能讓你探測光線的傳感器。它們體積小,價(jià)格便宜,功率低,使用方便,不會(huì)磨損。因此,它們經(jīng)常出現(xiàn)在玩具、小工具和電器中。光電管基本上是一個(gè)電阻,它的電阻值(單位為歐姆Ω)取決于光線照射在表面上的程度。當(dāng)光線暗時(shí),光電管的電阻可能高達(dá)幾兆歐。然而,當(dāng)它很亮?xí)r,光敏電阻的電阻可能低到幾百歐姆。因?yàn)槌杀镜?,有許多尺寸和規(guī)格,但比較不準(zhǔn)確。出于這個(gè)原因,不應(yīng)該用它們來測定精確的光度,單位是勒克斯或毫坎德拉。光敏電阻光敏電阻是一種電阻值隨照射光強(qiáng)度增加而下降的電阻。光敏電阻的使用方法很簡單,只需將其作為一個(gè)電阻接入電路中,然后使用analogRead()函數(shù)讀取電壓即可。由于光敏電阻的阻值一般較大,直接接入電路后觀察到的電壓變化并不明顯,所以這里將光敏電阻與一個(gè)普通電阻串聯(lián)(圖2-42),再根據(jù)串聯(lián)分壓的方法來讀取光敏電阻上的電壓。光敏電阻電路原理圖程序代碼intphotocellPin=A0;//selecttheinputpinforthephotoresistorintledPin=9;//selectthepinfortheLEDintval=0;//variabletostorethevaluecomingfromthesensorvoidsetup(){Serial.begin(9600);//Setthebaudrateto9600,makesureit'ssameasyoursoftwaresettingspinMode(ledPin,OUTPUT);//declaretheledPinasanOUTPUTpinMode(photocellPin,INPUT);//declaretheledPinasanOUTPUT}程序代碼voidloop(){val=analogRead(photocellPin);//readthevaluefromthesensorSerial.println(val);//Theserialwillprintthelightvalueif(val<=512)//thepointatwhichthestateofLEDschange{digitalWrite(ledPin,HIGH);//setLEDon}else{digitalWrite(ledPin,LOW);//setLEDoff}}1)tone()在一個(gè)針腳上產(chǎn)生一個(gè)特定頻率的方波(50%占空比)。持續(xù)時(shí)間可以設(shè)定,波形會(huì)一直產(chǎn)生直到調(diào)用noTone()函數(shù)。該針腳可以連接壓電蜂鳴器或其他喇叭播放聲音。在同一時(shí)刻只能產(chǎn)生一個(gè)聲音。如果一個(gè)針腳已經(jīng)在播放音樂,那么呼叫tone()將不會(huì)有任何效果。如果音樂在同一個(gè)針腳上播放,那么它會(huì)自動(dòng)調(diào)整頻率。使用tone()函數(shù)會(huì)與3腳和11腳的PWM產(chǎn)生干擾(Mega板除外)。2.7.3高級I/OTone()和analogWrite()函數(shù)都可以輸出方波,所不同的是:tone()函數(shù)輸出方波的占空比固定(50%),所調(diào)節(jié)的是方波的頻率;而analogWrite()函數(shù)輸出的頻率固定(約490HZ),所調(diào)節(jié)的是方波的占空比。2)noTone()描述:停止由tone()產(chǎn)生的方波。如果沒有使用,tone()將不會(huì)有變化。3)ShiftOut()描述:將數(shù)據(jù)的一個(gè)字節(jié)一位一位地移出。從最高有效位(最左邊)或最低有效位(最右邊)4)shiftIn()描述:將數(shù)據(jù)的一個(gè)字節(jié)一位一位地移入。從最高有效位(最左邊)或最低有效位(最右邊)5)pulseIn()描述:讀取一個(gè)針腳的脈沖(HIGH或LOW)。例如,如果value是HIGH,則pulseIn()會(huì)等待引腳變?yōu)镠IGH,開始計(jì)時(shí),再等待引腳變?yōu)長OW并停止計(jì)時(shí)。返回脈沖的長度,單位為微秒。如果在指定的時(shí)間內(nèi)無脈沖,函數(shù)返回0。此函數(shù)的計(jì)時(shí)功能由經(jīng)驗(yàn)決定,長時(shí)間的脈沖計(jì)時(shí)可能會(huì)出錯(cuò)。計(jì)時(shí)范圍為10μs~3min。(1s=103ms=106μs)。Q0--Q7:八位并行輸出端。Q7':級聯(lián)輸出端。將它接下一個(gè)595的DS端。DS:串行數(shù)據(jù)輸入端,級聯(lián)的話接上一級的Q7'。74595的控制端說明:/MR(10腳):低電平時(shí)將移位寄存器的數(shù)據(jù)清零。通常我將它接Vcc。SH_CP(11腳):上升沿時(shí)數(shù)據(jù)寄存器的數(shù)據(jù)移位。Q0->Q1->Q2-->Q3-->...-->Q7;下降沿移位寄存器數(shù)據(jù)不變。ST_CP(12腳):上升沿時(shí)移位寄存器的數(shù)據(jù)進(jìn)入數(shù)據(jù)存儲寄存器,下降沿時(shí)存儲寄存器數(shù)據(jù)不變。通常我將ST_CP置為低電平,當(dāng)移位結(jié)束后,在ST_CP端產(chǎn)生一個(gè)正脈沖(5V時(shí),大于幾十納秒就行了。我們通常都選微秒級),更新顯示數(shù)據(jù)。/OE(13腳):高電平時(shí)禁止輸出(高阻態(tài))。74595的第14管腳接Arduino的第4腳,74595的第12管腳接Arduino的第5腳,74595的第11管腳接Arduino的第6腳.74595的第10腳接高電平,第13腳接低電平。intlatchPin=5;intclockPin=6;intdataPin=4;

byteleds=0;

voidsetup(){pinMode(latchPin,OUTPUT);pinMode(dataPin,OUTPUT);pinMode(clockPin,OUTPUT);}

voidloop(){leds=0;updateShiftRegister();delay(500);for(inti=0;i<8;i++){bitSet(leds,i);updateShiftRegister();delay(500);}}

voidupdateShiftRegister(){digitalWrite(latchPin,LOW);shiftOut(dataPin,clockPin,LSBFIRST,leds);digitalWrite(latchPin,HIGH);}2.7.4時(shí)間函數(shù)1)millis()描述:返回Arduino開發(fā)板運(yùn)行當(dāng)前程序開始的毫秒數(shù),這個(gè)數(shù)字將在約50天后溢出(歸零)。2)micros()描述:返回Arduino開發(fā)板從運(yùn)行當(dāng)前程序開始的微秒數(shù),這個(gè)數(shù)字將在約70分鐘后溢出(歸零)2.7.4時(shí)間函數(shù)unsignedlongtime;

voidsetup(){Serial.begin(9600);}voidloop(){serial.print("Time:");time=millis();//打印從程序開始到現(xiàn)在的時(shí)間serial.println(time);//等待一秒鐘,以免發(fā)送大量的數(shù)據(jù)delay(1000);}2.7.4時(shí)間函數(shù)3)delay()描述:是程序設(shè)定的暫停時(shí)間(單位毫秒)。雖然創(chuàng)建一個(gè)使用delay()的閃爍LED很簡單,并且許多例子將很短的delay用于消除開關(guān)抖動(dòng),delay()也擁有很多顯著的缺點(diǎn)。在delay函數(shù)使用的過程中,讀取傳感器值、計(jì)算、引腳操作均無法執(zhí)行,因此,它所帶來的后果就是使其他大多數(shù)活動(dòng)暫停。其他操作定時(shí)的方法讀者可自行研究。大多數(shù)熟練的程序員通常避免超過10毫秒的delay(),除非arduino程序非常簡單。2.7.5數(shù)學(xué)函數(shù)1)min(x,y)描述:計(jì)算兩個(gè)數(shù)字中的最小值。參數(shù):X,第一個(gè)數(shù)字,任何數(shù)據(jù)類型;Y,第二個(gè)數(shù)字,任何數(shù)據(jù)類型。返回:兩個(gè)數(shù)字中的較小者。2)max(x,y)描述:計(jì)算兩個(gè)數(shù)字中的最大值。參數(shù):X,第一個(gè)數(shù)字,任何數(shù)據(jù)類型;Y,第二個(gè)數(shù)字,任何數(shù)據(jù)類型。返回:

兩個(gè)數(shù)字中的較大者。2.7.5數(shù)學(xué)函數(shù)3)abs(x)描述:計(jì)算一個(gè)數(shù)的絕對值。參數(shù):x,一個(gè)數(shù)值。返回:如果x大于或等于0,則返回它本身;如果x小于0,則返回它的相反數(shù)。2.7.5數(shù)學(xué)函數(shù)4)constrain(x,a,b)描述:將一個(gè)數(shù)值約束在一個(gè)范圍內(nèi)。參數(shù):x,要被約束的數(shù)值,適用于所有的數(shù)據(jù)類型;a,該范圍的最小值,適用于所有的數(shù)據(jù)類型;b,該范圍的最大值,適用于所有的數(shù)據(jù)類型。返回值:x,如果x是介于a和b之間;

a,如果x小于a;

b,如果x大于b。。2.7.5數(shù)學(xué)函數(shù)5)map(value,fromLow,fromHigh,toLow,toHigh)描述:將一個(gè)數(shù)值從一個(gè)范圍映像到另外一個(gè)范圍,也就是說,會(huì)將fromLow到fromHigh之間的值映射至toLow到toHigh之間。不限制值的范圍,因?yàn)榉秶獾闹涤袝r(shí)是刻意的和有用的。如果需要限制的范圍,constrain()函數(shù)可以用于此函數(shù)之前或之后。2.7.5數(shù)學(xué)函數(shù)6)pow(base,exponent)描述:計(jì)算一個(gè)數(shù)的冪次方。pow()可以用來計(jì)算一個(gè)數(shù)的分?jǐn)?shù)冪,其用來產(chǎn)生指數(shù)冪的數(shù)或曲線非常方便。參數(shù):base,底數(shù)(float);exponent,冪(float)。返回:一個(gè)數(shù)的冪次方值(double)。2.7.6隨機(jī)數(shù)1. randomSeed()使用randomSeed()初始化偽隨機(jī)數(shù)生成器,使生成器在隨機(jī)序列中的任意點(diǎn)開始。這個(gè)序列,雖然很長,并且是隨機(jī)的,但始終是同一序列。如需要在一個(gè)random()序列上生成真正意義的隨機(jī)數(shù),在執(zhí)行其子序列時(shí)使用randomSeed()函數(shù)預(yù)設(shè)一個(gè)絕對的隨機(jī)輸入,例如在一個(gè)斷開引腳上的analogRead()函數(shù)的返回值。2.7.6隨機(jī)數(shù)2.random()random()使用random()函數(shù)將生成偽隨機(jī)數(shù)。random(max)random(min,max)參數(shù):min-隨機(jī)數(shù)的最小值,隨機(jī)數(shù)將包含此值。(此參數(shù)可選)max-隨機(jī)數(shù)的最大值,隨機(jī)數(shù)不包含此值。返回:min和max-1之間的隨機(jī)數(shù)(數(shù)據(jù)類型為long)2.7.6隨機(jī)數(shù)longrandNumber;

voidsetup(){Serial.begin(9600);

//如果模擬輸入引腳0為斷開,隨機(jī)的模擬噪聲//將會(huì)調(diào)用randomSeed()函數(shù)在每次代碼運(yùn)行時(shí)生成不同的種子數(shù)值//randomSeed()將隨機(jī)打亂random函數(shù)randomSeed(analogRead(0));}}2.7.6隨機(jī)數(shù)voidloop(){//打印一個(gè)0到299之間的隨機(jī)數(shù)randNumber=random(300);Serial.println(randNumber);//打印一個(gè)10到19之間的隨機(jī)數(shù)randNumber=random(10,20);Serial.println(randNumber);delay(50);}2.7.7外部中斷1)attachInterrupt(interrupt,function,mode)描述:當(dāng)發(fā)生外部中斷時(shí),調(diào)用一個(gè)指定的函數(shù)。這會(huì)用新的函數(shù)取代之前指定給中斷的函數(shù)。大多數(shù)的Arduino板有兩個(gè)外部中斷:0號中斷(引腳2)和1號中斷(引腳3),部分不同類型Arduino板的中斷及引腳關(guān)系不同。ArduinoDue有更強(qiáng)大的中斷能力,其允許在所有的引腳上觸發(fā)中斷程序,可以直接使用attachInterrrupt指定引腳號碼。2.7.7外部中斷2)detachInterrupt(interrupt)描述:關(guān)閉給定的中斷。參數(shù):interrupt,中斷禁用的數(shù)(0或者1)。2.7.8開關(guān)中斷1)interrupts()(中斷)描述:重新啟用中斷(使用noInterrupts()命令后將被禁用)。中斷允許一些重要任務(wù)在后臺運(yùn)行。禁用中斷后一些函數(shù)可能無法工作,傳入信息可能會(huì)被忽略。中斷會(huì)稍微打亂代碼的時(shí)間,可以在程序關(guān)鍵部分禁用中斷。2.7.8開關(guān)中斷2)noInterrupts()描述:禁止中斷。中斷允許在后臺運(yùn)行一些重要任務(wù),默認(rèn)使能中斷。禁止中斷時(shí)部分函數(shù)會(huì)無法工作,通信中接收到的信息也可能會(huì)丟失。中斷會(huì)影響計(jì)時(shí)代碼,在某些特定的代碼中也會(huì)失效。并行通信2.7.9通信函數(shù)CPU和外部通信有兩種并行通信:數(shù)據(jù)的各位同時(shí)傳送串行通信:數(shù)據(jù)一位一位順序傳送串口通信并行通信串行通信串口通信優(yōu)點(diǎn)串行通信并行通信通信距離遠(yuǎn)近抗干擾能力高低傳輸速度慢快成本低高在Arduino控制器上,串口都是位于0(RX)和1(TX)的兩個(gè)引腳;Arduino的USB口通過一個(gè)轉(zhuǎn)換芯片(通常為ATmega16u2)與這兩個(gè)串口引腳連接。串口通信是Arduino最常用的方式初始化Serial.begin(speed);

其中參數(shù)speed指串口通信波特率,如300、600、1200、2400、4800、9600、14400、19200、28800、38400、57600、115200。發(fā)送信息Serial.print(val);其中參數(shù)val是要輸出的數(shù)據(jù)。Serial.println(val);在輸出完指定數(shù)據(jù)后,再輸出一組回車換行符。接收信息Serial.available()函數(shù)檢測是否有信息Serial.read()函數(shù)讀取信息串口函數(shù)實(shí)驗(yàn):串口輸出實(shí)驗(yàn)intcounter=0;//計(jì)數(shù)器voidsetup(){Serial.begin(9600);}voidloop(){counter=counter+1;Serial.print(counter);Serial.print(":");Serial.println("HelloWorld");delay(1000);}實(shí)驗(yàn):串口輸入voidsetup(){

Serial.begin(9600);//初始化串口}voidloop(){if(Serial.available()>0){charch=Serial.read();Serial.print(ch);}}注意:Serial.available()>0條件必不可少,當(dāng)緩沖區(qū)中沒有可讀數(shù)據(jù)時(shí),Serial.read()函數(shù)會(huì)返回int型值-1,從而形成亂碼。實(shí)驗(yàn)所需材料:ArduinoUNO實(shí)驗(yàn)現(xiàn)象:程序中使用Serial.read()語句接收數(shù)據(jù)并進(jìn)行判斷,當(dāng)接收到的數(shù)據(jù)為“a”時(shí),便點(diǎn)亮LED,并輸出提示;當(dāng)為“b”時(shí),便關(guān)閉LED,并輸出提示。實(shí)驗(yàn):串口控制開關(guān)燈voidsetup(){Serial.begin(9600);pinMode(13,OUTPUT);}voidloop(){if(Serial.available()>0){charch=Serial.read();Serial.print(ch);if(ch==“a”){//開燈digitalWrite(13,HIGH);Serial.println("turnon");}elseif(ch==?b?){//關(guān)燈digitalWrite(13,LOW);Serial.println("turnoff");}}}2.8Arduino庫函數(shù)Arduino開發(fā)的一個(gè)優(yōu)勢就是可以通過添加第三方庫來增加對硬件的支持。目前已經(jīng)有很多庫,開發(fā)者可以根據(jù)需求選擇安裝,它們只會(huì)在你需要的時(shí)候載入。程序經(jīng)常會(huì)依賴一些庫,可以在代碼的頂端看到它需要什么樣的庫。如果看#include<FatReader.h>,那意味著需要一個(gè)叫作FatReader的庫或者一個(gè)包含F(xiàn)atReader文件的庫。庫是一個(gè)包含一些文件在里面的文件夾,這些文件以.cpp(C++codefile)和.h(C++headerfile)為擴(kuò)展名。2.8.1庫函數(shù)概述庫名說明EEPROM讀寫EEPROMEthernetArduino網(wǎng)絡(luò)擴(kuò)展所使用的函數(shù)Firmata與主機(jī)之間通過串口協(xié)議進(jìn)行通訊GSM連接GSM擴(kuò)展板LiquidCrystal控制LCDSD讀寫SD卡Servo控制舵機(jī)SPI使用SPI總線通訊SoftwareSerial在數(shù)字引腳上使用串口通訊Stepper控制步進(jìn)電機(jī)TFT在TFT屏幕輸出WiFi控制WiFi擴(kuò)展板Wire使用Wire接口通過網(wǎng)絡(luò)或者傳感器接受或發(fā)送數(shù)據(jù)Robot_ControlArduino機(jī)器人控制Robot_MotorArduino機(jī)器人馬達(dá)控制2.8.2常用庫函數(shù)2.8.3如何添加額外的Arduino庫函數(shù)1.使用管理庫要在ArduinoIDE中安裝新庫,可以使用庫管理器。打開IDE并單擊“項(xiàng)目”菜單,然后單擊“加載庫”→“管理庫”。如圖所示。2.8.3如何添加額外的Arduino庫函數(shù)然后庫管理器將打開,讀者將找到已安裝或可以安裝的庫列表。在此示例中,我們將安裝ArduinoCloud庫。滾動(dòng)列表以找到它,然后選擇要安裝的庫的版本。如圖所示。2.8.3如何添加額外的Arduino庫函數(shù)最后單擊安裝并等待IDE安裝新庫。根據(jù)您的連接速度,下載可能需要一些時(shí)間。完成后,ArduinoCloud庫旁邊會(huì)出現(xiàn)一個(gè)安裝的標(biāo)簽;您可以關(guān)閉庫管理器。如圖所示。這時(shí),你可以在加載庫中看到安裝完成的庫。2.8.3如何添加額外的Arduino庫函數(shù)2.輸入.ZIP的庫庫通常作為ZIP文件或文件夾發(fā)布;文件夾的名稱就是庫的名稱。文件夾內(nèi)部有一個(gè).cpp文件,一個(gè).h文件,還有一個(gè)keywords.txt文件,examples文件夾和庫所需的其他文件。從版本1.0.5開始,您可以在IDE中直接安裝第三方庫;不要解壓縮下載的庫。在ArduinoIDE中,到“項(xiàng)目”菜單中選擇“加載庫”子菜單,在下拉列表的頂部,選擇“添加一個(gè).ZIP庫”選項(xiàng)。如圖所示。2.8.3如何添加額外的Arduino庫函數(shù)2.8.3如何添加額外的Arduino庫函數(shù)2.手動(dòng)安裝如果要手動(dòng)添加庫,則需要將其作為ZIP文件下載,解壓后放入正確的目錄中;ZIP文件包含您需要的所有內(nèi)容,包括提供的example示例。庫管理器可以自動(dòng)安裝此ZIP文件,如前所述,但有些情況下您可能需要手動(dòng)執(zhí)行安裝過程并將庫自行放入sketchbook的libraries文件夾中。Arduino庫在三個(gè)不同的位置進(jìn)行管理:在IDE安裝文件夾內(nèi),核心文件夾內(nèi)和sketchbook中的libraries文件夾中。您的sketchbook的位置默認(rèn)為Windows機(jī)器上的“..\\DOCUMENTS\Arduino”。路徑顯示在“首選項(xiàng)”面板中。如果要查看sketchbook默認(rèn)打開“文件”菜單欄下的“首選項(xiàng)”子菜單。解壓ZIP文件,拷貝到首選項(xiàng)所指示的路徑下;重新啟動(dòng)IDE,你就能看到這個(gè)庫了。2.8.3如何添加額外的Arduino庫函數(shù)第三章Arduino基本示例

本章將繼續(xù)利用Arduino做更多有趣的實(shí)驗(yàn);從中掌握Arduino對各類傳感器、顯示器、測距模塊、電動(dòng)機(jī)、數(shù)碼管的控制使用,更深入的學(xué)習(xí)Arduino編程語言和技巧。

溫濕度傳感器的使用運(yùn)動(dòng)傳感器液晶顯示器的使用超聲波測距簡易電子琴驅(qū)動(dòng)電機(jī)數(shù)碼管的驅(qū)動(dòng)如何使用矩陣鍵盤數(shù)字骰子DHT11是一款有已校準(zhǔn)數(shù)字信號輸出的溫濕度傳感器。量程濕度20-90%RH,溫度0~50℃。它應(yīng)用專用的數(shù)字模塊采集技術(shù)和溫濕度傳感技術(shù),確保產(chǎn)品具有極高的可靠性和卓越的長期穩(wěn)定性。傳感器包括一個(gè)電阻式感濕元件和一個(gè)NTC測溫元件,并與一個(gè)高性能8位單片機(jī)相連接。因此該產(chǎn)品具有品質(zhì)卓越、超快響應(yīng)、抗干擾能力強(qiáng)、性價(jià)比極高等優(yōu)點(diǎn)。每個(gè)DHT11傳感器都在極為精確的濕度校驗(yàn)室中進(jìn)行校準(zhǔn)。校準(zhǔn)系數(shù)以程序的形式存在OTP內(nèi)存中,傳感器內(nèi)部在檢測信號的處理過程中要調(diào)用這些校準(zhǔn)系數(shù)。單線制串行接口,使系統(tǒng)集成變得簡易快捷。超小的體積、極低的功耗,使其成為該類應(yīng)用中最佳選擇。產(chǎn)品為4針單排引腳封裝,連接方便。第三腳為空腳,不接;第一,四腳分別接電源和地;在VCC和數(shù)據(jù)腳之間連接一個(gè)10k的電阻,作為數(shù)據(jù)線的上拉電阻,再把數(shù)據(jù)腳接到Arduino的D3腳。#include<dht.h>dhtDHT;#defineDHT11_PIN3voidsetup(){Serial.begin(9600);Serial.println("TherealtimeTemperatureandHumidityis:");}voidloop(){//讀入數(shù)據(jù),intchk=DHT.read11(DHT11_PIN);Serial.print("Humidity:");Serial.print(DHT.humidity,1);Serial.println('%');Serial.print("Temparature");Serial.print(DHT.temperature,1);Serial.println('C');delay(2000);}在上傳完成后幾秒鐘,打開串行監(jiān)視器,你現(xiàn)在應(yīng)該看到濕度和溫度讀數(shù)以秒為單位顯示出來。請確保你選擇正確的端口和波特率。3.2Arduino和運(yùn)動(dòng)傳感器的連接3.2.1運(yùn)動(dòng)傳感器的介紹運(yùn)動(dòng)傳感器,顧名思義就是能夠探測人或物體運(yùn)動(dòng)的裝置。在大多數(shù)應(yīng)用中,這些傳感器用于在特定區(qū)域內(nèi)探測人的活動(dòng)。作為一種能夠?qū)⑵涓袘?yīng)到的運(yùn)動(dòng)轉(zhuǎn)換為電信號的裝置,該傳感器要么發(fā)射輻射并監(jiān)控其反射回來的任何變化,要么獲取運(yùn)動(dòng)物體本身發(fā)出的信號。某些運(yùn)動(dòng)傳感器會(huì)在人或其他物體入侵而打破正常狀態(tài)(即靜止)時(shí)報(bào)警,而其他的還會(huì)在入侵之后恢復(fù)正常狀態(tài)時(shí)報(bào)警。運(yùn)動(dòng)傳感器分為主動(dòng)式紅外線(AIR)傳感器或被動(dòng)式紅外線(PIR)傳感器。對于這兩種傳感器,被動(dòng)式紅外線傳感器是到目前為止最常用的傳感器,其被認(rèn)為是被動(dòng)的原因是,與主動(dòng)式紅外線傳感器不同,它們并不發(fā)射輻射束來測量其是否被打斷,而只是接收體溫形式的紅外線。

在電子防盜、人體探測器領(lǐng)域中,被動(dòng)式熱釋電紅外探測器的應(yīng)用非常廣泛,因其價(jià)格低廉、技術(shù)性能穩(wěn)定而受到廣大用戶和專業(yè)人士的歡迎。被動(dòng)式熱釋電紅外探頭的工作原理及特性為:

人體都有恒定的體溫,一般在37度,所以會(huì)發(fā)出特定波長10μm左右的紅外線,被動(dòng)式紅外探頭就是靠探測人體發(fā)射的10μm左右的紅外線而進(jìn)行工作的。人體發(fā)射的10μm左右的紅外線通過菲涅爾濾光片增強(qiáng)后聚集到紅外感應(yīng)源上。紅外感應(yīng)源通常采用熱釋電元件,這種元件在接收到人體紅外輻射溫度發(fā)生變化時(shí)就會(huì)失去電荷平衡,向外釋放電荷,后續(xù)電路經(jīng)檢測處理后就能產(chǎn)生報(bào)警信號。PIR工作參數(shù):工作電壓:4.5V至20V輸出電壓:高:3.3V低:0v探測角度:約120度范圍:可調(diào),最大到7米觸發(fā)方式:低電平:不可重復(fù)觸發(fā)/高電平:重復(fù)觸發(fā)(默認(rèn))高電平停留時(shí)間:5秒-5分鐘可調(diào)工作溫度:-20-+80攝氏度。重量:6gPIR基本上由熱釋電傳感器(圓形金屬中心具有矩形晶體),可以檢測紅外輻射水平。如下圖所示。一切物體都發(fā)出一些輻射,或多或少,而更熱的物體輻射越多。然后將該傳感器放置在多面透鏡(菲涅耳透鏡)的后面,該透鏡將世界的視野“切割”成較小的可見度,從而顯著擴(kuò)大了有用的觀察/檢測角度。一旦檢測到人的存在,傳感器就會(huì)輸出一個(gè)5V信號,持續(xù)一分鐘。它提供了約5-7米的暫定檢測范圍,并且非常靈敏。檢測原理如圖所示。逆時(shí)針調(diào)節(jié)或者往左,增加敏感度,最左邊距離大概是7米,順時(shí)針調(diào)節(jié)或者往右,減少敏感度,最右邊距離大概是3米,如圖所示。逆時(shí)針調(diào)節(jié)或者往左,減少延時(shí)時(shí)間,最左邊大概5秒;順時(shí)針調(diào)節(jié)或者往右增加延時(shí)時(shí)間,最右邊大概5分鐘,如圖所示。觸發(fā)方式選擇部分觸發(fā)方式選擇跳線允許您在單次觸發(fā)和可重復(fù)觸發(fā)之間進(jìn)行選擇。此跳線設(shè)置的影響是確定延遲開始的時(shí)間。單次觸發(fā)→首次檢測到運(yùn)動(dòng)時(shí),時(shí)間延遲立即開始。可重復(fù)觸發(fā)→每次檢測到的動(dòng)作都會(huì)重置時(shí)間延遲。因此,時(shí)間延遲從檢測到的最后一個(gè)動(dòng)作開始。默認(rèn)為可重復(fù)觸發(fā)。延時(shí)完成后3秒關(guān)閉-重要延時(shí)完成后,此設(shè)備的輸出將變?yōu)榈碗娖剑ɑ蜿P(guān)閉)約3秒鐘。換句話說,在這3秒時(shí)間內(nèi)阻止所有運(yùn)動(dòng)檢測。PIR將檢測運(yùn)動(dòng)并將其設(shè)置為高達(dá)5秒鐘。五秒鐘后,PIR將其輸出設(shè)置為低電平約3秒鐘。在3秒鐘內(nèi),PIR將不會(huì)檢測到運(yùn)動(dòng)。3秒鐘后,PIR將再次檢測到運(yùn)動(dòng),檢測到的運(yùn)動(dòng)再次將輸出設(shè)置為高電平,輸出將保持開啟,具體取決于延遲時(shí)間調(diào)整和觸發(fā)模式選擇。GND-將該引腳連接到0V。SIG-控制此繼電器,低電平有效!當(dāng)此輸入低于約2.0V時(shí),繼電器將打開VCC-將此引腳連接到5V。Com-公共端NC-常閉開關(guān)NO-常開開關(guān)3.2.2電路設(shè)計(jì)PIR輸出端連接到Arduino的D2,繼電器的輸出端連接到Arduino的D3.3.2.2電路設(shè)計(jì)intledPin=13;//選擇led輸出為13腳intrelayInput=3;//選擇的繼電器輸出為3腳intinputPin=2;//PIR輸入為2腳intpirState=LOW;//開始并沒有偵測到動(dòng)作,初始值為低intval=0;//設(shè)定變量讀入管腳狀態(tài)

voidsetup(){pinMode(ledPin,OUTPUT);//LED為輸出pinMode(inputPin,INPUT);//PIR為輸入pinMode(relayInput,OUTPUT);//繼電器為輸出digitalWrite(relayInput,HIGH);//繼電器開始并沒有工作,設(shè)定為高Serial.begin(9600);}voidloop(){val=digitalRead(inputPin);//讀輸入的值if(val==HIGH){//看看輸入是否為高電平digitalWrite(ledPin,HIGH);//打開LEDif(pirState==LOW){Serial.println("Motiondetected!");//偵測到輸入pirState=HIGH;digitalWrite(relayInput,LOW);//繼電器輸出為低,繼電器動(dòng)作Serial.println("TurnontheLamp!");Serial.println("Waitfor30000seconds");delay(30000);//等待30秒digitalWrite(relayInput,HIGH);//繼電器輸入為高Serial.println("TurnofftheLamp!");}}else{digitalWrite(ledPin,LOW);//關(guān)閉LEDif(pirState==HIGH){Serial.println("Motionended!");//輸入停止pirState=LOW;}}拓展實(shí)驗(yàn)編寫程序使兩個(gè)繼電器輪流打開,關(guān)閉。3.3Arduino和液晶顯示器的連接3.3.1液晶顯示器在Arduino很多項(xiàng)目中,您需要直接從LCD顯示屏輸出數(shù)據(jù)。在本例中,我們將展示如何使用I2C通信在Arduino上驅(qū)動(dòng)LCD顯示屏。最后,您將看到如何在顯示器上顯示文本。LCD顯示器的集成大大方便了項(xiàng)目的設(shè)計(jì),允許用戶讀取一些輸出參數(shù);這些值可以是傳感器數(shù)據(jù),例如溫度或壓力,甚至Arduino正在執(zhí)行的循環(huán)次數(shù)。然而,這些顯示器有一個(gè)小問題。當(dāng)它們連接到Arduino時(shí),這些顯示器幾乎占用所有可用IO口,只把極少的輸出留給其他設(shè)備和傳感器。如果使用I2C總線上的通信,這個(gè)問題已經(jīng)解決了。LCD1602顯示器具有集成芯片,用于管理I2C通信,所有輸入和輸出信息僅限于兩個(gè)PIN(不包括電源)。I2C是由飛利浦開發(fā)的一種串行總線,它使用兩條雙向線路,稱為SDA(串行數(shù)據(jù)線)和SCL(串行時(shí)鐘線)。兩者都必須通過上拉電阻連接。使用電壓標(biāo)準(zhǔn)為5V和3.3V。I2CLCD1602上背面的藍(lán)色電位器(用于調(diào)整對比度以獲得更好的顯示效果。如果您拿走了Backlightjumper跳線,背光將被關(guān)閉。3.3.3尋找I2C地址每個(gè)I2C設(shè)備都有一個(gè)I2C地址,用于接收命令或發(fā)送消息。這個(gè)地址通常是0x27。但有時(shí)地址可能會(huì)改變0x37,0x24的…,讓我們?nèi)ふ夷愕脑O(shè)備上的那一個(gè)。加載scanI2Caddress文件到ArduinoIDE并運(yùn)行,通過右上角的串口監(jiān)視可以看到地址,大多數(shù)Arduino電路板將顯示0x27,但也有可能是其他的地址。#include<Wire.h>voidsetup(){Wire.begin();

Serial.begin(9600);Serial.println("\nI2CScanner");}

voidloop(){byteerror,address;intnDevices;

Serial.println("Scanning...");

nDevices=0;for(address=1;address<127;address++){Wire.beginTransmission(address);error=Wire.endTransmission();

if(error==0){Serial.print("I2Cdevicefoundataddress0x");if(address<16)Serial.print("0");Serial.print(address,HEX);Serial.println("!");

nDevices++;}

elseif(error==4){Serial.print("Unknowerrorataddress0x");if(address<16)Serial.print("0");Serial.println(address,HEX);}}if(nDevices==0)Serial.println("NoI2Cdevicesfound\n");elseSerial.println("done\n");

delay(5000);}3.3.4安裝庫文件使用I2C協(xié)議的LCD液晶顯示,有一個(gè)特殊的庫被下載并包含在程序里。這個(gè)庫的名字是LiquidCrystalI2C。下載庫ZIP文件,并解壓安裝在ArduinoIDE中。你可以從ArduinoIDE中安裝ZIP文件,從菜單中選擇“Sketch”→“includeLibrary”→“Add.ZIPlibrary”等菜單,操作如圖3-16所示。拓展問題:如何刪除已經(jīng)安裝的庫文件?LiquidCrystal_I2C()//設(shè)置16個(gè)字符和2行顯示的LCD地址init()//LCD的初始化clear()//清除顯示,將光標(biāo)位置設(shè)置為零行零列home()//將光標(biāo)位置設(shè)置為零createChar()//使用自定義字符填充前8個(gè)CGRAM位置setCursor()//設(shè)置光標(biāo)的位置cursor()//打開下劃線光標(biāo)noCursor()//關(guān)閉下劃線光標(biāo)blink()//打開閃爍的光標(biāo)noBlink()//關(guān)閉閃爍的光標(biāo)display()//打開顯

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論