ESP32 轻松学系列文章目录:
- ESP32 概述与 Arduino 软件准备
- ESP32 GPIO接口编程入门
- 蓝牙翻页笔(PPT 控制器)
- 新冠肺炎疫情数据实时显示器
- B 站粉丝计数器
- Siri 语音识别控制 LED 灯
- Siri 语音识别获取传感器数据
- 彩屏显示入门(一):驱动库设置与彩屏效果展示
- 彩屏显示入门(二):颜色设置与文本显示
- ESP-NOW 无线通信
想象一下,在一些智能家居场合或者工业控制场合,如果需要在很多设备之间满足两两可以互联互通的通信要求,你有什么比较好的通信方案么?当然我们可以用线缆将它们连接在一起,但是这样做不仅距离限制比较多,而且可能需要重新施工布线,成本比较大!
今天的课程,我们将向您介绍 ESP-MESH 组网技术,不仅可以大大降低距离的限制,而且可以方便地实现多设备之间互联互通的要求,在实现难度上也会大大降低。
ESP-MESH 简介
ESP-MESH 是一套建立在 Wi-Fi 协议之上的网络协议。ESP-MESH 允许分布在大范围区域内(室内和室外)的大量设备(下文称节点)在同一个 WLAN(无线局域网)中相互连接。ESP-MESH 具有自组网和自修复的特性,也就是说 mesh 网络可以自主地构建和维护。
传统基础设施 Wi-Fi 网络是一个“单点对多点”的网络。这种网络架构的中心节点为接入点 (AP),其他节点 (Station) 均与 AP 直接相连。其中,AP 负责各个 Station 之间的仲裁和转发,一些 AP 还会通过路由器与外部 IP 网络交换数据。在传统 Wi-Fi 网络架构中,1)由于所有 Station 均需与 AP 直接相连,不能距离 AP 太远,因此覆盖区域相对有限;2)受到 AP 容量的限制,因此网络中允许的 station 数量相对有限,很容易超载。
ESP-MESH 与传统 Wi-Fi 网络的不同之处在于:网络中的节点不需要连接到中心节点,而是可以与相邻节点连接。各节点均负责相连节点的数据中继。由于无需受限于距离中心节点的位置,所有节点仍可互连,因此 ESP-MESH 网络的覆盖区域更广。类似地,由于不再受限于中心节点的容量限制,ESP-MESH 允许更多节点接入,也不易于超载。
准备工作
我们使用 Arduino 软件来编写本项目的程序,使用 ESP32 与 ESP8266 开发板。至于如何在 Arduino 中配置 ESP32 与 ESP8266 的开发环境,请查看 ESP32 概述与 Arduino 软件准备章节。
要完成本课程的项目,需准备如下材料:
- ESP32 主控板 × 2;
- ESP8266 主控板 × 1;
- LED 灯 × 1;
- 人体红外传感器 × 1;
- DHT11 温湿度传感器 × 1;
安装 painlessMesh 库
要在 Arduino IDE 中使用 ESP-MESH,我们需要先安装一个库来支持 ESP-MESH 组网程序的编写,这个库的名称就是:painlessMesh
。根据这个库的官方介绍,这个库可以简化 ESP-MESH 的程序编写,让你更加专注于功能的实现,而不必关心 ESP-MESH 网络架设与管理的细节。
painlessMesh is a library that takes care of the particulars of creating a simple mesh network using esp8266 and esp32 hardware. The goal is to allow the programmer to work with a mesh network without having to worry about how the network is structured or managed.
安装这个库也很简单,只需要打开 Arduino 软件的库管理器,搜索 painlessMesh
,即可选择对应的版本进行安装。这里推荐安装最新版。
在安装 painlessMesh 库的时候,如果提示你需要安装其他依赖库,选择同意安装全部库就行。
安装完库,就可以开始 ESP-MESH 组网编程了。
ESP-MESH 基础讲解
先打开 painlessMesh 库的基础示例:basic.ino
程序,来了解一下这个库的基本使用方法。basic 示例程序路径如下:Arduino IDE → 文件 → Painless Mesh → basic,如下图所示。
basic.ino 程序如下:
#include "painlessMesh.h"
#define MESH_PREFIX "whateverYouLike"
#define MESH_PASSWORD "somethingSneaky"
#define MESH_PORT 5555
painlessMesh mesh;
Scheduler userScheduler;
void sendMessage();
Task taskSendMessage( TASK_SECOND * 1 , TASK_FOREVER, &sendMessage );
void sendMessage() {
String msg = "Hello from node ";
msg += mesh.getNodeId();
mesh.sendBroadcast( msg );
taskSendMessage.setInterval( random( TASK_SECOND * 1, TASK_SECOND <