ESP-NOW使無線ESP32通信變得簡單。廣播傳感器數(shù)據(jù)或立即創(chuàng)建設備到設備的網(wǎng)絡,用最少的代碼。
忘掉NRF、藍牙、433MHz模塊——甚至Wi-Fi!有一種更好的無線方式。我是來自educ8s的尼克。今天,我要向你們展示的是ESP32內置的一種改變游戲規(guī)則的協(xié)議,它可以讓你的設備即時、可靠地通話,而且沒有傳統(tǒng)無線設置的麻煩。
我們將用它來建立一個無線氣象站,在esp32之間傳輸實時傳感器數(shù)據(jù),并將其顯示在大屏幕上,我們將在不到10分鐘的時間內完成。你準備好升級你的無線游戲了嗎?我們開始吧!
部件清單
?ESP32
?ESP32S3
?BME280傳感器
?2.8" ILI9341顯示屏
?USB電纜
?試驗板(可選)
?跳線
步驟1:ESP-NOW:快速概述
你知道這個小小的ESP32板…在不使用Wifi的情況下,我們已經(jīng)擁有了將數(shù)據(jù)無線發(fā)送到另一臺設備所需的一切?這是正確的!沒有任何額外的模塊,天線或其他任何東西!這一切都是與生俱來的!這要感謝一種叫做ESP-NOW的東西。
ESP-NOW是ESP32的制造商expressif開發(fā)的一種輕量級無連接無線協(xié)議。Wi-Fi或藍牙需要握手、認證和復雜的設置過程,而ESP-NOW不同,它允許設備之間即時直接通信??梢园阉胂蟪蒭sp32的對講機系統(tǒng)——一臺設備發(fā)送數(shù)據(jù),另一臺設備接收數(shù)據(jù),而不需要互聯(lián)網(wǎng)連接、路由器,甚至不需要事先配對。這使得它快速,高效,并且非常容易用于物聯(lián)網(wǎng)項目,傳感器網(wǎng)絡和實時數(shù)據(jù)共享。
ESP-NOW最大的優(yōu)點之一是它的低功耗。因為它不依賴于持續(xù)的網(wǎng)絡連接或后臺通信開銷,所以非常適合遠程傳感器、氣象站和智能家居設備等電池供電的應用。它還支持一對一、一對多甚至多對多通信,這意味著您可以建立一個由ESP設備組成的網(wǎng)絡,方便地交換數(shù)據(jù)。盡管它很簡單,但ESP-NOW可以加密數(shù)據(jù)以確保安全,使其成為傳統(tǒng)無線選項的強大而輕便的替代品。
好的,太棒了!現(xiàn)在你知道了ESP-NOW是什么,讓我們實際一點。在本指南中,我們將展示最簡單的方法來開始使用ESP-NOW。我們將設置一個ESP32來發(fā)送消息…但不是針對任何特定的設備!
而不是針對一個特定的地址,我們將使用一種叫做廣播的東西。這意味著我們發(fā)送的ESP32將向任何正在收聽ESP-NOW頻道的人發(fā)出它的信息。
最酷的是……附近的任何ESP32設備都可以接收到此消息!不需要預編程地址,不需要復雜的配對列表。只需將數(shù)據(jù)發(fā)送到無線以太網(wǎng),任何準備好偵聽的ESP32都可以接收到數(shù)據(jù)。
這對于簡單的數(shù)據(jù)廣播來說是完美的,就像我們的氣象站,我們想要發(fā)送傳感器讀數(shù)給任何顯示單元。
請記住,ESP-NOW實際上是一個非常先進的協(xié)議,具有許多功能,但今天我們只是邁出了我們的第一步,我將準備更多先進的視頻,以探索其未來的全部潛力。
步驟2:設置你的第一個ESP-NOW項目
為了使ESP-NOW的使用變得非常簡單,我創(chuàng)建了一個特殊的ESPNowEasy類!這個類以兩個簡單文件的形式提供——一個espno鼬.h文件和一個espno鼬.cpp文件。您只需要將這兩個文件包含在您的Arduino項目中,然后您將擁有這個類的所有魔力!
在Arduino代碼中使用這個類之前,我們需要導入它的頭文件。就像使用任何Arduino庫一樣,您可以在草圖的最頂部使用#include語句完成此操作。
這使得ESPNowEasy類的所有特性都可以在你的代碼中使用。
現(xiàn)在,在我們創(chuàng)建“ESP-NOW助手”對象之前,我們首先需要告訴ESPNowEasy類它將發(fā)送什么樣的數(shù)據(jù)。記得嗎,在我們的基本例子中,我們說過我們會發(fā)送一個數(shù)字和一條消息?為了定義這些數(shù)據(jù),我們創(chuàng)建了一個自定義數(shù)據(jù)結構??梢园阉胂蟪稍O計一個特殊的“盒子”來保存我們的特定數(shù)據(jù)。
它看起來像這樣:};在這個結構體中,我們定義了“盒子”將保存的數(shù)據(jù)塊。對于我們的例子,我們想要發(fā)送:
?一個整數(shù),我們叫它counter。
?還有一個消息——一個文本字符串,“Hello World!”,存儲在一個名為text的字符數(shù)組中。
一旦我們定義了這個消息結構——告訴ESPNowEasy期待什么樣的數(shù)據(jù)——那么我們就可以創(chuàng)建ESPNowEasy對象,我們的“ESP-NOW助手”。當我們創(chuàng)建這個對象時,我們需要告訴它要使用哪個消息結構。
我們用這行來做:
看到了嗎?只需一行,我們現(xiàn)在就有了espNow對象,專門設計用于處理消息數(shù)據(jù)類型,準備好使無線通信變得超級簡單!
步驟3:發(fā)送代碼:發(fā)送計數(shù)器和文本
現(xiàn)在,讓我們發(fā)送一條消息。首先,我們需要初始化ESP-NOW協(xié)議。在我們的ESPNowEasy類中,這非常簡單-只需使用這一行:
接下來,讓我們準備第一個數(shù)據(jù)包。我們將計數(shù)器設置為0,并將短信設置為“Hello World!”。一旦我們的dataToSend結構中填充了這些信息,無線發(fā)送它就很容易了:
這就是它的全部!信不信由你,使用ESPNowEasy庫,發(fā)送數(shù)據(jù)真的很簡單——只需要幾行代碼。為了使我們的示例更具動態(tài)性,讓我們將數(shù)據(jù)發(fā)送和計數(shù)器增量移到loop()函數(shù)中。這樣,我們可以在發(fā)送每個消息后增加計數(shù)器,確保每次傳輸不同的值。最后,在每次發(fā)送之間增加一秒鐘的短暫延遲,將使觀察數(shù)據(jù)傳輸變得更容易。
以下是完整的發(fā)射機代碼:
步驟4:接收代碼:顯示接收到的數(shù)據(jù)
現(xiàn)在,讓我們創(chuàng)建接收器草圖。接收方代碼和發(fā)送方代碼一樣簡單!事實上,它有很多相似之處。
首先,就像發(fā)送方一樣,接收方需要理解它將要接收的消息的結構。這意味著我們需要在接收器代碼中定義完全相同的Message結構!
接下來,就像在發(fā)送器中一樣,我們創(chuàng)建ESPNowEasy對象,專門用于處理我們的消息數(shù)據(jù)類型,如下所示:
現(xiàn)在,在setup()函數(shù)中,第一個關鍵步驟是使用espNow.begin();初始化ESP-NOW協(xié)議本身。然后,我們通過調用onReceive()方法并告訴它使用我們的onmessagerreceived函數(shù)作為處理程序來配置接收器以偵聽傳入的消息。
可以把這個函數(shù)看作是ESP32接收器內的一個專門的小工作人員。它唯一的工作就是耐心地等待無線ESP-NOW消息到達。當有消息進來時,這個功能會自動啟動!
這種類型的函數(shù)通常被稱為“回調函數(shù)”。它不是我們在主循環(huán)()中直接調用的函數(shù)。相反,我們用這行代碼注冊它:espNow.onReceive(onmessagerreceived);在注冊之后,ESPNowEasy庫接管并在新消息到達時自動為我們調用onmessagerreceived函數(shù)。在onmessagerreceived函數(shù)中,魔術變量是receivedMessage。
注意,receivedMessage的類型是Message&。這意味著它是對Message結構的引用。當ESPNowEasy調用onmessagerreceived時,它會自動用來自無線接收消息的數(shù)據(jù)填充這個receivedMessage結構!
因此,在onmessagerreceived中,我們可以使用receivedMessage直接訪問來自傳入消息的數(shù)據(jù)。計數(shù)器和receivedMessage.text。然后,我們可以對接收到的數(shù)據(jù)做任何我們想做的事情——在我們的示例中,我們只是將其打印到串行監(jiān)視器。但在實際項目中,您可能會使用這些數(shù)據(jù)來更新顯示、控制電機、觸發(fā)動作或任何您可以想象的事情!
以下是完整的接收器代碼:
步驟5:測試基本ESP-NOW通信
我們快到了!現(xiàn)在是時候對我們的代碼進行測試了。
首先,確保您已將發(fā)射器代碼上傳到一個ESP32板,并將接收器代碼上傳到另一個ESP32板。
在Arduino IDE中打開接收器ESP32的串行監(jiān)視器。將波特率設置為115200,與代碼中的Serial.begin()調用相匹配。
一旦兩個ESP32板都上電,您應該開始看到消息出現(xiàn)在接收器的串行監(jiān)視器中。輸出應該看起來像這樣:
您將注意到計數(shù)器的值隨著接收到的每條消息的增加而增加,這表明正在成功地傳輸和接收數(shù)據(jù)。
為了真正向您展示ESP-NOW的多功能,我甚至將使用不同的ESP32型號作為接收器-這次是ESP32- s3板!看看這個,效果很好!在串行監(jiān)視器上,我們可以看到無線發(fā)送的消息!這表明ESP-NOW廣播與各種ESP32板兼容。
如果沒有看到任何輸出,請仔細檢查以下內容:
?接線:確保兩塊ESP32板都已正確接通電源。
?波特率:確保串口監(jiān)視器的波特率為115200。
?代碼上傳:檢查每個ESP32上傳的代碼是否正確。
?距離:確保ESP32板之間的距離在合理范圍內。
一旦您在串行監(jiān)視器中看到消息,您就已經(jīng)成功地使用ESP-NOW和ESPNowEasy類在兩個ESP32板之間建立了基本的無線通信!
步驟6:搭建無線氣象站:發(fā)射機
現(xiàn)在我們有了基本的ESP-NOW通信的堅實基礎,讓我們繼續(xù)我們的無線氣象站項目。我們將從修改發(fā)射器代碼開始,從BME280傳感器發(fā)送真實世界的傳感器數(shù)據(jù)。
正如您所料,主要的調整是修改我們的數(shù)據(jù)結構以匹配傳感器讀數(shù)。讓我們看一下氣象站的WeatherData結構。你會發(fā)現(xiàn),我們已經(jīng)重新設計了“數(shù)據(jù)盒”,專門用來保存溫度、濕度和壓力值。
下面是新的WeatherData結構:
我們現(xiàn)在不再使用直接的Adafruit BME280庫調用,而是使用一個單獨的Sensor .h文件和一個Sensor類來封裝傳感器交互。這使得主代碼更簡潔、更有條理。
以下是更新后的發(fā)射機代碼:
變更說明:
?#include "sensor.h":包含自定義傳感器處理代碼。
?Sensor Sensor (true);:創(chuàng)建一個Sensor對象,初始化它以使用公制系統(tǒng)。
?sensor.begin():通過sensor類初始化BME280傳感器。
?sensor. gettemperature()、sensor. gethumidity()、sensor. getpressure():使用sensor類的方法檢索傳感器數(shù)據(jù)。
?錯誤處理:增加了espNow.begin()和sensor.begin()的檢查,以確保正確的初始化。
?2000ms延遲:延遲已更改為2000ms。
接線說明:
有關BME280傳感器連接到ESP32的詳細說明,請參閱附件接線圖。確保傳感器的VCC、GND、SDA和SCL引腳正確連接。
現(xiàn)在,把這個代碼上傳到你的ESP32發(fā)射機。您將開始看到傳感器數(shù)據(jù)以無線方式發(fā)送!
步驟7:搭建無線氣象站:接收器
現(xiàn)在,讓我們把注意力轉向氣象站的接收端。我們將修改接收器代碼,以便在il9341顯示器上顯示傳入的天氣數(shù)據(jù)。
首先,我們需要包括必要的庫并定義WeatherData結構,就像在發(fā)送器代碼中一樣。我們還將包含一個定制的display .h文件來處理顯示交互。
接收器代碼中的關鍵變化是:
?包括display. h文件:這允許我們與ILI9341顯示器進行交互。
?創(chuàng)建顯示對象:該對象將管理顯示。
定義onWeatherDataReceived回調函數(shù):該函數(shù)對于處理傳入的天氣數(shù)據(jù)至關重要。函數(shù)如下:
當ESP32從發(fā)射器接收到天氣數(shù)據(jù)時,該功能自動觸發(fā)。它首先將接收到的數(shù)據(jù)打印到串行監(jiān)視器進行調試和驗證。然后,它調用display.update()函數(shù),傳遞接收到的數(shù)據(jù),以更新ILI9341的顯示。
?在setup()函數(shù)中初始化顯示:我們調用display.begin()來設置顯示。
?實際上,我們正在添加代碼來接收天氣數(shù)據(jù),然后將其發(fā)送到ILI9341顯示器以進行可視化。
上傳守則:
?使用USB電纜將ESP32接收器連接到計算機。
?打開Arduino IDE,選擇正確的板和端口。
?確保Display.h和Display.cpp文件正確放置在Arduino項目文件夾中,或作為IDE中的選項卡包含。
?驗證代碼,然后點擊“上傳”按鈕。
接線說明:
請參考附件接線圖,了解連接ILI9341顯示器到ESP32的詳細說明。確保顯示器的VCC、GND、SDA、SCL和其他必要引腳正確連接。
現(xiàn)在,一旦代碼上傳到您的ESP32接收器,并且發(fā)射器正在運行,您將看到從發(fā)射器接收到的天氣數(shù)據(jù)顯示在ILI9341屏幕上。串行監(jiān)視器也將顯示數(shù)據(jù)。
步驟8:ESP-NOW的范圍和可靠性
現(xiàn)在我們的無線氣象站已經(jīng)建立并運行,讓我們談談ESP-NOW的范圍和可靠性。
在我的測試中,ESP-NOW的性能出奇地強勁。我已經(jīng)能夠帶著這些esp32在我的房子里走來走去,天氣數(shù)據(jù)一直保持完美的流-沒有丟失一個數(shù)據(jù)包!老實說,對于這種本地的家庭無線通信,我發(fā)現(xiàn)ESP-NOW比我用過的任何藍牙、433MHz或NRF模塊設置都要可靠得多。它就是有效,而且一直有效。
更令人興奮的是,ESP-NOW能夠實現(xiàn)更大的范圍——高達400米。
這種可靠性使ESP-NOW成為傳感器網(wǎng)絡、智能家居應用以及任何數(shù)據(jù)傳輸一致性至關重要的項目的理想選擇。雖然障礙物、干擾和天線放置等因素會影響探測范圍,但ESP-NOW為ESP32項目提供了強大而可靠的無線解決方案。
步驟9 .結論
這就是答案!我們已經(jīng)成功地使用ESP-NOW建立了一個無線氣象站,證明了該協(xié)議對于ESP32通信是多么容易和可靠。
我們已經(jīng)學會了如何:
?建立基本的ESP-NOW通信來發(fā)送和接收數(shù)據(jù)。
?為我們的天氣數(shù)據(jù)創(chuàng)建一個自定義數(shù)據(jù)結構。
?使用ESPNowEasy庫來簡化這個過程。
?集成BME280傳感器,捕捉實時環(huán)境數(shù)據(jù)。
?在ILI9341屏幕上顯示該數(shù)據(jù)。
ESP-NOW提供了一種強大而高效的方式來創(chuàng)建無線項目,而無需傳統(tǒng)Wi-Fi或藍牙設置的復雜性。其低功耗和可靠的通信使其成為廣泛應用的完美選擇。
本文編譯自hackster.io