ESP-NOW通用通信框架合集项目
本文最后更新于37 天前,其中的信息可能已经过时,如有错误请发送邮件到2275012286@qq.com,或者在下方留言。

基于ESP32C6自组网下主从机ESP-NOW通用通信框架合集项目(停止维护)

想了解更多项目请搜索“项目”标签或者访问我的github仓库。
仓库地址:QianmoNai’s Repositories

本合集项目包含六个子项目:esp32c6主机、esp32c6从机、esp32c3蓝牙ESP-NOW双通道菜单遥控器、恒域威串口屏UI及通信设计、配套安卓app、主板PCB。

1.主机 (服务端)代码:项目地址:QianmoNai/ESP32C6_ESP-NOW_Server

2.从机(客户端)代码:项目地址:QianmoNai/ESP32C6_ESP-NOW_Client

3.遥控器代码:项目地址:QianmoNai/ESP32C3_contral

4.安卓app代码:项目地址-:QianmoNai/ESP32C3_Contral_App

5.恒域威串口屏

通过网盘分享的文件:串口屏代码.zip
链接: https://pan.baidu.com/s/135vUPJwXW4jxJ9nQ983HKg?pwd=esnk提取码: esnk

6.主板PCB

通过网盘分享的文件:ProPrj_机创-串口屏PCB_2026-04-27.zip
链接: https://pan.baidu.com/s/1LYYsUznD6_1wiVEgi8YJFA?pwd=x8w8 提取码: x8w8

1.项目背景

用于机创比赛的无线电机控制部分,目的是为了能够简化信号线的布线。基于前面文章”ESP32C6局域网下UDP通信项目”这篇文章,但是因为发现丢包和延迟比较大的缘故,并且原方案需要路由器才能实现组网通信,很不方便,所以选择放弃了UDP通信方式,改为ESP—NOW通信,通过ESP-NOW私有通信协议实现一主机多从机的控制方式,能过实现远程的对电机的控制,并且实现一对多控制。ESP‑NOW相比UDP无需路由器、无IP、延迟更低、功耗更小、启动更快、协议开销更小,更适合ESP32之间近距离、低延迟、低功耗的点对点直连通信。实测下来,ESP-NOW通信下的基本没有丢包,延迟也非常小,后续将确定采用ESP-NOW通信方案。

2.项目介绍

想要复刻实现请准备好ESP32C6-mini开发版(1~4个)、微雪ESP32C6板载1.47寸LCD屏开发板、esp32c3最小系统板、oled屏、恒域威串口屏。

ps:复现项目的话要根据情况修改主机和从机中的接收的MAC码地址。

1.内有串口通信协议,波特率都为115200,从到主这条通信链路,从机ESP作为状态机,持续转发从机MCU发来单字节数据给主机ESP,主机ESP再把此单字节数据再转发给主机MCU,最终的实现效果就是从机MCU发什么,主机MCU就接收到什么,发送频率由从机MCU决定,类似于无线串口。主到从这条通信链路,主机MCU发给主机ESP的命令格式为“XXXX”(最好加上换行符)每一位数字对应一个电机的目标控制值,如果接收命令“9999“,则返回当前的四个电机状态,格式为“XXXX”。例如主机ESP接收来自主机MCU串口命令“1234”(字符串类型)可以控制四个从机ESP的状态分别为0x01,0x02,0x03,0x04,四个从机MCU也能串口接收一次对应的状态值。此时主机MCU再发“9999”,则串口发送数据“1234”给主机MCU。这套通讯协议非常灵活,可以直接适用于各种需要无线通讯且需要一主控制多从的场景。

2.蓝牙与ESP-NOW双通道遥控器,ESP32C3开发板作为主控芯片,附带有四个按键,有oled显示屏菜单,对应四个从机的按键控制,按下能控制菜单或发送控制指令给主机,同时加入低功耗蓝牙,适配配套手机app。

3.恒域威串口屏UI及通信设计,吐槽一下厂商的上位机编译软件,用起来很玄学,仿真出来正常,但是烧录给串口屏就会白屏或者画面卡住,白屏问题居然把图片jpg转jpg格式一下就行了,但是开机画面卡住很奇怪,只有用例程项目里的mp4视频才可以正常跳转,换别的mp4视频最后就会卡住,甚至我把例程里的视频mp4转mp4格式一下也会卡住,不知道啥原因,总之就是很邪门。串口屏和主板MCU之间是通过串口直连使用了lua脚本实现,点击按钮后主机MCU就会收到对应单字节A1~A4指令。

4.安卓app使用的是Android Studio进行开发,此项目仅支持Android13及以上版本,在设置界面开启权限即再扫描连接即可使用,注意app是通过遥控器板子进行桥联给主机ESP发送指令的,遥控器那块板子必须上电。

5.主板PCB设计

3.项目内容(主从机通信协议的详细解释)

ESP32-C6 联调文档

ESP32-C6 主从联调工程说明

这是一个基于 ESP-IDF 的 ESP32-C6 主从通信测试方案,包含:

  • 主机端:带 1.47 寸 LCD 的控制主机
  • 从机端:基于 ESP-NOW 的从机节点
  • 通信链路:UART + ESP-NOW
  • 典型用途:主从控制联调、无线状态下发、串口桥接验证、在线状态显示

当前系统不是通用模板,更偏向联调、演示和功能验证场景。

系统拓扑

当前默认通信链路如下:

主机串口输入 -> 主机 ESP32-C6 -> ESP-NOW -> 4 个从机
从机状态回包 -> ESP-NOW -> 主机 ESP32-C6 -> LCD 显示在线情况
外部 MCU -> 从机 UART -> 从机 ESP32-C6 -> ESP-NOW -> 主机
主机消息 -> ESP-NOW -> 从机 ESP32-C6 -> UART -> 外部 MCU

其中:

  • 主机负责接收串口控制命令、广播状态、显示从机在线状态
  • 从机负责接收主机广播、提取属于自己的状态位、通过 UART 回传给外部设备,并可将 UART 收到的字节转发给主机

通信协议

主机广播格式

主机通过 ESP-NOW 广播如下字符串:

MSG#1234@5678ms

含义如下:

  • 1234:4 个从机当前控制状态
  • 5678ms:主机启动后的时间戳

从机状态提取规则

从机通过 SLAVE_NUMBER1234 中提取属于自己的状态位:

  • SLAVE_NUMBER = 1:千位
  • SLAVE_NUMBER = 2:百位
  • SLAVE_NUMBER = 3:十位
  • SLAVE_NUMBER = 4:个位

例如:

MSG#3874@20ms

则:

  • 从机 1 提取 3
  • 从机 2 提取 8
  • 从机 3 提取 7
  • 从机 4 提取 4

从机提取后,会通过 UART 输出:

<状态数字>\r\n

主机工程说明

主机定位

主机端是一个带 LCD 界面的控制中心,主要功能包括:

  • 初始化 Wi-Fi STA 模式,不连接路由器
  • 固定在 ESP-NOW 信道 1
  • 初始化 LCD、背光、LVGL、RGB 灯、UART1
  • 上电后向 4 个从机广播当前状态
  • 接收 4 位串口指令并再次广播
  • 接收从机回包,在 LCD 上显示 D1-D4 在线状态

主机当前功能

  • ST7789T 屏幕驱动,分辨率 172x320
  • LVGL 状态界面
  • WS2812 RGB 灯控制
  • UART1 指令输入,默认波特率 115200
  • ESP-NOW 广播发送与接收
  • 预留 UDP 模块代码,但默认未接入主流程

主机串口协议

主机串口输入规则:

  • 输入必须是 4 位数字
  • 每一位分别代表 1 个从机状态
  • 9999 表示查询当前状态,不修改状态

示例:

0000    清零四个从机状态
1234    依次设置四个从机状态
9999    查询当前状态

主机硬件引脚

  • WS2812 数据口:GPIO8
  • UART1 TX:GPIO18
  • UART1 RX:GPIO19

LCD 接口:

  • LCD SCLK:GPIO7
  • LCD MOSI:GPIO6
  • LCD MISO:GPIO5
  • LCD CS:GPIO14
  • LCD DC:GPIO15
  • LCD RST:GPIO21
  • 背光:GPIO22

主机联调前必须检查

  • 4 个从机 MAC 地址是否替换为真实地址
  • 主从是否工作在同一信道
  • 串口输入是否符合 4 位数字协议

从机工程说明

从机定位

从机端不是 LCD 演示程序,核心功能是:

  • 作为 ESP-NOW 从机与主机通信
  • 通过 UART1 接收外部 MCU 的单字节数据
  • 将 UART 数据转发给主机
  • 解析主机状态消息,并将自身状态通过 UART 回传

适合用于:

  • 主从链路验证
  • 无线状态回传
  • 串口到 ESP-NOW 的桥接测试

从机当前行为

上电后会执行:

  1. 初始化 UART1
  2. 创建 UART -> ESP-NOW 转发队列
  3. 启动串口接收任务,非阻塞读取单字节数据
  4. 启动 ESP-NOW 任务,并以 STA 模式在固定信道上工作
  5. 接收主机消息、解析状态、单播响应主机

从机当前功能

  • UART1 单字节接收与转发
  • ESP-NOW 单播发送与接收
  • 主机状态消息解析
  • SLAVE_NUMBER 提取对应状态位
  • 将状态值以 ASCII 数字加 \r\n 的形式发送到串口
  • 周期性输出通信统计日志

从机硬件与串口

  • UART 端口:UART1
  • 波特率:115200
  • TX 引脚:GPIO4
  • RX 引脚:GPIO6
  • 数据格式:8N1

建议接线:

ESP32-C6 从机外部设备
GPIO4 TX对方 RX
GPIO6 RX对方 TX
GND对方 GND

从机联调前必须检查

  • master_mac 是否改为主机 MAC 地址
  • 主从是否使用同一信道
  • SLAVE_NUMBER 是否设置正确
  • UART 接线是否交叉且共地

联调步骤

1. 准备环境

安装支持 esp32c6 的 ESP-IDF 环境,并确认工具链可用。

2. 配置主机和从机

联调前至少检查:

  • 主机的从机 MAC 地址配置
  • 从机的 master_mac
  • 主从双方 ESP-NOW 信道
  • 从机 SLAVE_NUMBER
  • 主从 UART 引脚与波特率

3. 编译

idf.py set-target esp32c6
idf.py build

首次构建可额外执行:

idf.py reconfigure

4. 烧录并查看日志

idf.py -p <PORT> flash monitor

5. 验证流程

建议按以下顺序验证:

  1. 主机启动后确认 LCD 正常显示
  2. 从机启动后确认 ESP-NOW 初始化成功
  3. 主机发送 1234 类串口命令
  4. 检查从机是否正确提取各自状态位
  5. 检查主机是否收到从机回包并更新在线状态
  6. 检查从机 UART 收到单字节后是否成功转发到主机

已知注意事项

  • 当前默认信道为 1
  • 主机默认按 4 个从机处理
  • 从机 SLAVE_NUMBER 取值范围为 1-4
  • 主机中的 UDP 模块虽然存在,但默认未接入主流程
  • 某些代码注释、启动横幅或旧文档中的引脚说明可能与当前实现不一致,联调时应以实际头文件和代码赋值为准
  • 从机侧有注释提到“信道 6”,但实际配置描述为信道 1,应统一按真实代码配置核对
  • 项目当前更适合联调和演示,不适合作为未经整理的量产版本

故障排查

无法烧录

  • 确认串口号是否正确
  • 尝试降低烧录波特率
  • 长按 BOOT 后重新下载

收不到 ESP-NOW 数据

  • 主从设备信道是否一致
  • 主机和从机 MAC 地址是否填写正确
  • 双方是否都进入 ESP-NOW 工作状态
  • 距离、供电、天线环境是否正常

UART 无数据

  • 是否正确交叉连接:TX -> RXRX -> TX
  • 双方波特率是否一致
  • 是否共地
  • 是否误按旧版引脚说明接线

从机状态值不对

  • SLAVE_NUMBER 是否设置正确
  • 主机消息是否符合 MSG#xxxx@xxxms 格式
  • 主机四位状态顺序是否和从机提取规则一致

主机在线状态误判

  • 从机是否及时回包
  • 当前在线判定窗口较短,网络抖动时可能短暂显示离线

后续建议

如果要把这套工程整理成可复用项目,建议优先补齐:

  1. 将 MAC、信道、串口参数改成可配置项
  2. 增加主从通信时序图
  3. 增加接线图、实物图或 UI 截图
  4. 输出独立的协议文档,统一状态字定义
  5. 清理未接入主流程的模块,避免 README 与代码行为继续偏离

更加详细的项目内容和更新动态请前往Github查看。✧(≖ ◡ ≖✿)有问题欢迎在下方留言,你的建议是我更新的动力!
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇