|
近年来,ESP8266在物联网和与WiFi相关的项目中应用越来越广泛。这是一个低成本的WiFi模块,只需简单编程就可以实现运行独立的Web服务器。多么酷呢!
ESP8266操作模式 ESP8266最有用的功能之一是它不仅可以连接到现有的WiFi网络并充当Web服务器,还可以创建自己的网络,从而允许其他设备直接连接并访问Web页面。
这是可行的,因为ESP8266可以以三种模式运行:站(STA)模式、软接入点(AP)模式以及两者同时进行。
站(STA)模式 在STA模式下,ESP8266连接到现有的WiFi网络(由您的无线路由器创建的网络)。
在STA模式下,ESP8266从其连接的无线路由器中获取IP地址。借助此IP地址,它可以设置Web服务器并将网页发送到现有WiFi网络上的所有连接设备。
软访问点(AP)模式 在访问点(AP)模式下,ESP8266设置了自己的WiFi网络,并充当一个或多个站点的集线器(就像WiFi路由器一样)。
但是,与WiFi路由器不同,它没有连接网络的接口。因此,这种操作模式称为软接入点(Soft-AP)。同样,不超过五个站点可以同时连接到它。
在AP模式下,ESP8266创建了一个新的WiFi网络,并为其分配一个SSID(网络的名称)和一个IP地址。使用此IP地址,它可以将网页提供给所有连接的设备。
接线LED到ESP8266 现在,我们了解了Web服务器的工作原理以及ESP8266可以创建一个模式的基本原理,现在该将某些LED连接到我们想要通过WiFi控制的ESP8266的时候了。
首先将Nodemcu放在面包板上,确保板的每一侧都位于面包板的另一侧。接下来,使用220Ω电流限制电阻将两个LED连接到数字GPIO D6和D7。
完成后,您应该拥有以下图片的东西。
使用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连接到计算机并运行草图。然后,我们将更详细地研究它。 - /* Put your SSID & Password */
- const char* ssid = "NodeMCU"; // Enter SSID here
- const char* password = "12345678"; //Enter Password here
- /* Put IP Address details */
- IPAddress local_ip(192,168,1,1);
- IPAddress gateway(192,168,1,1);
- IPAddress subnet(255,255,255,0);
- ESP8266WebServer server(80);
- uint8_t LED1pin = D7;
- bool LED1status = LOW;
- uint8_t LED2pin = D6;
- bool LED2status = LOW;
- void setup() {
- Serial.begin(115200);
- pinMode(LED1pin, OUTPUT);
- pinMode(LED2pin, OUTPUT);
- WiFi.softAP(ssid, password);
- WiFi.softAPConfig(local_ip, gateway, subnet);
- delay(100);
-
- server.on("/", handle_OnConnect);
- server.on("/led1on", handle_led1on);
- server.on("/led1off", handle_led1off);
- server.on("/led2on", handle_led2on);
- server.on("/led2off", handle_led2off);
- server.onNotFound(handle_NotFound);
-
- server.begin();
- Serial.println("HTTP server started");
- }
- void loop() {
- server.handleClient();
- if(LED1status)
- {digitalWrite(LED1pin, HIGH);}
- else
- {digitalWrite(LED1pin, LOW);}
-
- if(LED2status)
- {digitalWrite(LED2pin, HIGH);}
- else
- {digitalWrite(LED2pin, LOW);}
- }
- void handle_OnConnect() {
- LED1status = LOW;
- LED2status = LOW;
- Serial.println("GPIO7 Status: OFF | GPIO6 Status: OFF");
- server.send(200, "text/html", SendHTML(LED1status,LED2status));
- }
- void handle_led1on() {
- LED1status = HIGH;
- Serial.println("GPIO7 Status: ON");
- server.send(200, "text/html", SendHTML(true,LED2status));
- }
- void handle_led1off() {
- LED1status = LOW;
- Serial.println("GPIO7 Status: OFF");
- server.send(200, "text/html", SendHTML(false,LED2status));
- }
- void handle_led2on() {
- LED2status = HIGH;
- Serial.println("GPIO6 Status: ON");
- server.send(200, "text/html", SendHTML(LED1status,true));
- }
- void handle_led2off() {
- LED2status = LOW;
- Serial.println("GPIO6 Status: OFF");
- server.send(200, "text/html", SendHTML(LED1status,false));
- }
- void handle_NotFound(){
- server.send(404, "text/plain", "Not found");
- }
- String SendHTML(uint8_t led1stat,uint8_t led2stat){
- String ptr = "<!DOCTYPE html> <html>\n";
- ptr +="<head><meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">\n";
- ptr +="<title>LED Control</title>\n";
- ptr +="<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n";
- ptr +="body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;} h3 {color: #444444;margin-bottom: 50px;}\n";
- 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";
- ptr +=".button-on {background-color: #1abc9c;}\n";
- ptr +=".button-on:active {background-color: #16a085;}\n";
- ptr +=".button-off {background-color: #34495e;}\n";
- ptr +=".button-off:active {background-color: #2c3e50;}\n";
- ptr +="p {font-size: 14px;color: #888;margin-bottom: 10px;}\n";
- ptr +="</style>\n";
- ptr +="</head>\n";
- ptr +="<body>\n";
- ptr +="<h1>ESP8266 Web Server</h1>\n";
- ptr +="<h3>Using Access Point(AP) Mode</h3>\n";
-
- if(led1stat)
- {ptr +="<p>LED1 Status: ON</p><a class="button button-off" href="/led1off">OFF</a>\n";}
- else
- {ptr +="<p>LED1 Status: OFF</p><a class="button button-on" href="/led1on">ON</a>\n";}
- if(led2stat)
- {ptr +="<p>LED2 Status: ON</p><a class="button button-off" href="/led2off">OFF</a>\n";}
- else
- {ptr +="<p>LED2 Status: OFF</p><a class="button button-on" href="/led2on">ON</a>\n";}
- ptr +="</body>\n";
- ptr +="</html>\n";
- return ptr;
- }
复制代码
以AP模式访问Web服务器 上传草图后,打开115200波特的串口显示器,然后按ESP8266上的复位按钮。如果一切都很好,它将显示“ HTTP服务器启动”消息。
现在,获取可以连接到WiFi网络的电话、笔记本电脑或其他设备,并寻找一个称为“ NodeMCU”的网络。使用密码12345678连接到网络。
连接到NodeMCU AP网络后,打开浏览器并导航至192.168.1.1。 ESP8266应返回一个网页,显示LED和按钮的当前状态。同时,您可以检查串口显示器,以查看ESP8266的GPIO引脚的状态。
现在,在关注URL的同时,单击按钮打开LED1。单击按钮后,ESP8266收到 /LED1ON URL的请求。然后,它打开LED1并提供带有LED状态更新的网页。它还在串行显示器上打印GPIO引脚状态。
您可以测试LED2按钮,以查看其工作是否符合预期。 |