ESP-NOW: ESP32项目的即时无线通信
扫描二维码
随时随地手机看文章
ESP-NOW使无线ESP32通信变得简单。广播传感器数据或立即创建设备到设备的网络,用最少的代码。
忘掉NRF、蓝牙、433MHz模块——甚至Wi-Fi!有一种更好的无线方式。我是来自educ8s的尼克。今天,我要向你们展示的是ESP32内置的一种改变游戏规则的协议,它可以让你的设备即时、可靠地通话,而且没有传统无线设置的麻烦。
我们将用它来建立一个无线气象站,在esp32之间传输实时传感器数据,并将其显示在大屏幕上,我们将在不到10分钟的时间内完成。你准备好升级你的无线游戏了吗?我们开始吧!
部件清单
•ESP32
•ESP32S3
•BME280传感器
•2.8" ILI9341显示屏
•USB电缆
•试验板(可选)
•跳线
步骤1:ESP-NOW:快速概述
你知道这个小小的ESP32板…在不使用Wifi的情况下,我们已经拥有了将数据无线发送到另一台设备所需的一切?这是正确的!没有任何额外的模块,天线或其他任何东西!这一切都是与生俱来的!这要感谢一种叫做ESP-NOW的东西。
ESP-NOW是ESP32的制造商expressif开发的一种轻量级无连接无线协议。Wi-Fi或蓝牙需要握手、认证和复杂的设置过程,而ESP-NOW不同,它允许设备之间即时直接通信。可以把它想象成esp32的对讲机系统——一台设备发送数据,另一台设备接收数据,而不需要互联网连接、路由器,甚至不需要事先配对。这使得它快速,高效,并且非常容易用于物联网项目,传感器网络和实时数据共享。
ESP-NOW最大的优点之一是它的低功耗。因为它不依赖于持续的网络连接或后台通信开销,所以非常适合远程传感器、气象站和智能家居设备等电池供电的应用。它还支持一对一、一对多甚至多对多通信,这意味着您可以建立一个由ESP设备组成的网络,方便地交换数据。尽管它很简单,但ESP-NOW可以加密数据以确保安全,使其成为传统无线选项的强大而轻便的替代品。
好的,太棒了!现在你知道了ESP-NOW是什么,让我们实际一点。在本指南中,我们将展示最简单的方法来开始使用ESP-NOW。我们将设置一个ESP32来发送消息…但不是针对任何特定的设备!
而不是针对一个特定的地址,我们将使用一种叫做广播的东西。这意味着我们发送的ESP32将向任何正在收听ESP-NOW频道的人发出它的信息。
最酷的是……附近的任何ESP32设备都可以接收到此消息!不需要预编程地址,不需要复杂的配对列表。只需将数据发送到无线以太网,任何准备好侦听的ESP32都可以接收到数据。
这对于简单的数据广播来说是完美的,就像我们的气象站,我们想要发送传感器读数给任何显示单元。
请记住,ESP-NOW实际上是一个非常先进的协议,具有许多功能,但今天我们只是迈出了我们的第一步,我将准备更多先进的视频,以探索其未来的全部潜力。
步骤2:设置你的第一个ESP-NOW项目
为了使ESP-NOW的使用变得非常简单,我创建了一个特殊的ESPNowEasy类!这个类以两个简单文件的形式提供——一个espno鼬.h文件和一个espno鼬.cpp文件。您只需要将这两个文件包含在您的Arduino项目中,然后您将拥有这个类的所有魔力!
在Arduino代码中使用这个类之前,我们需要导入它的头文件。就像使用任何Arduino库一样,您可以在草图的最顶部使用#include语句完成此操作。
这使得ESPNowEasy类的所有特性都可以在你的代码中使用。
现在,在我们创建“ESP-NOW助手”对象之前,我们首先需要告诉ESPNowEasy类它将发送什么样的数据。记得吗,在我们的基本例子中,我们说过我们会发送一个数字和一条消息?为了定义这些数据,我们创建了一个自定义数据结构。可以把它想象成设计一个特殊的“盒子”来保存我们的特定数据。
它看起来像这样:};在这个结构体中,我们定义了“盒子”将保存的数据块。对于我们的例子,我们想要发送:
•一个整数,我们叫它counter。
•还有一个消息——一个文本字符串,“Hello World!”,存储在一个名为text的字符数组中。
一旦我们定义了这个消息结构——告诉ESPNowEasy期待什么样的数据——那么我们就可以创建ESPNowEasy对象,我们的“ESP-NOW助手”。当我们创建这个对象时,我们需要告诉它要使用哪个消息结构。
我们用这行来做:
看到了吗?只需一行,我们现在就有了espNow对象,专门设计用于处理消息数据类型,准备好使无线通信变得超级简单!
步骤3:发送代码:发送计数器和文本
现在,让我们发送一条消息。首先,我们需要初始化ESP-NOW协议。在我们的ESPNowEasy类中,这非常简单-只需使用这一行:
接下来,让我们准备第一个数据包。我们将计数器设置为0,并将短信设置为“Hello World!”。一旦我们的dataToSend结构中填充了这些信息,无线发送它就很容易了:
这就是它的全部!信不信由你,使用ESPNowEasy库,发送数据真的很简单——只需要几行代码。为了使我们的示例更具动态性,让我们将数据发送和计数器增量移到loop()函数中。这样,我们可以在发送每个消息后增加计数器,确保每次传输不同的值。最后,在每次发送之间增加一秒钟的短暂延迟,将使观察数据传输变得更容易。
以下是完整的发射机代码:
步骤4:接收代码:显示接收到的数据
现在,让我们创建接收器草图。接收方代码和发送方代码一样简单!事实上,它有很多相似之处。
首先,就像发送方一样,接收方需要理解它将要接收的消息的结构。这意味着我们需要在接收器代码中定义完全相同的Message结构!
接下来,就像在发送器中一样,我们创建ESPNowEasy对象,专门用于处理我们的消息数据类型,如下所示:
现在,在setup()函数中,第一个关键步骤是使用espNow.begin();初始化ESP-NOW协议本身。然后,我们通过调用onReceive()方法并告诉它使用我们的onmessagerreceived函数作为处理程序来配置接收器以侦听传入的消息。
可以把这个函数看作是ESP32接收器内的一个专门的小工作人员。它唯一的工作就是耐心地等待无线ESP-NOW消息到达。当有消息进来时,这个功能会自动启动!
这种类型的函数通常被称为“回调函数”。它不是我们在主循环()中直接调用的函数。相反,我们用这行代码注册它:espNow.onReceive(onmessagerreceived);在注册之后,ESPNowEasy库接管并在新消息到达时自动为我们调用onmessagerreceived函数。在onmessagerreceived函数中,魔术变量是receivedMessage。
注意,receivedMessage的类型是Message&。这意味着它是对Message结构的引用。当ESPNowEasy调用onmessagerreceived时,它会自动用来自无线接收消息的数据填充这个receivedMessage结构!
因此,在onmessagerreceived中,我们可以使用receivedMessage直接访问来自传入消息的数据。计数器和receivedMessage.text。然后,我们可以对接收到的数据做任何我们想做的事情——在我们的示例中,我们只是将其打印到串行监视器。但在实际项目中,您可能会使用这些数据来更新显示、控制电机、触发动作或任何您可以想象的事情!
以下是完整的接收器代码:
步骤5:测试基本ESP-NOW通信
我们快到了!现在是时候对我们的代码进行测试了。
首先,确保您已将发射器代码上传到一个ESP32板,并将接收器代码上传到另一个ESP32板。
在Arduino IDE中打开接收器ESP32的串行监视器。将波特率设置为115200,与代码中的Serial.begin()调用相匹配。
一旦两个ESP32板都上电,您应该开始看到消息出现在接收器的串行监视器中。输出应该看起来像这样:
您将注意到计数器的值随着接收到的每条消息的增加而增加,这表明正在成功地传输和接收数据。
为了真正向您展示ESP-NOW的多功能,我甚至将使用不同的ESP32型号作为接收器-这次是ESP32- s3板!看看这个,效果很好!在串行监视器上,我们可以看到无线发送的消息!这表明ESP-NOW广播与各种ESP32板兼容。
如果没有看到任何输出,请仔细检查以下内容:
•接线:确保两块ESP32板都已正确接通电源。
•波特率:确保串口监视器的波特率为115200。
•代码上传:检查每个ESP32上传的代码是否正确。
•距离:确保ESP32板之间的距离在合理范围内。
一旦您在串行监视器中看到消息,您就已经成功地使用ESP-NOW和ESPNowEasy类在两个ESP32板之间建立了基本的无线通信!
步骤6:搭建无线气象站:发射机
现在我们有了基本的ESP-NOW通信的坚实基础,让我们继续我们的无线气象站项目。我们将从修改发射器代码开始,从BME280传感器发送真实世界的传感器数据。
正如您所料,主要的调整是修改我们的数据结构以匹配传感器读数。让我们看一下气象站的WeatherData结构。你会发现,我们已经重新设计了“数据盒”,专门用来保存温度、湿度和压力值。
下面是新的WeatherData结构:
我们现在不再使用直接的Adafruit BME280库调用,而是使用一个单独的Sensor .h文件和一个Sensor类来封装传感器交互。这使得主代码更简洁、更有条理。
以下是更新后的发射机代码:
变更说明:
•#include "sensor.h":包含自定义传感器处理代码。
•Sensor Sensor (true);:创建一个Sensor对象,初始化它以使用公制系统。
•sensor.begin():通过sensor类初始化BME280传感器。
•sensor. gettemperature()、sensor. gethumidity()、sensor. getpressure():使用sensor类的方法检索传感器数据。
•错误处理:增加了espNow.begin()和sensor.begin()的检查,以确保正确的初始化。
•2000ms延迟:延迟已更改为2000ms。
接线说明:
有关BME280传感器连接到ESP32的详细说明,请参阅附件接线图。确保传感器的VCC、GND、SDA和SCL引脚正确连接。
现在,把这个代码上传到你的ESP32发射机。您将开始看到传感器数据以无线方式发送!
步骤7:搭建无线气象站:接收器
现在,让我们把注意力转向气象站的接收端。我们将修改接收器代码,以便在il9341显示器上显示传入的天气数据。
首先,我们需要包括必要的库并定义WeatherData结构,就像在发送器代码中一样。我们还将包含一个定制的display .h文件来处理显示交互。
接收器代码中的关键变化是:
•包括display. h文件:这允许我们与ILI9341显示器进行交互。
•创建显示对象:该对象将管理显示。
定义onWeatherDataReceived回调函数:该函数对于处理传入的天气数据至关重要。函数如下:
当ESP32从发射器接收到天气数据时,该功能自动触发。它首先将接收到的数据打印到串行监视器进行调试和验证。然后,它调用display.update()函数,传递接收到的数据,以更新ILI9341的显示。
•在setup()函数中初始化显示:我们调用display.begin()来设置显示。
•实际上,我们正在添加代码来接收天气数据,然后将其发送到ILI9341显示器以进行可视化。
上传守则:
•使用USB电缆将ESP32接收器连接到计算机。
•打开Arduino IDE,选择正确的板和端口。
•确保Display.h和Display.cpp文件正确放置在Arduino项目文件夹中,或作为IDE中的选项卡包含。
•验证代码,然后点击“上传”按钮。
接线说明:
请参考附件接线图,了解连接ILI9341显示器到ESP32的详细说明。确保显示器的VCC、GND、SDA、SCL和其他必要引脚正确连接。
现在,一旦代码上传到您的ESP32接收器,并且发射器正在运行,您将看到从发射器接收到的天气数据显示在ILI9341屏幕上。串行监视器也将显示数据。
步骤8:ESP-NOW的范围和可靠性
现在我们的无线气象站已经建立并运行,让我们谈谈ESP-NOW的范围和可靠性。
在我的测试中,ESP-NOW的性能出奇地强劲。我已经能够带着这些esp32在我的房子里走来走去,天气数据一直保持完美的流-没有丢失一个数据包!老实说,对于这种本地的家庭无线通信,我发现ESP-NOW比我用过的任何蓝牙、433MHz或NRF模块设置都要可靠得多。它就是有效,而且一直有效。
更令人兴奋的是,ESP-NOW能够实现更大的范围——高达400米。
这种可靠性使ESP-NOW成为传感器网络、智能家居应用以及任何数据传输一致性至关重要的项目的理想选择。虽然障碍物、干扰和天线放置等因素会影响探测范围,但ESP-NOW为ESP32项目提供了强大而可靠的无线解决方案。
步骤9 .结论
这就是答案!我们已经成功地使用ESP-NOW建立了一个无线气象站,证明了该协议对于ESP32通信是多么容易和可靠。
我们已经学会了如何:
•建立基本的ESP-NOW通信来发送和接收数据。
•为我们的天气数据创建一个自定义数据结构。
•使用ESPNowEasy库来简化这个过程。
•集成BME280传感器,捕捉实时环境数据。
•在ILI9341屏幕上显示该数据。
ESP-NOW提供了一种强大而高效的方式来创建无线项目,而无需传统Wi-Fi或蓝牙设置的复杂性。其低功耗和可靠的通信使其成为广泛应用的完美选择。
本文编译自hackster.io