Arduino for ESP32-----ESP-NOW介绍及使用

本文详细介绍了ESP-NOW协议在ESP32单板之间的通信应用,包括单向通信、双向通信以及一对多的广播方式。通过实例代码展示了如何设置MAC地址、发送和接收数据,并分析了协议的限制,如加密限制和消息长度。实验中还涉及了BME280传感器数据的传输和OLED显示,以及在多设备间实现消息传递的场景。
该文章已生成可运行项目,


部分图片来自网络

ESP-NOW介绍

ESP-NOW是一种由Espressif开发的协议,可以让多个设备在不使用Wi-Fi的情况下相互通信。该协议类似于低功耗的2.4GHz无线连接。设备之间的配对需要在通信之前完成。配对完成后,连接是安全的、点对点的,不需要握手。这意味着在设备彼此配对后,连接是持久的。换句话说,如果你的某块单板突然失去电源或复位,当它重启时,它将自动连接到它的频道继续通信

ESP-NOW支持以下特性

  1. 混合加密和未加密的对端设备
  2. 加密和不加密的单播通信
  3. 最多可携带250字节的有效载荷(小数据传输);
  4. 发送回调函数,可以设置为通知应用层传输成功或失败;

ESP-NOW技术也存在以下局限性

  1. 有限的加密。Station模式最多支持10个加密对等体;“软拨号”或“软拨号+工作站”模式最多为6个
  2. 支持多个未加密的对等体,包括加密的对等体,总数不能超过20个
  3. 3.最大消息长度限制在250字节

获取ESP32的MAC地址

在使用ESP-NOW协议前需要知道ESP32 的MAC地址

#include "WiFi.h"
 
void setup(){
   
   
  Serial.begin(115200);
  WiFi.mode(WIFI_MODE_STA);
  Serial.println(WiFi.macAddress());
}
 
void loop(){
   
   

}

上串口打开串口监视器,可以得到板子的MAC地址,例如
在这里插入图片描述
最好拿个小纸条记下来

ESP-NOW单向通信(One-way communication)

一个ESP32作为发送方,另一个ESP32作为接收方

在这里插入图片描述
发送端的程序

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

// 接收端的MAC地址
uint8_t broadcastAddress[] = {
   
   0x30, 0xAE, 0xA4, 0x07, 0x0D, 0x64};

// 发送结构体类型
typedef struct struct_message {
   
   
  char a[32];
  int b;
  float c;
  bool d;
} struct_message;

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

  // 注册通信频道
  esp_now_peer_info_t peerInfo;

// 回调函数,函数将在发送消息时执行。此函数告诉我们信息是否成功发送;
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);
  

  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() {
   
   
  //设置要发送的值
  strcpy(myData.a, "THIS IS A CHAR");
  myData.b = random(1,20);
  myData.c = 1.2;
  myData.d = false;
  
  //发送信息到指定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(2000);
}

接收端的程序

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

// 创建一个结构体接收数据
typedef struct struct_message {
   
   
    char a[32];
    int b;
    float c;
    bool d;
} struct_message;

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

// 回调函数,当收到消息时会调佣该函数
void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {
   
   
  memcpy(&myData, incomingData, sizeof(myData));
  Serial.print("Bytes received: ");
  Serial.println(len);
  Serial.print("Char: ");
  Serial.println(myData.a);
  Serial.print("Int: ");
  Serial.println(myData.b);
  Serial.print("Float: ");
  Serial.println(myData.c);
  Serial.print("Bool: ");
  Serial.println(myData.d);
  Serial.println();
}
 
void setup() {
   
   
  // 初始化串口波特率
  Serial
本文章已经生成可运行项目
评论 39
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值