合集地址:Arduino中文社区
打开方式
本系列教程建议在电脑端打开更快
手机端切换文章请点击左下角专题目录
文章内切换章节请点击左下角文章大纲
资料下载、教程持续更新:
点灯开源项目分享群2:QQ 913319679
MESH效果视频:
先买了10个做测试,保证10个之内不会有问题
https://www.bilibili.com/video/BV1dK421k7jQ/
本次示例使用了10个继电器¥2
和
基于ESP8285的ESP01S模组
8285外部特性与8266一样,可用8266固件烧录上去,区别仅仅是程序存储器flash闪存集成在单片机内部
本教程内容复杂,主要是给需要mesh和APP翻页实现 额度复用 的群友看下做法
推荐做过入门教程再来做本教程(入门教程 https://arduino.me/s/35?aid=2757),
并且最好先试用painlessmesh官方例程测试
painlessMesh库自己下的是直接烧录basic例程、bridge例程实现从机主机
还有蓝牙mesh能耗低得多,有需要自己去学一下esp官方的BLE MESH
ESP官方WiFiMesh也不错
ESPNOW更加牛,无连接,支持电池:
【使用esp8266,ESP-NOW协议,做一个迷你遥控器】 https://www.bilibili.com/video/BV1Pq4y1N71t
配套硬件开源地址ESP8266遥控器 - 嘉立创EDA开源硬件平台
注意:我提供的文件夹里面的三个库都爆改过,只能用于我的代码,后文环境搭建写了
mesh属于点灯官方的收费项目,我做的这个可能影响他们营收,所以就不提供咨询了,看得懂的自己用。
虽然API以及本地通讯状态数组都弄好了,但是估计也没几个会的,影响不大。
翻页效果:可带几百台设备
预计下个版本更新设备种类,届时将支持不同种类自动调整数据数组大小
调试组件暗藏技巧
按钮靠边,选最大确定,把界面卡宽一截,然后拖调试框到最底下即可隐藏
目录
时间戳
全套资料下载
说明书预览
一、软件资料、硬件材料说明
二、软件开发环境搭建
三、设备端程序使用注意事项*3**(重点看这就行)**
四、开发笔记(嫑看没啥用)
时间戳
本文更新时间:2024年3月14日
代码资源更新时间:2024年2月18日
下一期代码 更新预计:2024年4月20日前
本人全部合集https://arduino.me/s/35?aid=2757
全套资料下载(下载后Word档说明书查看更清晰)
资料内容:
仅爆改库+源代码
MESH1.0.rar
环境搭建参考后文,软件库务必装这次提供的
下载链接:目前仅支持QQ 群的群文件
点灯开源项目分享群2:QQ 913319679
此群只提供各类开源分享,可向群主投稿,为避免打扰,不聊天
教程等任何问题都可找群主,看见就回
群文件说明:
资料注意:
调试出现任何问题先看【新手必看】[Blinker]2024最新-常见问题大全
如有群聊咨询需要,可在开源群找群主。也可前往点灯官网>开发文档>加点灯2000人官方群。
一、软件资料、硬件材料说明
1.资料使用流程:
此处顺带展示开发流程,具体用法见后文
Blinker-DHT11-继电器-纯小白入门超详细版全套教程资料.rar
为扩展阅读
2.可用于以下硬件(不是全买!有其中一个就行,我用的在视频里有)
本程序通过修改引脚定义 可支持 以下芯片、开发板及其配件(见后文)
(1)支持的主控板:
基于ESP8266EX裸芯片制作的电路板
基于ESP8266的ESP-01、ESP01s模组
基于ESP8285的ESP-8285模组(外部特性与8266一样,可用8266固件烧录上去,区别仅仅是程序存储器flash闪存集成在单片机内部)
基于ESP8266的ESP12E模组的NodeMCU开发板
基于ESP8266的ESP12F模组的wemos/mini开发板
其它ESP系列开发板如ESP32等 请注意看电路图确定引脚定义,避免冲突!
硬件您可以在ESP8266系列模组专题 | 安信可科技查看选型表并下载规格书
也可以直接查看本文资料附带的
中的规格书或电路图
(2)支持的配件:
A:ESP-01、ESP-01s、ESP-8285模组适用配件:
DHT11底板、DHT20底板、DHT22底板 ESP01s单路继电器 ESP01s双路继电器
搜索关键词:
DHT11温湿度传感器WIFI节点模块底座适用于ESP8266ESP-01/01S板
继电器底板智能插座WIFI模块适用于ESP8266ESP-01/01S板
B:NodeMCU/WEMOS/ESPmini开发板适用配件:
5V继电器
DHT11模块
DHT20、DHT22模块
接线图见第六章:修改引脚定义
第二节注意事项:不按本教程配置环境出现任何问题概不负责。
二、软件开发环境搭建
(环境和入门教程的不一样,Mesh库和Blinker库都是改过的的记得替换)
群里下载Blinker-DHT11-继电器-纯小白入门超详细版全套教程资料.rar
解压,然后打开
可见
其中exe尽量管理员身份运行
1.安装Arduino
右键管理员身份运行
装过的忽略,Arduino2.0亦可,后面几步尽量一样
2.安装硬件库(重要)
Arduino开发板库添加有两种方式,推荐点灯官网资源下载栏的离线安装包(已经附带):
1.离线安装:右键管理员身份运行本教程附带的离线安装包
2.在线安装(很慢不推荐除非有VPN):Arduino>工具>开发板>开发板管理器,搜索ESP8266后点击安装
注:ESP8285直接用8266即可兼容,他俩区别仅在于硬件上8285自带flash,可用IO更多,不像8266多一个flash芯片,占用SPI了
注:ESP32不做人脸识别,做点灯运行2.0.7; 不做点灯,做人脸识别运行1.0.6
安装完硬件库后可以:
检查开发板库的位置C:\Users\用户名\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266
手动点击文件夹谢谢。
自动前往在地址栏粘贴**%LOCALAPPDATA%/Arduino15/packages**
注:用户名换成你自己的用户名!
注:不管Arduino装在哪,这个硬件库都装到了C盘的用户文件夹!
注:AppData是隐藏文件夹,要点击查看
开启隐藏的项目
才能查看
警告:安装过的请检查:版本不要低于2.7.4,不要高于3.0.2(3.1开始会与点灯库冲突)
如果安装过其他版本的esp32 package,请先删除或剪切走,再使用本安装包,
删除方法:文件管理器地址栏输入 %LOCALAPPDATA%/Arduino15/packages,回车进入,然后删除掉其中的esp32文件夹
3.安装软件库(重要!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!和入门教程不一样之处)
1.手动复制(推荐):
把 本次教程压缩包Blinker+MESH1.0.rar里的:
ArduinoJson
blinker-library-master-wifi-realtime
painlessMesh-develop
这三个文件夹复制或剪切到C:\Users\用户名\Documents\Arduino\libraries
可以点击此电脑>文档>Arduino>libraries进入此文件夹
注:不管Arduino装在哪,这个软件库都在C盘的用户文件夹!
2.自动添加(不推荐):Arduino>项目>加载库>添加.ZIP库
Blinker等第三方软件库文件位置C:\Users\用户名\Documents\Arduino\libraries
4.设置Arduino——管理网址、行号、折叠、编译信息
打开Arduino>文件>首选项>附加开发板管理器网址>
,粘贴:
https://arduino.esp8266.com/stable/package_esp8266com_index.json
http://x.iaoye.xin/package_esp8266com_index.json
http://wechat.doit.am/package_esp8266com_index.json
https://github.com/esp8266/Arduino/releases/download/2.5.0/package_esp8266com_index.json
https://raw.githubusercontent.com/DFRobot/FireBeetle-ESP8266/master/package_firebeetle8266_index.json
https://dl.espressif.com/dl/package_esp32_index.json
https://arduino.me/packages/esp32.json
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
用Ctrl+V粘贴!鼠标贴不了!
5. BlinkerAPP
安卓最新版本在官网下点灯科技-点灯物联网解决方案
iOS直接在APPStore搜Blinker(默认最新)
另外iOS最新版本号与安卓不同步
6. APP界面配置
先申请设备(设备数量已达上限,免费获取,见第五章第3节)
在Blinker APP右上角点击⊕>添加设备>独立设备>网络接入>复制授权码>QQ发电脑>贴至程序
界面配置Mesh版:
{¨version¨¨2.0.0¨¨config¨{¨headerColor¨¨transparent¨¨headerStyle¨¨light¨¨background¨{¨img¨´´}}¨dashboard¨|{¨type¨¨deb¨¨mode¨É¨bg¨É¨cols¨Ñ¨rows¨Ì¨key¨¨debug¨´x´É´y´¤H}{ßA¨tex¨¨t0¨´´¨t1¨´´¨size¨¤EßD˨ico¨¨fad fa-thermometer-three-quarters¨ßEÍßFÊßGßK´x´Ë´y´Ï¨lstyle¨Ê¨clr¨¨#076EEF¨}{ßAßIßJ´´ßK´´ßL¤EßDËßMßNßEÍßFÊßG¨t5¨´x´Ë´y´¤AßPßQßOÊ}{ßAßIßJ´´ßK´´ßL¤EßDËßMßNßEÍßFÊßG¨t6¨´x´Ë´y´¤BßPßQßOÊ}{ßAßIßJ´´ßK´´ßL¤EßDËßMßNßEÍßFÊßG¨t2¨´x´Ë´y´ÐßPßQßOÊ}{ßAßIßJ´´ßK´´ßL¤EßDËßMßNßEÍßFÊßG¨t9¨´x´Ë´y´¤EßPßQßOÊ}{ßAßIßJ´´ßK´´ßL¤EßDËßMßNßEÍßFÊßG¨t8¨´x´Ë´y´¤DßPßQßOÊ}{ßAßIßJ´´ßK´´ßL¤EßDËßMßNßEÍßFÊßG¨t4¨´x´Ë´y´ÒßPßQßOÊ}{ßAßIßJ´´ßK´´ßL¤EßDËßM´´ßEÑßFËßG¨calindar¨´x´É´y´ÉßOÏßPßQ}{ßAßIßJ´´ßK´´ßL¤EßDËßMßNßEÍßFÊßG¨t7¨´x´Ë´y´¤CßPßQßOÊ}{ßAßIßJ´´ßK´´ßL¤EßDËßMßNßEÍßFÊßG¨t10¨´x´Ë´y´¤FßPßQßOÊ}{ßAßIßJ´´ßK´´ßL¤EßDËßMßNßEÍßFÊßG¨t3¨´x´Ë´y´ÑßPßQßOÊ}{ßA¨btn¨ßM¨fal fa-power-off¨ßCÊßJ¨文本1¨ßK¨文本2¨ßDËßEËßFÊßG¨b3¨´x´Ï´y´ÑßOÌ}{ßAßbßMßcßCÊßJßdßKßeßDËßEËßFÊßG¨b4¨´x´Ï´y´ÒßOÌ}{ßAßbßMßcßCÊßJßdßKßeßDËßEËßFÊßG¨b5¨´x´Ï´y´¤AßOÌ}{ßAßbßMßcßCÊßJßdßKßeßDËßEËßFÊßG¨b9¨´x´Ï´y´¤EßOÌ}{ßAßbßMßcßCÊßJßdßKßeßDËßEËßFÊßG¨b7¨´x´Ï´y´¤CßOÌ}{ßAßbßMßcßCÊßJßdßKßeßDËßEËßFÊßG¨b10¨´x´Ï´y´¤FßOÌ}{ßAßbßMßcßCÊßJßdßKßeßDËßEËßFÊßG¨b8¨´x´Ï´y´¤DßOÌ}{ßAßbßM¨fad fa-arrow-alt-circle-left¨ßCÉßJ¨上一页¨ßKßeßDËßEÊßFÊßG¨last¨´x´Ë´y´¤GßOÍ}{ßAßIßJ´´ßK´´ßL¤EßDËßM´´ßEÑßFËßG¨weather¨´x´É´y´ÍßOÏßPßQ}{ßAßIßJ¨当前:第1页¨ßK´´ßL¤EßDËßM´´ßEËßFÊßG¨page¨´x´Ì´y´¤GßOÉßP¨#595959¨}{ßAßIßJ´´ßK´´ßL¤EßDËßM´´ßEÑßFËßG¨runtime¨´x´É´y´ËßOÏßPßQ}{ßAßbßMßcßCÊßJßdßKßeßDËßEËßFÊßG¨b1¨´x´Ï´y´ÏßOÌ}{ßAßbßMßcßCÊßJßdßKßeßDËßEËßFÊßG¨b6¨´x´Ï´y´¤BßOÌ}{ßAßbßMßcßCÊßJßdßKßeßDËßEËßFÊßG¨b2¨´x´Ï´y´ÐßOÌ}{ßAßbßMßcßCÊßJßdßKßeßDËßEËßFÊßG¨all¨´x´Ï´y´¤GßOÌ}{ßAßbßM¨fad fa-arrow-alt-circle-right¨ßCÉßJßdßKßeßDËßEÊßFÊßG¨next¨´x´Î´y´¤GßOÍ}{ßAßIßJ¨节点1¨ßKßeßL¤EßDËßM´´ßEËßFÊßG´m1´´x´É´y´ÏßPßQ}{ßAßIßJ¨节点2¨ßKßeßL¤EßDËßM´´ßEËßFÊßG´m2´´x´É´y´ÐßPßQ}{ßAßIßJ¨节点3¨ßKßeßL¤EßDËßM´´ßEËßFÊßG´m3´´x´É´y´ÑßPßQ}{ßAßIßJ¨节点4¨ßKßeßL¤EßDËßM´´ßEËßFÊßG´m4´´x´É´y´ÒßPßQ}{ßAßIßJ¨节点5¨ßKßeßL¤EßDËßM´´ßEËßFÊßG´m5´´x´É´y´¤AßPßQ}{ßAßIßJ¨节点6¨ßKßeßL¤EßDËßM´´ßEËßFÊßG´m6´´x´É´y´¤BßPßQ}{ßAßIßJ¨节点7¨ßKßeßL¤EßDËßM´´ßEËßFÊßG´m7´´x´É´y´¤CßPßQ}{ßAßIßJ¨节点8¨ßKßeßL¤EßDËßM´´ßEËßFÊßG´m8´´x´É´y´¤DßPßQ}{ßAßIßJ¨节点9¨ßKßeßL¤EßDËßM´´ßEËßFÊßG´m9´´x´É´y´¤EßPßQ}{ßAßIßJ¨节点10¨ßKßeßL¤EßDËßM´´ßEËßFÊßG¨m10¨´x´É´y´¤FßPßQ}÷¨actions¨|¦¨cmd¨¦¨switch¨‡¨text¨‡´on´¨打开?name¨¨off¨¨关闭?name¨—÷¨triggers¨|{¨source¨ß1D¨source_zh¨¨开关状态¨¨state¨|´on´ß1G÷¨state_zh¨|´打开´´关闭´÷}÷´rt´|÷}
文本完整复制粘贴至QQ发送到手机,贴到APP界面配置(清空原配置),并点击更新
退回主页面后再进去就出现界面
7.打开程序
1.从文件管理器:打开项目文件夹 >打开设备端程序>主机GateWay_WiFi.ino/从机Subdevice_WiFi.ino
2.从已经开启的Arduino(比从文件管理器更快,且省运行内存):
三、设备端程序使用注意事项*3
1.原理:主机STA通道上连路由器登录Blinker;AP通道下连各mesh从机。从机:AP+STA都用来mesh。
主机(网关)程序 GateWay_WiFi.ino
从机(子设备)程序 Subdevice_WiFi.ino
2.所有设备(主机从机)必须必须必须和“路由器或手机热点”在“同一个”WiFi信道,不然主机不能边连Blinker边连从机
(ESP硬件设计导致必须在同一物理天线上分时跑AP和STA时,频道不能变)
#ifndef MESH_CHANNEL //若未定义信道则定义:
#define MESH_CHANNEL 1 //1-13任意,mesh库默认1,必须跟着路由器信道设定,必须跟着路由器信道设定,必须跟着路由器信道设定
#endif
所以使用前先注释主机程序 GateWay_WiFi.ino 的 meshCheck();函数,只留Blinker.run()函数,让主机连WiFi测一下路由器WiFi信道。
void loop()
{
Blinker.run();//Blinker通信
//meshCheck(); //用//这样注释!!!!!!!!!!!!!!!!!!!!
看串口监视器,我写了个打印wifi.channel().
//WiFi状态
BLINKER_LOG( (WiFi.status() == WL_CONNECTED)?"WiFi已连接:":"wifi已断开",
",名称:",WiFi.SSID(),
",密码:", WiFi.psk(),
",信号强度:",WiFi.RSSI(),"dBm",
",信道:",WiFi.channel(),
",mesh设备数:",_subCount
);
类似下图
串口监视器看到这:就知道了信道11
WiFi已连接,名称:IoT,密码:1234567890,信号强度:-67dBm,信道:1
然后把数值1改到主机、从机程序的这里即可
#ifndef MESH_CHANNEL //若未定义信道则定义:
#define MESH_CHANNEL 1 //1-13任意,mesh库默认1,必须跟着路由器信道设定
#endif
3.从机烧录时记得改:
DEVICE_ID 编号,对应APP按钮号。目前对接了10路按钮支持翻页。
MESH_DATA_COUNT 所需数据点数,决定上传下载时数组有多少个元素(元素全部浮点数,实现bool、int、float都可传递,满足智能家居大部分需求)
DEVICE_TYPE 类型目前就弄了个MeshRelay,后期出专用板的时候会有各种各样设备名称
//以下参数按需修改
#ifndef MESH_DATA_COUNT //若未定义本设备数据数量则:
#define MESH_DATA_COUNT 5 //按表定义
#endif
#ifndef DEVICE_TYPE //若未定义本设备类型则:
#define DEVICE_TYPE "MeshRelay" //按表定义
#endif
#ifndef DEVICE_ID //若未定义本设备类型则:
#define DEVICE_ID 1 //按序
#endif
4.如果要改功能的话
主机给从机叫下载用download_array[]数组
从机给主机叫上传用upload_array[]数组
主机通过类库存储数据,实现不同设备的便捷存储
通过此API函数修改或读取不同子设备的数组元素更加安全,不容易空指针崩溃
_data_write("MeshRelay",1,0,button1_state);//数组写入:向继电器1的第0个下发数据,写入button_1state;把APP数据送入继电器模块
_data_read("MeshRelay",1,1);//数组读取:读取继电器1的数据1;读取继电器模块的DHT11温度值
从机不用类库所以直接读写数组
upload_array[0]=humi_read; //BLINKER_LOG("Humidity: " , humi_read, "%"); //串口打印湿度
upload_array[1]=temp_read; //BLINKER_LOG("Temperature: ", temp_read, "°C"); //串口打印摄氏度
upload_array[2]=temp_read_f;//BLINKER_LOG("Temperature: ", temp_read_f, "°F"); //串口打印华氏度
upload_array[3]=hic; //BLINKER_LOG("Heat index: ", hic,"*C"); //摄氏体感温度(炎热指数)
upload_array[4]=hif; //BLINKER_LOG("Heat index: ", hif,"*F"); //华氏体感温度(炎热指数)
if(download_array[0]==0)digitalWrite(RELAY_PIN,HIGH);//继电器高开低关
else digitalWrite(RELAY_PIN,LOW);
连不上WiFi请注意
无论路由器还是手机热点还是 电脑热点,都不可以使用5G Wi-Fi,路由器不可以开启5G优选,或者是双频合一,必须使用路由器2.4G信号,必须使用有密码的Wi-Fi,校园网那种要登陆的必须转接路由器或电脑热点。
原理分析
MESH协议
表格已上传群文件
示例语句
{"data":{"get":"state"},"sender":{"type":"MeshNodeRelay","id":"1"},"receiver":{"type":"CentralController","id":"1"},"time":"1","uuid":"1"}
然后程序里一层一层解析
这是主机广播后,从机上传握手信息,主机解析的串口信息:
这是从机上传数据主机解析的串口信息:
主机握手所有设备后,打印设备状态列表:
从机的解析也差不多
API函数
主机写入从机状态的API函数
主机读取从机数据的API函数(组成心跳包上传服务器)这里写成了循环+字符串构造,避免一大排Text.print
通过直接在用户层ino文件调用头文件的API函数实现更简洁的mesh数据传递
数据个数
可以自己改成别的设备,以及修改主从机的MESH_DATA_COUNT实现更多上下发数据
修改MESH_DATA_COUNT其实就是增加浮点数数组的元素个数,为了mesh网络同时能发开关量(bool)、PWM占空比(int)、温湿度(float)所以就直接用浮点数通信,自己转换成对应变量类型即可
开发笔记(嫑细看没啥用)
blinker库直到前年才删除painlessMESH模组(painless MESH从2016更新至今,测试例程感觉还挺好用的),gateway和subdevice的库文件保留了下来,观察过后认为比较易懂就拿来用了,不然自己写真的一点头绪没有,毕竟类库也就细看过blinker这一个。要一下子把几百个变量的通信全部基于简单WiFiUDP实现不太现实,而且UDP丢包很烦。还得是类库,按类别设置变量管理设备各个属性,实例之间还互不影响。确实是升级版的结构体了
Blinker库的MESH主要就BlinkerGateway.h和BlinkerSubdevice.h两个头文件,设备状态存储引用BlinkerUtility.h的SubDevice类实现,所以扣过来放自己头文件里了。本来点灯的MESH仅负责所有设备连接服务器授权以及消息转发的。考虑今年专属设备都下线了,就改成自己的MESH,然后对接独立设备的API就好了。所有服务器相关代码全部去掉,只保留MESH的数据解析。原本要#define BLINKER_GATEWAY或SUBDEVICE的现在只要BLINKER_WIFI
总体的原理就是meshCheck先执行painlessMESH库的mesh.init,就配置好WiFi了,这里为防止mesh占用STA,阻止点灯通信,特地把mesh库init修改了,无论输入WIFI_AP还是WIFI_AP_STA都会设置模式为WIFI_AP_STA,而mesh库在输入WIFI_AP 时只会占用AP通道,从而留出STA通道给Blinker通信。
然后mesh.update被meshCheck循环执行,由于init时设置回调函数,所以如有来信mesh.update会调用_received_callback,把消息传到用户层,验证ID等信息后即可将数据存缓冲区,meshBuf
之后meshCheck通过检测_received_callback里给出的标志位,将meshbuf的数据按ID送入对应SubDevice实例,就完成数据上传的收储;下发就是根据ID读数据并发子设备处理,还有应答也是这个原理。
理论上painlessMESH基于TCP不需要像UDP那样应答确认没有丢包,但是还是做了这个机制测试链路速度,延迟100-300ms感觉很不错了,智能家居快也没啥用。
Mesh乱七八糟调试记录
2024.1
wifi.hpp第68行可修改
meshId
wifi.hpp第104行
init函数的通道默认=1
所以BlinkerGateway.h第2704行 也要1
wifi.hpp里面取消152-167行
使tcp连接取消(然后发现这里不能取消,因为除了连接Wi-Fi需要用这个之外连接mesh也需要
painnlessMeshSTA.cpp
25行恢复
TaskSchedularDeclarations.h第 62行Task second改10UL
使
painnlessMeshSTA.cpp第10行SCAN_INTERVA L变小
BlinkerGateway.h第2707行,直接不要manual设置TCP连接,然后可以扫描mesh,不然一直在扫Wi-Fi,需要解决
BlinkerSubDevice.h第1076行
_isHello=true;注释,一直广播
BlinkerGateway.h第2730行、2699行
注释先不连接Wi-Fi直接扫描mesh
init必须有那个root
mesh.hpp
回调触发
2024.2.3
阻止连接Wi-Fi
只需要manual注释掉
不需要
wifi.hpp里面取消152-167行
使tcp连接取消(然后发现这里不能取消,因为除了连接Wi-Fi需要用这个之外连接mesh也需要
然后观察发现消息接收由于json并没有成功解析,导致问题继续观察库代码on received回调函数
2024.2.5
解决了painlessMesh与点灯Wi-Fi模式的兼容性问题
原因:两个库都基于ESPAsync TCP库,尽管有#ifndf防止.h头文件被重复声明,但是.c文件不包含此机制,因此被声明了两遍(mesh库引用了8266开发板库的TCP库;点灯库引用了module文件夹自带的TCP。所以是有两组.h和.c)
解决方法:通过添加BLINKER_MESH关键字防止重复定义
2024.2.7
搞了半天总是出现manual就卡住的情况
然后发现换库解
浪费了整整一周
2024.2.12
务必同一信道并且Json格式
然后发现mesh库ap+sta后初始化station,禁用即可,manual也禁用,然后保持连接true,这样blinker的Wi-Fi.begin就可配置STA,而mesh库只管AP部分
2024.2.14
Wi-Fi.hpp中init函数:
Wi-Fi.mode(AP+STA);让mode默认AP+STA
而station scan根据init函数,主设备只有AP,不开启station .init从设备才AP+STA开启station.init
2024.2.15
程序编写完成后发现崩溃,是由于引用了不存在的实例,因为实例编号查询函数在新建实例后没有重新执行,导致之前查询的-1进入引用
然后没有连接mesh的时候发生卡顿,是因为刷新的时候引用了get parse来对设备进行状态发布,但是此时可能还没有新建设备,就会导致崩溃,所以注意查询后再进行发布
按钮回调函数中查询对应继电器之后get parse函数中没有将信息返回到正确的ID因为使用了最近来信id实际应该使用当前所在实例的id
2024.2.17-18规范化、视频以及教程