【Arduino】基于ESP-NOW库实现ESP32模块间通信

ESP-NOW库

ESP-NOW 是由乐鑫开发的另一款协议,可以使多个设备在没有或不使用 Wi-Fi 的情况下进行通信。这种协议类似常见于无线鼠标中的低功耗
2.4GHz 无线连接——设备在进行通信之前要进行配对。配对之后,设备之间的连接是持续的、点对点的,并且不需要握手协议。

通过ESP-NOW可以实现一对一,一对多,多对一的单向通信及一对一的双向通信。

ESP-NOW库使用

获取MAC地址

利用ESP-NOW库进行通信首先需要知道接收端ESP32的MAC地址,利用串口通信扫描出MAC地址并记录下来。

#include "WiFi.h"
void setup(){
  Serial.begin(115200);
  WiFi.mode(WIFI_MODE_STA);
  Serial.println(WiFi.macAddress()); //串口输出扫描到的MAC地址
}
void loop(){
}

数据发送

在获得接收端的MAC地址后,修改代码中broadcastAddress的MAC地址,以及结构体中所传输的数据类型。然后在主函数中esp_now_send函数之前添加myData各个结构体数据的值。
主要函数解释:

/*设置WIFI模式为STA模式,即无线终端*/
WiFi.mode(WIFI_STA);
/*发送数据函数*/
esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));
/*broadcastAddress为MAC地址,myData为发送的数据,sizeof(myData)为占用空间大小,
返回数据状态,ESP_OK表示发送成功,否则失败*/

完整发送代码

#include <esp_now.h>
#include <WiFi.h>
// 接收端的MAC地址(需要修改为你的eps32接收端mac地址)
uint8_t broadcastAddress[] = {0xC0, 0x49, 0xEF, 0xE6, 0x06, 0x6C};

// 发送结构体类型(可以根据你所需要的数据类型修改)
typedef struct struct_message {
  int anglex;
  char angley;
  float anglez;
} struct_message;

// 创建一个结构体变量
struct_message myData;

// 回调函数,函数将在发送消息时执行。此函数告诉我们信息是否成功发送;
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
  Serial.print("\r\nLast Packet Send Status:\t");
  Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
}

 /************************初始化****************************/
void setup() {
  // 初始化串口波特率
  Serial.begin(115200);
 
  // 设置WIFI模式为STA模式,即无线终端
  WiFi.mode(WIFI_STA);
  
  //  初始化ESP-NOW
  if (esp_now_init() != ESP_OK) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }

 //注册回调函数
  esp_now_register_send_cb(OnDataSent);
  
  // 注册通信频道
  esp_now_peer_info_t peerInfo;
  memcpy(peerInfo.peer_addr, broadcastAddress, 6);
  peerInfo.channel = 0;  //通道
  peerInfo.encrypt = false;//是否加密为False
         
  if (esp_now_add_peer(&peerInfo) != ESP_OK){
    Serial.println("Failed to add peer");
    return;
  }
}
 /************************主函数****************************/
void loop() {
  //需发送数据类型的值
  myData.anglex=90;
  myData.angley="y";
  myData.anglez=0.01;
  //发送信息到指定ESP32上
  esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));
 //判断是否发送成功
  if (result == ESP_OK) {
    Serial.println("Sent with success");
  }
  else {
    Serial.println("Error sending the data");
  }
  delay(10);
}

接收数据

将接收到的信息存储在myData的结构体变量中,每次接收到数据就会在串口中打印出来。
主要函数解释:

// 设置wifi模式
  WiFi.mode(WIFI_STA);
/*注册接收信息的回调函数*/
 esp_now_register_recv_cb(OnDataRecv);
/*每次收到消息都会调用OnDataRecv函数*/
/*可以定义每次收到消息执行的动作*/
void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len); 

完整接收代码:

#include <esp_now.h>
#include <WiFi.h>

int angleX;
char angleY;
float angleZ;

// 创建一个结构体接收数据
typedef struct struct_message {
    int anglex;
    char angley;
    float anglez;
} struct_message;

// 创建一个结构体变量
struct_message myData;

// 回调函数,当收到消息时会调佣该函数
void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {
  //将incomData赋值到myData数据结构中
  memcpy(&myData, incomingData, sizeof(myData));
  Serial.print("Bytes received: ");
  Serial.println(len);
  Serial.print("anglex: ");
  Serial.println(myData.anglex);
  Serial.print("angley: ");
  Serial.println(myData.angley);
  Serial.print("anglez: ");
  Serial.println(myData.anglez);
  Serial.println();
}
 
void setup() {
  // 初始化串口波特率
  Serial.begin(115200);
  // 设置wifi模式
  WiFi.mode(WIFI_STA);
  // 初始化esp-now
  if (esp_now_init() != ESP_OK) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }
  //注册接收信息的回调函数
  esp_now_register_recv_cb(OnDataRecv);
}

void loop() {
  //读取结构体变量的值
  angleX=myData.anglex;
  strcmp(angleY,myData.angley);
  angleZ=myData.anglez;
}

一对多单向通信只需要在发送端添加多个MAC地址执行esp_now_send函数,一对一双向通信将发送端及接受端代码结合在一起。

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: ESP-NOWArduino的一个,用于简化ESP8266和ESP32之间通信。通过该,可以方便地在这两个模块之间建立无线通信ESP-NOW提供了一种直接的点对点通信方式,可以在两个模块之间发送和接收数据。利用这种通信方式,可以在不需要使用路由器或互联网的情况下,实现设备之间的数据传输。 使用ESP-NOW时,一个设备将被设置为发送器(Sender),另一个设备将被设置为接收器(Receiver)。发送器可以将数据直接发送给接收器,接收器收到数据后可以进行相应的处理。 为了使用ESP-NOW,首先需要在发送器和接收器上分别初始化和配置ESP-NOW。然后,在发送器上,将需要发送的数据通过ESP-NOW发送出去;接收器会监听是否有来自发送器的数据,一旦接收到数据,便可以进行相应的处理。 ESP-NOW支持一对多和多对一的通信方式。一对多的通信方式允许一个发送器与多个接收器进行通信,可以实现例如广播的功能;多对一的通信方式允许多个发送器将数据发送给一个接收器。 总结来说,ESP-NOWArduino提供了一种简单、直接、低功耗的通信方式,可以实现ESP8266和ESP32之间的无线通信。无论是在物联网应用程序还是远程传感器网络中,ESP-NOW都可以提供稳定、高效的数据传输。 ### 回答2: Arduino ESP-NOW是一种专门为ESP8266和ESP32微控制器开发的无线通信。它允许在这些微控制器之间进行直接通信,无需使用任何中间设备或网络。 ESP-NOW的主要特点是快速和稳定的数据传输,并且可以在多个设备之间进行广播或点对点通信。这使得它非常适合用于传感器网络、远程控制和物联网应用。 ESP-NOW的使用相对简单,只需要在发送方和接收方的代码中包含相应的和函数即可。发送方使用esp_now_send函数将数据发送到目标设备,而接收方使用esp_now_register_recv_cb函数注册一个接收回调函数来接收数据。发送方和接收方都需要通过esp_now_add_peer函数添加对方的MAC地址作为合法设备。 具体使用ESP-NOW的步骤如下: 1. 在Arduino IDE中下载和安装ESP-NOW。 2. 根据需要配置发送方和接收方的代码。 3. 在发送方代码中,使用esp_now_add_peer函数添加接收方的MAC地址。 4. 在发送方代码中,使用esp_now_send函数将数据发送到接收方。 5. 在接收方代码中,注册一个接收回调函数并处理接收到的数据。 使用ESP-NOW有许多潜在的应用场景。例如,可以使用它来构建无线传感器网络,将多个传感器节点的数据传输到一个集中控制器上。此外,还可以使用ESP-NOW实现远程控制功能,比如通过手机应用程序控制家居设备。 总之,Arduino ESP-NOW是一种简便易用的无线通信,适用于ESP8266和ESP32微控制器之间的直接通信。它为开发者提供了一种快速、稳定和灵活的通信方式,使得许多物联网和无线控制的应用变得更加容易实现。 ### 回答3: Arduino ESP-NOW是一种用于通信,它建立在ESP8266和ESP32芯片上。ESP-NOW是一种低功耗、高效率的无线通信协议,专门用于通过ESP8266和ESP32之间进行点对点和多对多通信ESP-NOW提供了一组简单的函数来实现设备之间的直接通信。使用ESP-NOW,我们可以在两个或多个ESP8266或ESP32设备之间创建无线通信网络,无需连接到Wi-Fi网络。这使得它非常适合用于物联网(IoT)应用程序,如传感器网络和控制系统等。 ESP-NOW使用一种基于MAC地址的简单层2协议,通过广播和单播方式发送和接收消息。它的优势是在通信过程中具有低功耗和低时延特性,同时具有高传输速率和可靠性。 使用ESP-NOW,我们可以轻松地在两个或多个设备之间进行数据交换和控制命令的发送。可以直接使用它来发送和接收数据包,而不需要连接到互联网。例如,我们可以使用ESP-NOW来构建一个温度传感器网络,其中每个节点都是一个ESP8266或ESP32设备,可以通过ESP-NOW进行数据传输,从而形成一个分布式的温度监测系统。 总而言之,Arduino ESP-NOW是一种用于建立低功耗、高效率无线通信网络的,非常适合物联网应用。它提供了简单的函数,使得设备之间的点对点和多对多通信变得容易。使用ESP-NOW,我们可以轻松构建各种物联网应用,实现设备之间的数据交换和控制命令的传输。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿皮不才

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值