风筝
发表于: 2022-11-3 16:33:46 | 显示全部楼层

近年来,ESP8266在物联网和与WiFi相关的项目中应用越来越广泛。这是一个低成本的WiFi模块,只需简单编程就可以实现运行独立的Web服务器。多么酷呢!


ESP8266操作模式

ESP8266最有用的功能之一是它不仅可以连接到现有的WiFi网络并充当Web服务器,还可以创建自己的网络,从而允许其他设备直接连接并访问Web页面。


这是可行的,因为ESP8266可以以三种模式运行:站(STA)模式、软接入点(AP)模式以及两者同时进行。


站(STA)模式

在STA模式下,ESP8266连接到现有的WiFi网络(由您的无线路由器创建的网络)。

ESP8266-NodeMCU-Web-Server-Station-STA-Mode-Demonstration.jpg


在STA模式下,ESP8266从其连接的无线路由器中获取IP地址。借助此IP地址,它可以设置Web服务器并将网页发送到现有WiFi网络上的所有连接设备。


软访问点(AP)模式

在访问点(AP)模式下,ESP8266设置了自己的WiFi网络,并充当一个或多个站点的集线器(就像WiFi路由器一样)。


但是,与WiFi路由器不同,它没有连接网络的接口。因此,这种操作模式称为软接入点(Soft-AP)。同样,不超过五个站点可以同时连接到它。

ESP8266-NodeMCU-Web-Server-Soft-Access-Point-AP-Mode-Demonstration.jpg


在AP模式下,ESP8266创建了一个新的WiFi网络,并为其分配一个SSID(网络的名称)和一个IP地址。使用此IP地址,它可以将网页提供给所有连接的设备。


接线LED到ESP8266

现在,我们了解了Web服务器的工作原理以及ESP8266可以创建一个模式的基本原理,现在该将某些LED连接到我们想要通过WiFi控制的ESP8266的时候了。


首先将Nodemcu放在面包板上,确保板的每一侧都位于面包板的另一侧。接下来,使用220Ω电流限制电阻将两个LED连接到数字GPIO D6和D7。


完成后,您应该拥有以下图片的东西。

Simple-ESP8266-NodeMCU-Web-Server-Wiring-Fritzing-Connections-with-LED.jpg


使用ESP8266 Web服务器来控制设备

因此,您可能想知道:“我如何控制仅处理和服务网页的Web服务器的内容?”。


非常简单。我们将通过访问特定的URL来控制设备。当您将URL输入Web浏览器时,它将HTTP请求(也称为GET请求)发送到Web服务器。处理此请求是Web服务器的责任。


假设您输入了像http://192.168.1.1/ledon这样的URL进入浏览器。然后,浏览器将HTTP请求发送给ESP8266。当ESP8266收到此请求时,它认识到用户希望打开LED。结果,它打开LED,并将动态网页发送到浏览器,该网页显示LED的状态为“ ON”。很简单,对吧?


在接入点(AP)模式下配置ESP8266 Web服务器

让我们现在就了解有趣的东西!


此示例显示了如何在Access Point(AP)模式下配置ESP8266 Web服务器,并将网页发送到任何连接的客户端。首先,将ESP8266连接到计算机并运行草图。然后,我们将更详细地研究它。

  1. /* Put your SSID & Password */
  2. const char* ssid = "NodeMCU";  // Enter SSID here
  3. const char* password = "12345678";  //Enter Password here

  4. /* Put IP Address details */
  5. IPAddress local_ip(192,168,1,1);
  6. IPAddress gateway(192,168,1,1);
  7. IPAddress subnet(255,255,255,0);

  8. ESP8266WebServer server(80);

  9. uint8_t LED1pin = D7;
  10. bool LED1status = LOW;

  11. uint8_t LED2pin = D6;
  12. bool LED2status = LOW;

  13. void setup() {
  14.   Serial.begin(115200);
  15.   pinMode(LED1pin, OUTPUT);
  16.   pinMode(LED2pin, OUTPUT);

  17.   WiFi.softAP(ssid, password);
  18.   WiFi.softAPConfig(local_ip, gateway, subnet);
  19.   delay(100);
  20.   
  21.   server.on("/", handle_OnConnect);
  22.   server.on("/led1on", handle_led1on);
  23.   server.on("/led1off", handle_led1off);
  24.   server.on("/led2on", handle_led2on);
  25.   server.on("/led2off", handle_led2off);
  26.   server.onNotFound(handle_NotFound);
  27.   
  28.   server.begin();
  29.   Serial.println("HTTP server started");
  30. }
  31. void loop() {
  32.   server.handleClient();
  33.   if(LED1status)
  34.   {digitalWrite(LED1pin, HIGH);}
  35.   else
  36.   {digitalWrite(LED1pin, LOW);}
  37.   
  38.   if(LED2status)
  39.   {digitalWrite(LED2pin, HIGH);}
  40.   else
  41.   {digitalWrite(LED2pin, LOW);}
  42. }

  43. void handle_OnConnect() {
  44.   LED1status = LOW;
  45.   LED2status = LOW;
  46.   Serial.println("GPIO7 Status: OFF | GPIO6 Status: OFF");
  47.   server.send(200, "text/html", SendHTML(LED1status,LED2status));
  48. }

  49. void handle_led1on() {
  50.   LED1status = HIGH;
  51.   Serial.println("GPIO7 Status: ON");
  52.   server.send(200, "text/html", SendHTML(true,LED2status));
  53. }

  54. void handle_led1off() {
  55.   LED1status = LOW;
  56.   Serial.println("GPIO7 Status: OFF");
  57.   server.send(200, "text/html", SendHTML(false,LED2status));
  58. }

  59. void handle_led2on() {
  60.   LED2status = HIGH;
  61.   Serial.println("GPIO6 Status: ON");
  62.   server.send(200, "text/html", SendHTML(LED1status,true));
  63. }

  64. void handle_led2off() {
  65.   LED2status = LOW;
  66.   Serial.println("GPIO6 Status: OFF");
  67.   server.send(200, "text/html", SendHTML(LED1status,false));
  68. }

  69. void handle_NotFound(){
  70.   server.send(404, "text/plain", "Not found");
  71. }

  72. String SendHTML(uint8_t led1stat,uint8_t led2stat){
  73.   String ptr = "<!DOCTYPE html> <html>\n";
  74.   ptr +="<head><meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">\n";
  75.   ptr +="<title>LED Control</title>\n";
  76.   ptr +="<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n";
  77.   ptr +="body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;} h3 {color: #444444;margin-bottom: 50px;}\n";
  78.   ptr +=".button {display: block;width: 80px;background-color: #1abc9c;border: none;color: white;padding: 13px 30px;text-decoration: none;font-size: 25px;margin: 0px auto 35px;cursor: pointer;border-radius: 4px;}\n";
  79.   ptr +=".button-on {background-color: #1abc9c;}\n";
  80.   ptr +=".button-on:active {background-color: #16a085;}\n";
  81.   ptr +=".button-off {background-color: #34495e;}\n";
  82.   ptr +=".button-off:active {background-color: #2c3e50;}\n";
  83.   ptr +="p {font-size: 14px;color: #888;margin-bottom: 10px;}\n";
  84.   ptr +="</style>\n";
  85.   ptr +="</head>\n";
  86.   ptr +="<body>\n";
  87.   ptr +="<h1>ESP8266 Web Server</h1>\n";
  88.   ptr +="<h3>Using Access Point(AP) Mode</h3>\n";
  89.   
  90.    if(led1stat)
  91.   {ptr +="<p>LED1 Status: ON</p><a class="button button-off" href="/led1off">OFF</a>\n";}
  92.   else
  93.   {ptr +="<p>LED1 Status: OFF</p><a class="button button-on" href="/led1on">ON</a>\n";}

  94.   if(led2stat)
  95.   {ptr +="<p>LED2 Status: ON</p><a class="button button-off" href="/led2off">OFF</a>\n";}
  96.   else
  97.   {ptr +="<p>LED2 Status: OFF</p><a class="button button-on" href="/led2on">ON</a>\n";}

  98.   ptr +="</body>\n";
  99.   ptr +="</html>\n";
  100.   return ptr;
  101. }
复制代码

以AP模式访问Web服务器

上传草图后,打开115200波特的串口显示器,然后按ESP8266上的复位按钮。如果一切都很好,它将显示“ HTTP服务器启动”消息。

ESP8266-NodeMCU-Web-Server-Access-Point-Mode-Serial-Monitor-Output-Server-Started.jpg


现在,获取可以连接到WiFi网络的电话、笔记本电脑或其他设备,并寻找一个称为“ NodeMCU”的网络。使用密码12345678连接到网络。


连接到NodeMCU AP网络后,打开浏览器并导航至192.168.1.1。 ESP8266应返回一个网页,显示LED和按钮的当前状态。同时,您可以检查串口显示器,以查看ESP8266的GPIO引脚的状态。

ESP8266-NodeMCU-Web-Server-Access-Point-Mode-Serial-Monitor-Output-Webpage-Accessed.jpg


现在,在关注URL的同时,单击按钮打开LED1。单击按钮后,ESP8266收到 /LED1ON URL的请求。然后,它打开LED1并提供带有LED状态更新的网页。它还在串行显示器上打印GPIO引脚状态。

ESP8266-NodeMCU-Web-Server-Access-Point-Mode-Serial-Monitor-Output-LED-Control.jpg


您可以测试LED2按钮,以查看其工作是否符合预期。

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 54 | 回复: 107



手机版|

GMT+8, 2024-5-10 09:11 , Processed in 0.038022 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表