赞
踩
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
本次学习目的是,学习painless webserver,控制Mesh节点中的设备。包括:
1) painless webserver 是什么
2)组建包括了一个webserver的wifiMesh 网络
3)通过webserver控制Mesh网中的节点设备
4) 本学习用了三块ESP32C3。
painless 案例中,有一个webserver例子,作用陈述如下:
// this is a simple example that uses the painlessMesh library to
// connect to a another network and broadcast message from a webpage to the edges of the mesh network.
// This sketch can be extended further using all the abilities of the AsyncWebserver library (WS, events, …)
// for more details
// https://gitlab.com/painlessMesh/painlessMesh/wikis/bridge-between-mesh-and-another-network
// for more details about my version
// https://gitlab.com/Assassynv__V/painlessMesh
// and for more details about the AsyncWebserver library
// https://github.com/me-no-dev/ESPAsyncWebServer
其作用是利用根节点的websever服务,接收来自另一个网络的信息,并用广播的形式向内部Mesh网络发布。
打开一个webserver示例,在上面进行必要的修改。
station ssid 及 station password 是wifi 名称及密码。这里我喜欢用手机做热点,因为在手机的热点上可以看出是否有设备连入,也方便我下步学习用手机控制节点设备的内容。
这部分是例子里的代码,不需要进行修改。但这里可以看到,webserver节点一般定义为根节点(root)了。
修改完成后,上传到EPS32。
学习中,我设置了两个Node节点,分别为Node1和Node2 。基本原理是从广播msg是否有关于节点的操作信息,进行相应的操作。
"Led_1_on"和"Led_1_off"控制节点Node1的LED;
"Led_2_on"和"Led_2_off"控制节点Node2的LED。
步骤如下:
1)打开painless MESH 中的base示例,另存为Node1。
2)修改Mesh 名称及密码,也上节webserver一致。
3)注意,需在void stup() 函数中,增加以下代码:
mesh.setContainsRoot(true);// 本MESH网中包括了根节点。
无这代码的子节点还是可接入MESH网的,但一但该节点故障退出后,将导致MESH 根节点一直报错。
4)增加输出引脚说明,及Led的控制函数。由于我用的开发板pin3已经接有LED,所以我选择了引脚3做输出。
pinMode(3, OUTPUT);
void Led_on(); //Led on
void Led_off(); //Led off
void Led_on(){
digitalWrite(3, HIGH); // turn the LED on (HIGH is the voltage level)
}
void Led_off(){
digitalWrite(3, LOW); // turn the LED off (LOW is the voltage level)
}
最后,在receivedCallback函数中,增加一段判断代码,进行LED控制。
void receivedCallback( uint32_t from, String &msg ) {
Serial.printf("startHere: Received from %u msg=%s\n", from, msg.c_str());
if (msg == "Led_1_on"){
Led_on();
};
if (msg == "Led_1_off"){
Led_off();
};
}
现在可以上传代码到另一块 EPS32中了。
代码与node1基本一致,只需要修改receivedCallback函数的判断代码。
void receivedCallback( uint32_t from, String &msg ) {
Serial.printf("startHere: Received from %u msg=%s\n", from, msg.c_str());
if (msg == "Led_2_on"){
Led_on();
};
if (msg == "Led_2_off"){
Led_off();
};
}
1)打开手机WIFI热点,热点名与密码应与webserver中的一致。
2)在给三块ESP32通电(webserver应接在电脑USB,方便我们从端口中查看),通过手机热点控制,等待约10-20秒,就可以看到有ESP32设备接入。如没有接入,请检查代码。
3)打开Arduino串口监视器,记录webserver的IP地址。
此外,在手机中也可以看到它的IP。
4)电脑接入手机wifi,打开浏览器,输入webserver地址。(用手机上浏览器也可以)。
5)在文本栏中输入命令Led_1_on,发送(Submit),你会发现节点node1的LED灯亮起来,如输入Led_2_on再发送,node2的LED灯就会亮起来。学习成功。
用网页文本对话的形式进行控制,仍不太方便。我们可以修改webserver中的代码,使用Get命令直接控制两个节点中的LED,代码如下:
void setup() { Serial.begin(115200); mesh.setDebugMsgTypes( ERROR | STARTUP | CONNECTION ); // set before init() so that you can see startup messages // Channel set to 6. Make sure to use the same channel for your mesh and for you other // network (STATION_SSID) mesh.init( MESH_PREFIX, MESH_PASSWORD, MESH_PORT, WIFI_AP_STA, 6 ); mesh.onReceive(&receivedCallback); mesh.stationManual(STATION_SSID, STATION_PASSWORD); mesh.setHostname(HOSTNAME); // Bridge node, should (in most cases) be a root node. See [the wiki](https://gitlab.com/painlessMesh/painlessMesh/wikis/Possible-challenges-in-mesh-formation) for some background mesh.setRoot(true); // This node and all other nodes should ideally know the mesh contains a root, so call this on all nodes mesh.setContainsRoot(true); myAPIP = IPAddress(mesh.getAPIP()); Serial.println("My AP IP is " + myAPIP.toString()); //Async webserver server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ request->send(200, "text/html", "<form>Text to Broadcast<br><input type='text' name='BROADCAST'><br><br><input type='submit' value='Submit'></form>"); if (request->hasArg("BROADCAST")){ String msg = request->arg("BROADCAST"); mesh.sendBroadcast(msg); } }); // send led control msg 本次增加的代码 server.on("/Led_1_on/", HTTP_GET, [](AsyncWebServerRequest *request){ String msg = "Led_1_on"; mesh.sendBroadcast(msg); }); server.on("/Led_1_off/", HTTP_GET, [](AsyncWebServerRequest *request){ String msg = "Led_1_off"; mesh.sendBroadcast(msg); }); server.on("/Led_2_on/", HTTP_GET, [](AsyncWebServerRequest *request){ String msg = "Led_2_on"; mesh.sendBroadcast(msg); }); server.on("/Led_2_off/", HTTP_GET, [](AsyncWebServerRequest *request){ String msg = "Led_2_off"; mesh.sendBroadcast(msg); }); // 增加代码结束 server.begin(); }
再次上传代码。
ESP32接入WIFI 后,可以在浏览器中输入 地址+“/”+“Led_1_on(off)”+"/"来控制LED了。
Painless 库1.5.0 疑似与Esp32 C3部分不兼容,导致我ESP32中webserver部分一直连不上手机Wifi(Node节点工作正常)。回退库版本到1.4.10后,EPS32就可以正常使用webserver服务了。
Painless Webserver可以实现 从Mesh外部访问及控制Mesh网内部设备, 其实还是很容易的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。