回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页
best-icon

DF Beetle ESP32 C3MESH组网记 中等

头像 tiger_zc 2023.06.06 137 5

       听到入选DF的ESP 32 C3样品试用者,心里真的很高兴,感谢DF一贯以来的信任和支持,可是货还没有到手,甲方爸爸的十三道+金牌就来了,催命鬼一样,急活,没办法,给钱干活,天经地义,这年月,有活干也不敢往外推啊!真是苦逼啊!每天忙里偷闲看看群里的消息,眼睁睁看着大家在群里热闹地讨论各种技术和玩法,心里那个痒痒啊,无奈实在是没法子,只是拆开“糖果”包装看了看,又默默装了回去。。。。。。

       好不容易周末工作告一段落,打算抓紧补作业,谁知道甲方爸爸还是不愿意放过我,大清早就开始接二连三各种电话,结果合作方的人告诉我就那样,让我习惯就好。。。。。。

        废话不说了,说多了都是泪,抓紧时间开始补作业。

        我的项目是想要做一套智能家具控制系统,首先就需要C3联网,就从这里开始下手研究。

 

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 数量相对有限,很容易超载。

image.png

步骤1 物料准备

材料清单

步骤2 下载并安装Arduino IDE

下载网址Software | Arduino,现在最新的版本是2.1.0

image.png

下载还是挺慢的,要做好心里准备,耐心等待。。。。。

我有下好的包,大家有要的可以自取,阿里云网盘地址如下:

arduino-ide_2.1.0_Windows_64bit.exe https://www.aliyundrive.com/s/tr7RrzUvBVU 

 

步骤3 配置环境

首次使用Beetle-ESP32-C3,您需要了解以下步骤,并进行配置

1、添加IDE中的json链接

2、下载主控的核心

3、选择开发板以及串口

4、了解串口监视器

 

首先添加IDE中的json链接,打开IDE,File➡Preferences➡settings,把language选中文简体,英文好的可以飘过,将如下链接地址复制到最下面Additional boards manager URLs:

https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json

image.png
image.png

然后点击OK,界面变中文菜单,开始更新板卡

点击工具➡开发板➡开发板管理器,剧本上应该是,在窗口左侧输入ESP32,选择安装(但实际是搜不出来的,有老师说科学上网可以,但我搬来梯子发现还是不行,最后用了群里王老师的安装包),我这个是已经安装好的界面。ESP32库的安装包的地址:esp32_package_2.0.7_arduinome.exehttps://www.aliyundrive.com/s/1doLb9b6VBm 

image.png

 

结果要通过串口显示,必须要在开始前做好如下设置(当您选择 Disabled 时,串口为RX(20)、TX(21),如果您需要通过USB在Arduino监视器上打印,您需要选择Enable),否则串口监视器里面数据是不会变化的。

(注:我这里做了设置,正常烧录完后,发现串口没数据,还以为哪里出了问题,最后在群里老师的提示下,发现程序设置里面又变回Disabled了,改回来数据就正常了。)

image.png

下载安装 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 软件的库管理器(2.1.0版本的库管理器如下图所示),搜索 painlessMesh,即可选择对应的版本进行安装。这里推荐安装最新版。

image.png 

在安装 painlessMesh 库的时候,如果提示你需要安装其他依赖库,选择同意安装全部库就行。

安装完库,现在,配置都已经完成,准备烧录示例程序,就可以开始 ESP-MESH 组网编程了完成组网测试。

 

 

步骤4 联网测试

先打开文件打开 painlessMesh 库的基础示例:basic.ino 程序,来了解一下这个库的基本使用方法。basic 示例程序路径如下:Arduino IDE → 文件 → Painless Mesh → basic,如下图所示(在最下面)。 

image.png

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 * 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       5555

painlessMesh  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(); 

image.png

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

image.png

现在,就可以看到串口监视器里滚动的数据,证明开发板之间已经可以正常通讯了

 

注: 本文的部分内容,出自bilibili,作者:Brookswk https://www.bilibili.com/read/cv18629950 ,在此对原作者表示感谢!还有群里一起探讨和帮助我的老师,在此深表感谢!

 

评论

user-avatar
  • 花生编程

    花生编程2023.08.09

    赞赞赞赞

    0
    • 花生编程

      花生编程2023.08.09

      厉害厉害

      0
      • 三春牛-创客

        三春牛-创客2023.08.06

        赞赞赞赞

        0
        • 三春牛-创客

          三春牛-创客2023.08.06

          厉害厉害

          0
          • hacker_

            hacker_2023.06.21

            666

            0