利用NRF24L01收發(fā)模塊實(shí)現(xiàn)Arduino與NodeMCU的無(wú)線通信
射頻通信是物聯(lián)網(wǎng)應(yīng)用中最常用的通信技術(shù)之一,我們之前在兩臺(tái)Arduino之間的通信中使用了433 MHz的射頻模塊。在本教程中,我們將使用NRF24L01收發(fā)模塊在Arduino板和NodeMCU之間進(jìn)行無(wú)線通信。在這里,我們將使用NodeMCU ESP8266從互聯(lián)網(wǎng)服務(wù)器獲取實(shí)時(shí)時(shí)間戳,并通過NRF24L01收發(fā)器無(wú)線傳輸?shù)紸rduino uno,并將其打印在連接到Arduino uno的16x2 LCD顯示屏上。
因此,nRF24L01模塊將在發(fā)送端與ESP8266接口,在接收端與Arduino Uno接口。
材料
?Arduino UNO R3
?NodeMCU
?NRF24L01收發(fā)模塊
?16*2字母數(shù)字液晶顯示
?連接電線
?電路試驗(yàn)板
?電力供應(yīng)
NRF24L01收發(fā)模塊
nRF24L01收發(fā)模塊用于兩個(gè)微控制器之間的無(wú)線通信。它在2.4 GHz全球ISM頻段運(yùn)行,并使用GFSK調(diào)制進(jìn)行數(shù)據(jù)傳輸。數(shù)據(jù)傳輸速率支持250kbps、1Mbps和2Mbps。如果在沒有障礙物的開放空間中使用,以較低的波特率運(yùn)行,其范圍可達(dá)100米。
nRF24L01收發(fā)模塊通過SPI接口通信,最大數(shù)據(jù)速率為10Mbps。SPI總線使用主從總線的概念。這里Arduino/NodeMCU的SPI總線引腳可以連接到NRF24L01收發(fā)模塊的SPI總線引腳上。
nRF24L01收發(fā)模塊在一定頻帶內(nèi)收發(fā)數(shù)據(jù),稱為信道。如果需要多個(gè)NRF24L01收發(fā)模塊相互通信,必須將它們配置為相同的信道。該信道可以在2.4 GHz ISM頻段的任何頻率。每個(gè)通道占用的帶寬不超過1MHz。這為我們提供了125個(gè)信道,帶寬間隔為1MHz。因此,NRF24L01模塊可以使用125個(gè)可能的通信信道,它可以在2.400到2.525 GHz之間。
什么是2.4 GHz ISM頻段?
2.4 GHz頻段是國(guó)際上為使用未經(jīng)許可的低功率設(shè)備保留的工業(yè)、科學(xué)和醫(yī)療(ISM)頻段之一。例如使用ISM頻率的NFC設(shè)備、無(wú)繩電話和藍(lán)牙設(shè)備。
技術(shù)規(guī)格:
?2.4Ghz免license ISM頻段。
?最高數(shù)據(jù)傳輸速度2Mbps,高效GFSK調(diào)制,抗干擾性強(qiáng),特別適合工業(yè)控制。
?125信道,可達(dá)到不同點(diǎn)或跳頻通信需要。
?低功耗1.9 - 3.6V,待機(jī)狀態(tài)下僅需1uA。
?發(fā)送和接收中斷信號(hào),每次最多發(fā)送28字節(jié)。
?集成專用穩(wěn)壓器,使用包括DC/DC電源在內(nèi)的任何電源都能有更好的通信效果。
?雙通道數(shù)據(jù)接收,內(nèi)置圓形天線,在開放無(wú)干擾環(huán)境下通信距離可達(dá)100米。
?尺寸:39mm * 17mm * 1mm(PCB嵌入式天線)
nRF24L01輸出:
nRF24L01引腳說明:
GND:這是接地參考引腳。
VCC:這是模塊的電源引腳,可以從1.9伏到3.9伏供電??蛇B接Arduino和NodeMCU模塊的3.3V引腳。
CE:它是芯片使能引腳,是一個(gè)有效的高引腳。該引腳模式?jīng)Q定模塊是在發(fā)送還是在接收。
CSN:它代表芯片選擇不,它是一個(gè)活動(dòng)的低引腳,通常保持高。當(dāng)此引腳變低時(shí),nRF24L01開始在其SPI端口上偵聽任何傳入數(shù)據(jù)。
SCK:它是串行時(shí)鐘引腳,接受來(lái)自SPI主設(shè)備的傳入時(shí)鐘脈沖。
莫西:它代表主出從入。負(fù)責(zé)NRF24L01收發(fā)模塊的輸入。
MISO:它代表主入從出。它負(fù)責(zé)NRF24L01收發(fā)模塊的輸出。
IRQ:這是一個(gè)中斷引腳,當(dāng)任何新的傳入數(shù)據(jù)可用時(shí),它可以通知主設(shè)備。
線路圖
nRF24L01發(fā)送端帶NodeMCU ESP8266
在發(fā)送端,NodeMCU is模塊與NRF24L01模塊連接,NRF24L01模塊作為發(fā)送端。如圖所示,NodeMCU的SPI引腳連接到NRF24L01模塊的SPI引腳上。除此之外,CE和CSN引腳連接到NodeMCU的數(shù)字輸出引腳。
nRF24L01與NodeMCU的連接關(guān)系如下表所示:
在發(fā)送端,我們使用“pool.ntp.org”服務(wù)器從ESP8266的內(nèi)置時(shí)間庫(kù)中獲得當(dāng)前的時(shí)間戳和日期。然后我們可以對(duì)這些數(shù)據(jù)進(jìn)行處理,通過NRF24L01模塊無(wú)線發(fā)送到接收端。
接收器端與Arduino Uno:
如圖所示,我們將NRF24L01連接到Arduino Uno上,這里NRF24L01模塊的SPI引腳連接到Arduino Uno板上。LCD的數(shù)據(jù)引腳和控制引腳也連接到Arduino板的數(shù)字引腳上。一個(gè)電位器連接到LCD上,以改變LCD顯示的對(duì)比度。
LCD與Arduino Uno的連接如下表所示:
nrf24l01與Arduino Uno的連接:
編程的解釋
在本教程的最后給出了NRF24L01 ESP8266接收器側(cè)和NRF24L01 Arduino Uno發(fā)射器側(cè)的完整程序。
NRF24L01發(fā)射機(jī)側(cè):
第一步是安裝并包含我們將在這個(gè)項(xiàng)目中使用的所有依賴庫(kù)。
這里,我們?yōu)闊o(wú)線NRF24L01模塊使用了RF_NRF24.h頭文件??梢詮倪@里下載。同樣,在ESP8266模塊中使用WiFi功能,我們必須包含ESP8266WiFi庫(kù)。在這里,我們將找到當(dāng)前的時(shí)間和日期,因此我們還需要在程序中包含時(shí)間庫(kù)。
下一步是定義NodeMCU將連接到的網(wǎng)絡(luò)的憑據(jù)。所以用write_your_ssid和write_your_pass替換你的網(wǎng)絡(luò)ssid和密碼。
程序的下一步是定義一個(gè)名為nrf24的對(duì)象,該對(duì)象定義NodeMCU的兩個(gè)連接引腳。這意味著我們已經(jīng)將NRF24L01的CE和CSN分別連接到NodeMCU的D4, D2引腳上。
在這一步中,我們配置了無(wú)線模塊初始化命令,如信道選擇,傳輸功率,數(shù)據(jù)速率,并檢查它們是否初始化完美,沒有任何錯(cuò)誤。否則,它將在串行終端中解析錯(cuò)誤。
然后通過調(diào)用WiFi.mode()函數(shù)將NodeMCU設(shè)置為站模式。之后我們稱之為WiFi。Begin函數(shù)使用給定的網(wǎng)絡(luò)憑據(jù)連接到網(wǎng)絡(luò)。
在時(shí)間庫(kù)中,configTime函數(shù)支持以秒為單位定義時(shí)區(qū)。以時(shí)區(qū)和夏令時(shí)值為參數(shù)。我們還將傳遞服務(wù)器名稱作為參數(shù),從中我們可以獲得當(dāng)前時(shí)間,即“pool.ntp.org”和“time.nist.gov”。在印度,時(shí)區(qū)是UTC +5:30,因此我們可以把它寫成5.30*3600,也可以寫成11*1800。這里不考慮日光節(jié)約,所以取0。
在無(wú)限循環(huán)中,我們調(diào)用了time()函數(shù)來(lái)獲取當(dāng)前時(shí)間,然后將其轉(zhuǎn)換為字符串變量。然后將該字符串變量轉(zhuǎn)換為二進(jìn)制數(shù)組,因?yàn)镹RF24L01收發(fā)器只以二進(jìn)制格式傳輸數(shù)據(jù)。最后使用nrf24.send()函數(shù),我們可以將這個(gè)二進(jìn)制時(shí)間數(shù)組發(fā)送到接收端。
Arduino Uno接收端:
在接收端,第一步是包含必要的庫(kù)文件,并定義Arduino板的引腳,該引腳將連接到LCD顯示器。
接下來(lái),我們創(chuàng)建了一個(gè)新的二進(jìn)制數(shù)組,其中包含該庫(kù)支持的RadioHead用戶消息的最大長(zhǎng)度,并使用sizeof()庫(kù)計(jì)算了它的長(zhǎng)度。
最后一步是將接收到的數(shù)據(jù)打印成16x2的LCD。但在此之前,我們已經(jīng)將其轉(zhuǎn)換為字符串,因?yàn)槲覀儽仨殞⑼暾臄?shù)據(jù)子字符串化,以明確地獲得時(shí)間和日期。為此,調(diào)用函數(shù)data.substring()。substring()方法從字符串中提取兩個(gè)指定索引之間的字符,并返回新的子字符串。
注意:不要忘記打開你的熱點(diǎn)和移動(dòng)數(shù)據(jù)與打開電源的發(fā)射機(jī)和接收機(jī)電路。
這就是Arduino和NodeMCU使用NRF24L01模塊進(jìn)行無(wú)線通信的方式。在這里,互聯(lián)網(wǎng)時(shí)間通過nRF24L01從NodeMCU發(fā)送到Arduino Uno,并顯示在接收器側(cè)的LCD上。
本文編譯自iotdesignpro