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       5555painlessMesh  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 * 5 ));
}void receivedCallback( uint32_t from, String &msg ) {Serial.printf("startHere: Received from %u msg=%s\n", from, msg.c_str());
}void newConnectionCallback(uint32_t nodeId) {Serial.printf("--> startHere: New Connection, nodeId = %u\n", nodeId);
}void changedConnectionCallback() {Serial.printf("Changed connections\n");
}void nodeTimeAdjustedCallback(int32_t offset) {Serial.printf("Adjusted time %u. Offset = %d\n", mesh.getNodeTime(),offset);
}void setup() {Serial.begin(115200);mesh.setDebugMsgTypes( ERROR | STARTUP );mesh.init( MESH_PREFIX, MESH_PASSWORD, &userScheduler, MESH_PORT );mesh.onReceive(&receivedCallback);mesh.onNewConnection(&newConnectionCallback);mesh.onChangedConnections(&changedConnectionCallback);mesh.onNodeTimeAdjusted(&nodeTimeAdjustedCallback);userScheduler.addTask( taskSendMessage );taskSendMessage.enable();
}void loop() {mesh.update();
}

程序只有短短 50 几行,可见要实现 ESP-MESH 组网非常简单。接下来我们对这个程序进行讲解。

MESH 鉴权信息

首先在程序的开头,我们引入了 painlessMesh 这个库,以便后续程序可以使用这个库的相关功能:

#include "painlessMesh.h"

接着对 ESP-MESH 组网的一些鉴权信息进行设定,以便具有相同鉴权信息的设备,可以互相组网。其中,MESH_PREFIX 可以理解为 ESP-MESH 网络的账号,MESH_PASSWORD 则是 ESP-MESH 网络的密码,MESH_PORT 为ESP-MESH 网络的端口号。这 3 个信息可以根据你的需要随便修改,只要互相 MESH 组网的设备之间这 3 个信息相同即可。设置完这些信息之后,就可以实例化一个 mesh 对象,用来处理后续的各种信息收发。

#define   MESH_PREFIX     "whateverYouLike"
#define   MESH_PASSWORD   "somethingSneaky"
#define   MESH_PORT       5555painlessMesh  mesh;

MESH 设备发送信息

然后实例化一个 Scheduler 任务管理器 userScheduler,帮助ESP- MESH 网络设备调度他们的任务,比如说定时更新传感器相关的信息,然后将数据发送给其他设备等。Scheduler 任务管理也是 painlessMesh 库推荐使用的方式,因为在 ESP-MESH 网络中要尽量避免延时 delay() 相关的代码。实例化 userScheduler 之后,再来创建一个任务 taskSendMessage,并且调用 sendMessage() 函数,这个函数就是负责向其他设备发送信息的。

Scheduler userScheduler;void sendMessage();Task taskSendMessage( TASK_SECOND * 1 , TASK_FOREVER, &sendMessage );

sendMessage() 函数的具体内容如下,在这个函数中,实现了向其他节点设备发送了一句打招呼的语句。如果我们要向其他设备发送传感器信息或者数据,只要去修改这个函数中的内容即可。

void sendMessage() {String msg = "Hello from node ";msg += mesh.getNodeId();mesh.sendBroadcast( msg );taskSendMessage.setInterval( random( TASK_SECOND * 1, TASK_SECOND * 5 ));
}

MESH 网络回调函数

接下来是几个 painlessMesh 库必备的回调函数实现。

  • receivedCallback() 函数:负责将从其他设备接收到的信息在串口监视器中打印出来;

  • newConnectionCallback() 函数:负责通知有没有新设备接入到 ESP-MESH 网络中;

  • changedConnectionCallback() 函数:负责通知 ESP-MESH 网络连接出现变化,比如有设备离线或有新设备加入等;

  • nodeTimeAdjustedCallback() 函数:负责打印时间同步信息,以确保 ESP-MESH 网络中所有设备的时间是同步的。

void receivedCallback( uint32_t from, String &msg ) {Serial.printf("startHere: Received from %u msg=%s\n", from, msg.c_str());
}void newConnectionCallback(uint32_t nodeId) {Serial.printf("--> startHere: New Connection, nodeId = %u\n", nodeId);
}void changedConnectionCallback() {Serial.printf("Changed connections\n");
}void nodeTimeAdjustedCallback(int32_t offset) {Serial.printf("Adjusted time %u. Offset = %d\n", mesh.getNodeTime(),offset);
}

setup() 初始化设置

在 setup() 初始化程序中,先初始化串口,方便后面打印信息。

Serial.begin(115200);

然后是对 ESP-MESH 网络进行相关初始化设置:

  • 设置打印的调试信息类型为 ERROR 与 STARTUP 等级;

  • 然后根据 MESH_PREFIX、MESH_PASSWORD、userScheduler、MESH_PORT 等信息初始化 MESH 网络;

  • 借着分别设置 onReceive(接收到消息时)、onNewConnection(有新的设备连接时)、onChangedConnections(连接的设备发生变化时)、onNodeTimeAdjusted(节点设备时间调整并同步时)的回调函数,用来处理 ESP-MESH 网络事件。

mesh.setDebugMsgTypes( ERROR | STARTUP );mesh.init( MESH_PREFIX, MESH_PASSWORD, &userScheduler, MESH_PORT );
mesh.onReceive(&receivedCallback);
mesh.onNewConnection(&newConnectionCallback);
mesh.onChangedConnections(&changedConnectionCallback);
mesh.onNodeTimeAdjusted(&nodeTimeAdjustedCallback);

最后在 setup() 中设置定时发送消息任务,以及对任务使能。

userScheduler.addTask( taskSendMessage );
taskSendMessage.enable();

loop() 重复运行

loop() 程序非常简单,只要不断去更新 ESP-MESH 网络即可:

mesh.update();

程序测试

分别将程序上传到 2 块以上的 ESP32 开发板中(或者 ESP8266 开发板也可以),然后分别打开不同的串口监视器,可以看到从其他 ESP-MESH 网络设备上发来的信息,以及一些网络状态变更的信息。

将所有 ESP32(或 ESP8266)设备上电,打开其中一块板子的串口监视器,可以看到从其他不同节点 ID 对应的设备发送过来的消息。

偶尔也会打印出时间同步的消息:

当拔下其中某一块开发板的电源之后,可以看到连接发生变化的消息被打印出来。

当有新的设备上电加入 ESP-MESH 网络时,也可以在串口监视器中看到新设备加入的信息。

这些信息充分说明了 ESP-MESH 具有自组网和自修复的特性,可以自主地构建和维护。

智能家居组网实例

上面初步学习了 ESP-MESH 网络的编程,下面我们修改 basic 程序,接入各种传感器,来实现一个简单的智能家居设备组网实例。

假设房间中有 3 套设备:人体感应器(设备 1 或节点 1)智能灯(设备 2 或 节点 2)温湿度传感器(设备 3 或节点 3),这 3 套设备安装在房间的不同位置,考虑到设备可以随时移动,所以采用 ESP-MESH 组网的方式,对这 3 套设备进行互联互通,设备之间可以互相首发信息,可以根据读取到的信息,进行相应的控制,比如开关灯等。这 3 套设备的主控芯片为 ESP32 或者 ESP8266。

电路图

这 3 套设备的电路图分别如下:

人体感应器(设备 1 或节点 1):ESP8266 主控板 GPIO16 引脚连接人体红外感应传感器,用于检测房间内是否有人:

智能灯(设备 2 或 节点 2):ESP32 主控板 GPIO12 引脚连接 LED 灯,用于控制房间内的智能灯:

温湿度传感器(设备 3 或节点 3):ESP32 主控板 GPIO33 引脚连接 DHT11 温湿度传感器,用于读取房间内的温湿度信息。

设备 1 程序(人体感应)

在前面讲解的 basic 程序的基础之上,我们只需要修改 sendMessage() 函数即可:通过人体红外感应传感器检测房间内是否有人,如果有人的话,发送“Light on”信息,没人的话,发送“Light off”信息给其他设备。

#define PIR_PIN 16void sendMessage() {pinMode(PIR_PIN, INPUT);String msg = "Message from node PIR: ";if ( digitalRead(PIR_PIN) ) {msg += "Light on.";} else {msg += "Light off.";} mesh.sendBroadcast( msg );
}

其余代码不再赘述,完整代码请参考附件 esp_mesh_pir 程序。

设备 2 程序(LED 灯控制)

在前面讲解的 basic 程序的基础之上,我们只需要修改 receivedCallback() 函数即可:如果从其他设备中接收到的信息包含“Light on”命令,就打开 LED 灯,否则熄灭 LED 灯。

#define LED_PIN 12void receivedCallback( uint32_t from, String &msg ) {pinMode(LED_PIN, OUTPUT);Serial.printf("startHere: Received from %u msg=%s\n", from, msg.c_str());if (msg.indexOf("Light on") > 0) {digitalWrite(LED_PIN, HIGH);} else {digitalWrite(LED_PIN, LOW);}
}

其余代码不再赘述,完整代码请参考附件 esp_mesh_led 程序。

设备 3 程序(温湿度读取)

读取 DHT11 温湿度传感器要做一些额外的设置,首先在程序开头引入 DHT 库文件:

#include <DHT.h>

然后对 DHT 温湿度传感器的引脚、类型进行设置:

#define DHTPIN     33
#define DHTTYPE    DHT11DHT dht(DHTPIN, DHTTYPE);

在 setup() 中开启传感器:

dht.begin();

最后在前面讲解的 basic 程序的基础之上,需要修改 sendMessage() 函数:定时地将温度和湿度的数据发送给其他设备。

void sendMessage() {String msg = "Message from node DHT.";msg = msg + " Temperature: " + String(dht.readTemperature());msg = msg + " Humidity: " + String(dht.readHumidity());mesh.sendBroadcast( msg );
}

其余代码不再赘述,完整代码请参考附件 esp_mesh_dht 程序。

效果展示

将上述代码分别上传到指定的设备节点中。打开其中一个设备 1(节点 1:人体感应)的串口监视器,可以看到另外两个设备发送过来的信息,其中就包含了温度和湿度的值。

再打开设备 3(节点 3:温湿度读取)的串口监视器,同样可以看到另外两个设备发送过来的信息,其中就包括是否开关灯的命令。

最后再查看一下设备 2(节点 2:LED 灯控制)的反馈情况:当设备 1 检测到附近有人活动时,设备 2 上的 LED 灯就会被点亮,否则熄灭。

所有设备按照我们预期的情况运行,智能家居组网实验成功!

总结

ESP-MESH 是一种非常好用的组网方式,摆脱了 WiFi 网络距离的限制,同时组网又非常方便,可以应用在很多智能家居或者工程项目中,方便地进行数据交互与传送。由于本项目只是一个简单的演示,所以并没有对发送的信息或者数据进行包装,后续可以改进数据发送的格式,比如采用 JSON 格式,就可以发送与解码更加丰富的信息了。

以上就是本教程的全部内容,我是铁熊,下期再见!

代码下载

关注公众号“铁熊玩创客”,后台回复“ESP-MESH”,就可以获取本次课程的全部源码下载链接。


欢迎转发朋友圈。如需转载,请注明出处和原作者。

点个在看支持一下吧 ↓↓↓

ESP-MESH 无线组网,让智能家居通信更方便 | ESP32轻松学(Arduino版)相关推荐

  1. CH57X/CH58X系列BLE Mesh无线组网方案

    方案简介 BLE Mesh是蓝牙官方组织(SIG)推出的组网的规范,以BLE为载体,形成星型网状的多对多拓扑结构,网络中的每一台设备都可以与其它设备进行通信.沁恒微BLE Mesh无线组网方案已经全面 ...

  2. Zigbee费尽心思做mesh网究竟在智能家居中有什么用?

    在物联网蓬勃发展的浪潮下,智能家居的热度也随之不断升温.由于智能家居的安全.节能.舒适.便利.高效等诸多特点,越来越多的客户开始接受和开发智能家居单品和系统.在中国推广Zigbee技术的这几年里,我有 ...

  3. 无线WiFi技术智能家居的优选方案,物联网WiFi芯片模块应用

    智能家居是以家庭居住场景为载体,以物联网为关键技术,融合自动控制技术.计算机技术.以及新兴发展的大数据.人工智能.云计算等技术:将家电控制.环境监控.影音娱乐.信息管理等功能有机结合,通过对家居设备线 ...

  4. zigbee协议技术无线模块对智能家居市场前景分析

    Zigbee无线传输技术Zigbee被众多企业选择智能家居营销手段,无论是海尔.ZTE等传统大企业,还是未知的小公司,Zigbee技术也被认为是最有可能改变我们当前生活的通信技术之一,如WiFi无线模 ...

  5. DIY智能家居设备:基于esp32和阿里云云智能APP完成智能灯泡的开发

    esp32 开发 一. 芯片介绍 ESP32 是一套 Wi-Fi (2.4 GHz) 和蓝牙 (4.2) 双模解决方案,集成了高性能的 CPU 内核.超低功耗协处理器和丰富的外设.ESP32 采用 4 ...

  6. 超实用!如何让智能家居网络更安全?

    前言: 虽然是有用的工具,但智能设备也可能带来巨大的风险,因为它们与互联网的连接会引发网络攻击的潜在风险. 对于安全学习不懂的,或者不知道怎么学习的可以来我的QQ群:581499282 一起学习交流, ...

  7. 为何魅族智能家居生态圈更值得期待

    极客网1月30日(北京)现在,如果把手机厂商的竞争简单看做是手机的拼杀,未免有些落伍.因为,手机厂商除了在手机硬件上绞尽脑汁外,几乎已经无不例外的加入到了生态圈竞争中,苹果.三星.魅族和小米都身在其中 ...

  8. ESP-NOW:竟然还有如此好用的无线通信方式 | ESP32轻松学(Arduino版)

    用 Arduino 玩转 ESP32 系列历史文章目录: ESP32 概述与 Arduino 软件准备 ESP32 GPIO接口编程入门 蓝牙翻页笔(蓝牙键盘与PPT 控制器) B 站粉丝计数器 Si ...

  9. 用笔记本改装智能家居服务器,一年之后,改装4G版小米笔记本电脑的可行性

    前面写过一篇<分析支持4G LTE的小米新款笔记本电脑的必要性>,昨天小米正式发布了这款4G版的笔记本电脑,大约增加了1200元钱,送全年48GB流量. 在我来说,支持4G上网是一件好事, ...

  10. 通信协议规格_小米和阿里巴巴定义智能家居通信协议“蓝牙Mesh”

    阿里巴巴.小米等公司加入全新蓝牙技术联盟"智能家居专项组",其中天猫精灵和小爱同学在市场上占有较大的份额,将推动Mesh网络技术在智能家居市场的发展. 随着越来越多的市场领导者针对 ...

最新文章

  1. 4.聚类的五种主要算法
  2. 中国首款L4级Robovan发布!文远知行商用落地两条腿走路
  3. 基于 Ubuntu 搭建微信小程序服务
  4. 谷歌语音转录背后的神经网络
  5. 如何把薪资谈高一倍?请看大厂offer拿到手软的ML大神自述
  6. “约见”面试官系列之常见面试题之第五十六篇之typeof返回的数据类型(建议收藏)
  7. corosync+openais+pacemaker+web
  8. Python实现过段时间计算机自动锁屏小程序
  9. ionic 网站放在服务器,Ionic4 服务器插件-服务器Httpd - Ionic Native
  10. [Selenium+Java] Selenium Framework: Keyword Driven Hybrid
  11. 计算机软件服务可以自开专票,可以自开专票的小规模纳税人到底有几类?
  12. 怎么用数学绘图软件验证扇形面积公式?
  13. 区块链搭建联盟链及控制台安装
  14. 不要再被骗了------QQ盗号原理大揭秘
  15. 全球 500 亿条数据被 Elasticsearch 勒索者删除
  16. 分析浊音、清音爆破音的时域及频域特性
  17. 服务器hostname命名规范汇总
  18. *一篇看了心有所感且文风特别好的文章**
  19. 让li 横排显示的CSS代码
  20. 一篇关于业务可用性探测的纯“干”货,榨出一滴水算我输!

热门文章

  1. python构造方法的方法名_构造方法是类的一个特殊方法,Python中它的名称为()。
  2. 项目1在线交流平台-7.构建安全高效的企业服务-5.redis高级数据结构应用-统计网站数据-独立访客和日活跃用户
  3. 什么是MAC多播地址
  4. MAC强制卸载软件 如遇“不能修改或删除“*”,因为macOS需要它”
  5. 模拟游戏在设计上是如何处理对仿真性的追求的?
  6. mysql不停机升级_线上不停机部署mysql主从
  7. .NETReflector的破解
  8. NB-IoT关键信令流程 Attach
  9. container_of()宏
  10. 自我介绍到底有多重要?如何做好自我介绍?