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

目录

    • 简介
    • 读取ESP32/ESP8266接收方Receiver的MAC地址
    • ESP32发送方Sender程序
    • ESP32/ESP8266接收方Receiver程序
    • ESP-NOW通信验证
    • 总结

简介

本实验通过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:%02x\n",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 stringsnprintf(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 peerpeerInfo.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 MonitorSerial.begin(115200);//Set device as a Wi-Fi StationWiFi.mode(WIFI_STA);//Init ESP-NOWif (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 infoesp_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 MonitorSerial.begin(115200);//Set device as a Wi-Fi StationWiFi.mode(WIFI_STA);//Init ESP-NOWif (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 infoesp_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无线通信。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/54477.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx反向代理出现502 Bad Gateway问题的解决方案

&#x1f389; 前言 前一阵子写了一篇“关于解决调用百度翻译API问题”的博客&#xff0c;近日在调用其他API时又遇到一些棘手的问题&#xff0c;于是写下这篇博客作为记录。 &#x1f389; 问题描述 在代理的遇到过很多错误码&#xff0c;其中出现频率最高的就是502&#x…

LabVIEW提高开发效率技巧----代码规范与文档记录

良好的代码规范与文档记录在LabVIEW开发中至关重要。它不仅能够大幅提升开发效率&#xff0c;还为后续的维护和项目交接提供便利。下面将从命名规则、注释标准、功能说明等多个角度&#xff0c;介绍如何通过规范化开发提高项目的可维护性与协作性。 1. 保持一致的命名规则 在L…

Flutter局域网广播(UDP通信)与TCP通信

前言 现在有一个需求&#xff0c;手机和ESP32通过WIFI进行通信。流程如下&#xff1a; 手机创建TCP服务器手机向192.168.0.255的1002端口广播自己的ip地址以及TCP服务器的端口号ESP32监听到1002的广播内容后&#xff0c;连接手机的TCP服务器。最后就是ESP32硬件和TCP服务器进…

双击热备 Electron网页客户端

安装流程&#xff1a; 1.下载node.js安装包进行安装 2.点击Next; 3.勾选&#xff0c;点击Next; 4.选择安装目录 5.选择Online 模式 6.下一步执行安装 。 7.运行cmd,执行命令 path 和 node --version&#xff0c;查看配置路径和版本 8.Goland安装插件node.js 9.配置运行…

【有啥问啥】深度剖析:大模型AI时代下的推理路径创新应用方法论

深度剖析&#xff1a;大模型AI时代下的推理路径创新应用方法论 随着大规模预训练模型&#xff08;Large Pretrained Models, LPMs&#xff09;和生成式人工智能的迅速发展&#xff0c;AI 在多领域的推理能力大幅提升&#xff0c;尤其是在自然语言处理、计算机视觉和自动决策领…

Kafka 下载安装及使用总结

1. 下载安装 官网下载地址&#xff1a;Apache Kafka 下载对应的文件 上传到服务器上&#xff0c;解压 tar -xzf kafka_2.13-3.7.0.tgz目录结果如下 ├── bin │ └── windows ├── config │ └── kraft ├── libs ├── licenses └── site-docs官方文档…

Flink Task 日志文件隔离

Flink Task 日志文件隔离 任务在启动时会先通过 MdcUtils 启动一个 slf4j 的 MDC 环境&#xff0c;然后将 jobId 添加到 slf4j 的 MDC 容器中&#xff0c;随后任务输出的日志都将附带 joid。 MDC 介绍如下&#xff1a; MDC ( Mapped Diagnostic Contexts )&#xff0c;它是一个…

深度学习:(六)激活函数的选择与介绍

激活函数 之前使用的 a σ ( z ) a\sigma(z) aσ(z) &#xff0c;其中 σ ( ) \sigma(~) σ( ) 便是激活函数。 在神经网络中&#xff0c;不同层的激活函数可以不同。 在学习中&#xff0c;一般以 g ( z ) g(z) g(z) 来表示激活函数。 为什么需要(线性)激活函数&#xff…

K8s容器运行时,移除Dockershim后存在哪些疑惑?

K8s容器运行时&#xff0c;移除Dockershim后存在哪些疑惑&#xff1f; 大家好&#xff0c;我是秋意零。 K8s版本截止目前&#xff08;24/09&#xff09;已经发布到了1.31.x版本。早在K8s版本从1.24.x起&#xff08;22/05&#xff09;&#xff0c;默认的容器运行时就不再是Doc…

算法之搜索--最长公共子序列LCS

最长公共子序列&#xff08;longest common sequence&#xff09;:可以不连续 最长公共子串&#xff08;longest common substring&#xff09;&#xff1a;连续 demo for (int i 1;i<lena;i){for (int j 1;j<lenb;j){if(a[i-1]b[j-1]){dp[i][j]dp[i-1][j-1]1;}el…

Qt (17)【Qt 文件操作 读写保存】

阅读导航 引言一、Qt文件概述二、输入输出设备类三、文件读写类四、文件和目录信息类五、自定义“记事本” 引言 在上一篇文章中&#xff0c;我们学习了Qt的事件处理机制&#xff0c;知道了如何响应用户的操作。但应用程序常常还需要处理文件&#xff0c;比如读写数据。所以&a…

python爬虫初体验(一)

文章目录 1. 什么是爬虫&#xff1f;2. 为什么选择 Python&#xff1f;3. 爬虫小案例3.1 安装python3.2 安装依赖3.3 requests请求设置3.4 完整代码 4. 总结 1. 什么是爬虫&#xff1f; 爬虫&#xff08;Web Scraping&#xff09;是一种从网站自动提取数据的技术。简单来说&am…

指针修仙之实现qsort

文章目录 回调函数什么是回调函数回调函数的作用 库函数qsort使用qsort函数排序整形使用qsort函数排序结构体 qsort函数模拟实现说明源码and说明 回调函数 什么是回调函数 回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数…

Sigmoid引发的梯度消失爆炸及ReLU引起的神经元参数失效问题思考

Sigmoid和ReLU激活函数思考&#xff09; 引文Sigmoid函数梯度消失问题梯度爆炸问题解决方案 ReLU函数简化模型示例场景设定前向传播对反向传播的影响总结 内容精简版 引文 梯度消失和梯度爆炸是神经网络训练中常见的两个问题&#xff0c;特别是在使用Sigmoid激活函数时。这些问…

后端-navicat查找语句(单表与多表)

表格字段设置如图 语句&#xff1a; 1.输出 1.输出name和age列 SELECT name,age from student 1.2.全部输出 select * from student 2.where子语句 1.运算符&#xff1a; 等于 >大于 >大于等于 <小于 <小于等于 ! <>不等于 select * from stude…

torch模型量化方法总结

0.概述 模型训练完成后的参数为float或double类型,而装机(比如车载)后推理预测时,通常都会预先定点(量化)为int类型参数,相应的推理的精度会有少量下降,但不构成明显性能下降,带来的结果是板端部署的可能性,推理的latency明显降低,本文对torch常用的量化方法进行总…

JavaEE: 创造无限连接——网络编程中的套接字

文章目录 Socket套接字TCP和UDP的区别有连接/无连接可靠传输/不可靠传输面向字节流/面向数据报全双工/半双工 UDP/TCP api的使用UDPDatagramSocketDatagramPacketInetSocketAddress练习 TCPServerSocketSocket练习 Socket套接字 Socket是计算机网络中的一种通信机制&#xff0…

【VLM小白指北 (1) 】An Introduction to Vision-Language Modeling

开一个新坑Vision-Language Modeling (VLM) &#xff0c;原文76页&#xff0c;慢慢更&#xff0c;for beginners&#xff0c;但也不能之前啥都不会啊。 原文链接&#xff1a;An Introduction to Vision-Language Modeling Introduction 存在的问题&#xff1a;将语言与视觉相…

ChatGPT 在国内使用的方法

AI如今很强大&#xff0c;聊聊天、写论文、搞翻译、写代码、写文案、审合同等等&#xff0c;ChatGPT 真是无所不能~ 作为一款出色的大语言模型&#xff0c;ChatGPT 实现了人类般的对话交流&#xff0c;最主要是能根据上下文进行互动。 接下来&#xff0c;我将介绍 ChatGPT 在国…

xhs 小红书 x-s web 分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 有相关问题请第一时间头像私信联系我…