0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ESP32/ESP8266开发板单向一对多ESP-NOW无线通信

jf_88434166 来源:jf_88434166 作者:jf_88434166 2026-03-13 09:23 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

简介

本实验通过ESP-NOW无线通信协议实现ESP32开发板向多个ESP32/ESP 8266开发板发送数据。
在这里插入图片描述
在这里插入图片描述

读取ESP32/ESP8266接收方Receiver的MAC地址

读取ESP32开发板的代码

#include < WiFi.h >
#include < esp_wifi.h >

void readMacAddress(){
  uint8_t baseMac[6];
  esp_err_t ret = esp_wifi_get_mac(WIFI_IF_STA, baseMac);
  if (ret == ESP_OK) {
    Serial.printf("%02x:%02x:%02x:%02x:%02x:%02xn",
                  baseMac[0], baseMac[1], baseMac[2],
                  baseMac[3], baseMac[4], baseMac[5]);
  } else {
    Serial.println("Failed to read MAC address");
  }
}

void setup(){
  Serial.begin(115200);

  WiFi.mode(WIFI_STA);
  WiFi.STA.begin();

  Serial.print("[DEFAULT] ESP32 Board MAC Address: ");
  readMacAddress();
}
 
void loop(){

}

通过串口读取到接收方ESP32开发板1的MAC地址为:
在这里插入图片描述
同样的方式读取到接收方ESP32开发板2的MAC地址为:
在这里插入图片描述
读取ESP8266开发板的代码

#include < ESP8266WiFi.h >

void setup(){
  Serial.begin(115200);
  Serial.println();
  Serial.print("ESP Board MAC Address:  ");
  Serial.println(WiFi.macAddress());
}
 
void loop(){

}

读取到接收方ESP8266开发板的MAC地址为:
在这里插入图片描述

ESP32发送方Sender程序

把ESP32开发板1,ESP开发板2,ESP8266开发板的MAC地址分别填入到下列代码的broadcastAddress1[ ],broadcastAddress2[ ],broadcastAddress3[ ]数组中

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

// REPLACE WITH YOUR ESP RECEIVER'S MAC ADDRESS
uint8_t broadcastAddress1[] = {0x54, 0x43, 0xb2, 0x7f, 0x00, 0x60};
uint8_t broadcastAddress2[] = {0x34, 0x5f, 0x45, 0xac, 0x16, 0xc0};
uint8_t broadcastAddress3[] = {0xdc, 0x4f, 0x22, 0x23, 0xca, 0x10};

typedef struct test_struct {
  int x;
  int y;
} test_struct;

esp_now_peer_info_t peerInfo;

void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
  char macStr[18];
  Serial.print("Packet to: ");
  // Copies the sender mac address to a string
  snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
           mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
  Serial.print(macStr);
  Serial.print(" send status:t");
  Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
}
 
void setup() {
 
  Serial.begin(115200);
 
  WiFi.mode(WIFI_STA);
 
  if (esp_now_init() != ESP_OK) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }

  esp_now_register_send_cb(OnDataSent);

  // register peer
  peerInfo.channel = 0;  
  peerInfo.encrypt = false;
    
  memcpy(peerInfo.peer_addr, broadcastAddress1, 6);
  if (esp_now_add_peer(&peerInfo) != ESP_OK){
    Serial.println("Failed to add peer");
    return;
  }
  
  memcpy(peerInfo.peer_addr, broadcastAddress2, 6);
  if (esp_now_add_peer(&peerInfo) != ESP_OK){
    Serial.println("Failed to add peer");
    return;
  }
  memcpy(peerInfo.peer_addr, broadcastAddress3, 6);
  if (esp_now_add_peer(&peerInfo) != ESP_OK){
    Serial.println("Failed to add peer");
    return;
  }
}
 
void loop() {
  test_struct test;
  test_struct test2;
  test_struct test3;
  test.x = random(0,20);
  test.y = random(0,20);
  test2.x = random(0,20);
  test2.y = random(0,20);
  test3.x = random(0,20);
  test3.y = random(0,20);
 
  esp_err_t result1 = esp_now_send(
    broadcastAddress1, 
    (uint8_t *) &test,
    sizeof(test_struct));
   
  if (result1 == ESP_OK) {
    Serial.println("Sent with success");
  }
  else {
    Serial.println("Error sending the data");
  }
  delay(500);
  esp_err_t result2 = esp_now_send(
    broadcastAddress2, 
    (uint8_t *) &test2,
    sizeof(test_struct));

  if (result2 == ESP_OK) {
    Serial.println("Sent with success");
  }
  else {
    Serial.println("Error sending the data");
  }
  
  delay(500);  
  esp_err_t result3 = esp_now_send(
    broadcastAddress3, 
    (uint8_t *) &test3,
    sizeof(test_struct));
   
  if (result3 == ESP_OK) {
    Serial.println("Sent with success");
  }
  else {
    Serial.println("Error sending the data");
  }
  delay(2000);
}

ESP32/ESP8266接收方Receiver程序

上传代码到ESP32开发板1和ESP3开发板2

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

//Structure example to receive data
//Must match the sender structure
typedef struct test_struct {
  int x;
  int y;
} test_struct;

//Create a struct_message called myData
test_struct myData;

//callback function that will be executed when data is received
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("x: ");
  Serial.println(myData.x);
  Serial.print("y: ");
  Serial.println(myData.y);
  Serial.println();
}
 
void setup() {
  //Initialize Serial Monitor
  Serial.begin(115200);
  
  //Set device as a Wi-Fi Station
  WiFi.mode(WIFI_STA);

  //Init ESP-NOW
  if (esp_now_init() != ESP_OK) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }
  
  // Once ESPNow is successfully Init, we will register for recv CB to
  // get recv packer info
  esp_now_register_recv_cb(esp_now_recv_cb_t(OnDataRecv));
}
 
void loop() {

}

ESP8266开发板接收代码

#include < ESP8266WiFi.h >
#include < espnow.h >

//Structure example to receive data
//Must match the sender structure
typedef struct test_struct {
  int x;
  int y;
} test_struct;

//Create a struct_message called myData
test_struct myData;

//callback function that will be executed when data is received
void OnDataRecv(uint8_t * mac, uint8_t *incomingData, uint8_t len) {
  memcpy(&myData, incomingData, sizeof(myData));
  Serial.print("Bytes received: ");
  Serial.println(len);
  Serial.print("x: ");
  Serial.println(myData.x);
  Serial.print("y: ");
  Serial.println(myData.y);
  Serial.println();
}
 
void setup() {
  //Initialize Serial Monitor
  Serial.begin(115200);
  
  //Set device as a Wi-Fi Station
  WiFi.mode(WIFI_STA);

  //Init ESP-NOW
  if (esp_now_init() != 0) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }
  
  // Once ESPNow is successfully Init, we will register for recv CB to
  // get recv packer info
  esp_now_set_self_role(ESP_NOW_ROLE_SLAVE);
  esp_now_register_recv_cb(OnDataRecv);
}
 
void loop() {

}

ESP-NOW通信验证

同时给发送方ESP32开发板,接收方ESP32开发板1,接收方ESP32开发板2,接收方ESP8266开发板供电,并打开四个串口助手观察四个开发板的数据收发情况
若接收方都收到数据,发送方ESP32开发板会收到应答信息,串口打印各个MAC地址的接收方数据分发成功:
在这里插入图片描述
若有接收方没有收到数据,发送方ESP32开发板会收到应答信息,串口打印对应的MAC地址的接收方数据分发失败:
在这里插入图片描述
接收方ESP32开发板1串口打印接收到发送方发过来的随机数据
在这里插入图片描述
接收方ESP32开发板2串口打印接收到发送方发过来的随机数据
在这里插入图片描述
接收方ESP8266开发板串口打印接收到发送方发过来的随机数据
在这里插入图片描述

总结

通过以上例程验证了ESP32/ESP开发板之间单向一对多的ESP-NOW无线通信,接下来的篇章将继续验证多个的ESP32开发板之间实现多对一的ESP-NOW无线通信。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 开发板
    +关注

    关注

    26

    文章

    6507

    浏览量

    121363
  • ESP8266
    +关注

    关注

    51

    文章

    972

    浏览量

    49957
  • ESP32
    +关注

    关注

    27

    文章

    1235

    浏览量

    22690
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    ESP32/ESP8266开发板单向ESP-NOW无线通信

    本实验通过ESP-NOW无线通信协议实现多个ESP32/ESP 8266开发板
    的头像 发表于 03-30 10:14 296次阅读
    <b class='flag-5'>ESP32</b>/<b class='flag-5'>ESP8266</b><b class='flag-5'>开发板</b><b class='flag-5'>单向</b><b class='flag-5'>多</b>对<b class='flag-5'>一</b><b class='flag-5'>ESP-NOW</b><b class='flag-5'>无线通信</b>

    ESP32开发板单向点对点ESP-NOW无线通信

    本例程通过两个ESP32开发板实现单向点对点ESP-NOW无线通信
    的头像 发表于 03-19 09:21 395次阅读
    <b class='flag-5'>ESP32</b><b class='flag-5'>开发板</b><b class='flag-5'>单向</b>点对点<b class='flag-5'>ESP-NOW</b><b class='flag-5'>无线通信</b>

    ESP32/ESP8266开发板ESP-NOW无线通信

    ESP-NOW 是由Espressif开发的基于数据链路层的无线通信协议,它将五层 OSI 上层协议精简为层,数据传输时无需依次经过网络层、传输层、会话层、表示层、应用层等复杂的层级
    的头像 发表于 02-27 20:03 408次阅读
    <b class='flag-5'>ESP32</b>/<b class='flag-5'>ESP8266</b><b class='flag-5'>开发板</b><b class='flag-5'>ESP-NOW</b><b class='flag-5'>无线通信</b>

    ESP32-P4系列】WT9932P4-MINI开发板上手指南

    开发板介绍ESP32-P4-MINI开发板是深圳市启明云端有限公司推出的,基于WT0132P4-A1核心设计的多媒体开发板。WT0132P
    的头像 发表于 02-12 18:16 556次阅读
    【<b class='flag-5'>ESP32</b>-P4系列】WT9932P4-MINI<b class='flag-5'>开发板</b>上手指南

    ESP32-P4系列】WT9932P4-MINI开发板规格书

    开发板介绍ESP32-P4-MINI开发板是深圳市启明云端有限公司推出的,基于WT0132P4-A1核心设计的多媒体开发板。WT0132P
    的头像 发表于 02-03 18:14 681次阅读
    【<b class='flag-5'>ESP32</b>-P4系列】WT9932P4-MINI<b class='flag-5'>开发板</b>规格书

    无需安装!在浏览器里就能玩转ESP32/ESP8266,这个神器绝了!

    无需安装!在浏览器里就能玩转ESP32/ESP8266,这个神器绝了!【往期精选】十年嵌入式最深的痛,不是Bug,而是抓不到日志!vivo宣布原生支持HomeAssistant生态设备接入(含
    的头像 发表于 01-10 10:01 1767次阅读
    无需安装!在浏览器里就能玩转<b class='flag-5'>ESP32</b>/<b class='flag-5'>ESP8266</b>,这个神器绝了!

    乐鑫科技ESP-AMP框架详解!两款已支持的ESP32-P4C5开发板推荐!启明云端乐鑫科技代理

    操作系统,并提供完整的核间通信机制。启明云端旗两款高性能开发板——WT99P4C5-S1与WTDKP4C5-S1,搭载乐鑫科技ESP32-P4芯片和ESP32-C5芯
    的头像 发表于 12-18 18:02 2345次阅读
    乐鑫科技<b class='flag-5'>ESP</b>-AMP框架详解!两款已支持的<b class='flag-5'>ESP32</b>-P4C5<b class='flag-5'>开发板</b>推荐!启明云端乐鑫科技代理

    ESP32-P4全功能开发板ESP32-P4-TINY开发板该怎么选?看这篇就够了!

    启明云端基于乐鑫科技ESP32-P4芯片设计了多款开发板,这些开发板有什么区别?基于应用场景如何选择?本期,我们聚焦两款代表性产品:WT99P4C5-S1开发板与WT9932P4-TI
    的头像 发表于 12-09 18:02 1441次阅读
    <b class='flag-5'>ESP32</b>-P4全功能<b class='flag-5'>开发板</b>和<b class='flag-5'>ESP32</b>-P4-TINY<b class='flag-5'>开发板</b>该怎么选?看这篇就够了!

    晶科鑫 | 国产26MHz晶振匹配Espressif(乐鑫) ESP8285/ESP8266芯片案例

    本,两者可以共用同套SDK,只是ESP8285内部集成了1MBFlash,SPIMode设置为DOUT,而ESP8266则需要外接Flash,并且是Din模式。除此之外,ESP828
    的头像 发表于 11-21 15:37 5096次阅读
    晶科鑫 | 国产26MHz晶振匹配Espressif(乐鑫) <b class='flag-5'>ESP</b>8285/<b class='flag-5'>ESP8266</b>芯片案例

    ESP8266ESP32开发板常见的2种下载方式

    ESP32ESP8266是性价比很高而且使用较为广泛的的Wi-Fi模块,在物联网(IoT)领域的DIY项目中可以首先考虑这2款产品。 两款芯片都属于32位处理器。ESP32是低功耗双核80MHz
    的头像 发表于 11-10 20:30 1568次阅读
    <b class='flag-5'>ESP8266</b>和<b class='flag-5'>ESP32</b><b class='flag-5'>开发板</b>常见的2种下载方式

    ESP8266ESP32开发板常见的2种下载方式

    ESP8266全IO口引出,直接下载无需复位! ESP32功能框图 基于arduino的ESP32/ESP8266开发环境搭建 1.在a
    发表于 10-24 18:04

    ESP32ESP-NOW通讯踩坑记

    1、背景前段时间看到乐鑫推出了种很有意思的Wi-Fi通讯协议,它允许设备在无连接的时候进行直接通讯。乐鑫对它的概述如下:“ESP-NOW种由乐鑫公司定义的无连接Wi-Fi通信协议
    的头像 发表于 09-13 10:03 3020次阅读
    <b class='flag-5'>ESP32</b>的<b class='flag-5'>ESP-NOW</b>通讯踩坑记

    ESP32-P4-MINI开发板开箱和上手指南来了!速速码住!

    上期“梦中情ESP32-P4-MINI开发板出就备受青睐这期我们立马就端着开箱和上手指南来了!不用惊叹,我们就是这么迅速,请把“启明云端权威”打在公屏上好嘛!开箱展示拿到
    的头像 发表于 07-25 18:02 2707次阅读
    <b class='flag-5'>ESP32</b>-P4-MINI<b class='flag-5'>开发板</b>开箱和上手指南来了!速速码住!

    ESP32开发板元件资料

    ESP32开发板元件
    发表于 07-21 14:47 17次下载

    ESP32-P4 C5开发板烧录小智全流程!速看!

    没错,你没有看错!我们带着WT99P4C5-S1开发板烧录小智全流程走来了!开发板搭载乐鑫科技ESP32-P4和ESP32-C5芯片,代码完全开源,支持灵活二次
    的头像 发表于 07-04 18:03 3194次阅读
    <b class='flag-5'>ESP32</b>-P4 C5<b class='flag-5'>开发板</b>烧录小智全流程!速看!