当前位置:   article > 正文

ESP32 WIFI MESH学习笔记6 -Webserver与节点控制_mesh.setdebugmsgtypes

mesh.setdebugmsgtypes

系列文章目录

提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本次学习目的是,学习painless webserver,控制Mesh节点中的设备。包括:
1) painless webserver 是什么
2)组建包括了一个webserver的wifiMesh 网络
3)通过webserver控制Mesh网中的节点设备
4) 本学习用了三块ESP32C3。

一、 painless_webserver是什么?

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网络发布。

二、组建包括网络

1.webserver节点

打开一个webserver示例,在上面进行必要的修改。
在这里插入图片描述
station ssid 及 station password 是wifi 名称及密码。这里我喜欢用手机做热点,因为在手机的热点上可以看出是否有设备连入,也方便我下步学习用手机控制节点设备的内容。
在这里插入图片描述
这部分是例子里的代码,不需要进行修改。但这里可以看到,webserver节点一般定义为根节点(root)了。
修改完成后,上传到EPS32。

2.node1节点

学习中,我设置了两个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)
   }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

最后,在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();
  };
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

现在可以上传代码到另一块 EPS32中了。

3.node2节点

代码与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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

三、webserver控制测试

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控制的改进

用网页文本对话的形式进行控制,仍不太方便。我们可以修改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();

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

再次上传代码。
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网内部设备, 其实还是很容易的。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/196269
推荐阅读
相关标签
  

闽ICP备14008679号