ESP8266-NodeMCU (4) 环境搭建

当ESP8266顺利连入WIFI网络后,就可以作为一个"微型服务器",开始处理接收到的请求信息

1 搭建网络服务

        利用"接入点模式",搭建一个以ESP-8266为中心的"微型服务器"网络环境,用户可以像访问网站一样访问该服务器

#include <ESP8266WiFi.h>        // 引入库
#include <ESP8266WiFiMulti.h>   
#include <ESP8266WebServer.h>   
 
ESP8266WiFiMulti wifiMulti;     // 建立ESP8266WiFiMulti对象
 
ESP8266WebServer esp8266_server(80);// 建立ESP8266WebServer对象,访问默认的80端口
 
void setup(void){
  Serial.begin(9600);          
 
  wifiMulti.addAP("WIFI1", "12345678");  
  wifiMulti.addAP("WIFI2", "12345678"); 
  wifiMulti.addAP("WIFI3", "12345678"); 
 
  int i = 0;                                 
  while (wifiMulti.run() != WL_CONNECTED) {  
    delay(1000);                             
    Serial.print(i++); Serial.print(' ');    
  }                                          
 
  Serial.println('\n');                     // WiFi连接成功后,打印相关信息
  Serial.print("Connected to ");          
  Serial.println(WiFi.SSID());       
  Serial.print("IP address:\t");          
  Serial.println(WiFi.localIP());           
  
//--------"启动网络服务功能"程序部分开始-------- // 
  esp8266_server.begin();                   //  启动"网络服务器"
  esp8266_server.on("/", handleRoot);       //  即访问默认的80端口时,调用handleRoot函数返回响应信息
  esp8266_server.onNotFound(handleNotFound);  // 当用户访问一个不存在的页面时,调用handleNotFound函数
        // 如果程序中没有on函数,则所有的请求都会走onNotFound

  Serial.println("HTTP esp8266_server started");//  打印启动成功
}
 
void loop(void){
  esp8266_server.handleClient();     // 处理http向服务器发来的请求,根据请求的访问路径,调用相应函数
}
                                                                            
void handleRoot() {   
  esp8266_server.send(200, "text/plain", "Hello from ESP8266"); //200位服务器响应状态码,text/plain表示返回纯文本信息(text/html表示返回网页信息)
}
 
void handleNotFound(){    
  esp8266_server.send(404, "text/plain", "404: Not found");   
}

        String route = esp8266_server.uri()获取用户的请求路径

2 网络服务使用

        访问开发板方式:

                AP模式(设备连入开发板的热点网络),访问开发板自己IP(例:192.168.4.1)

                WS模式(设备和开发板连入一个共同网络),访问分配给开发板的IP(例:192.168.0.123)

                如果开发板同时开启了AP和WS模式,则2种访问方式都可以

2.1 通过网络服务控制ESP8266开发板LED灯亮灭

#include <ESP8266WiFi.h>        // 引入库
#include <ESP8266WiFiMulti.h>  
#include <ESP8266WebServer.h>   
 
ESP8266WiFiMulti wifiMulti;     // 建立ESP8266WiFiMulti对象
 
ESP8266WebServer esp8266_server(80);// 建立网络服务器对象
 
void setup(void){
  Serial.begin(9600);   // 启动串口通讯
 
  pinMode(LED_BUILTIN, OUTPUT); // LED_BUILTIN(开发板内置LED引脚)/buttonPin(按键引脚)
            // pinMode(pin,mode)设置引脚工作模式  pin指引脚,mode(INPUT输入模式(读取信号)/OUTPUT输出模式(输出信号))
            // 为低电平0时LED亮,为高电平1时LED灭
  
  wifiMulti.addAP("WIFI1", "12345678");
  wifiMulti.addAP("WIFI2", "12345678");
  wifiMulti.addAP("WIFI3", "12345678");
  Serial.println("Connecting ...");      
  
  int i = 0;                                 
  while (wifiMulti.run() != WL_CONNECTED) { 
    delay(1000);                             
    Serial.print(i++); Serial.print(' ');   
  }                                          
                                            
  Serial.println('\n');
  Serial.print("Connected to ");
  Serial.println(WiFi.SSID());           
  Serial.print("IP address:\t");
  Serial.println(WiFi.localIP());     
 
  esp8266_server.begin();                           // 启动网站服务
  esp8266_server.on("/", HTTP_GET, handleRoot);     // GET请求
  esp8266_server.on("/LED", HTTP_POST, handleLED);  // 请求该路径,并且是以POST请求,则调用函数'handleLED'
  esp8266_server.onNotFound(handleNotFound);        
 
  Serial.println("HTTP esp8266_server started");
}
 
void loop(void){
  esp8266_server.handleClient();                     // 检查http服务器访问
}
 
void handleRoot() {       
  esp8266_server.send(200, "text/html", "<form action=\"/LED\" method=\"POST\"><input type=\"submit\" value=\"LED开关\"></form>");
}
 
void handleLED() {                          
  digitalWrite(LED_BUILTIN,!digitalRead(LED_BUILTIN));// digitalWrite(pin,status)改变引脚状态,digitalRead(pin)读取引脚状态
  esp8266_server.sendHeader("Location","/");          // 设置请求头,location表示依然是该ip,并且地址是/
  esp8266_server.send(303);                           // 告诉浏览器跳转其它页面(重定向)  
}
 
void handleNotFound(){
  esp8266_server.send(404, "text/plain", "404: Not found"); 
}

        引脚的3种模式:INPUT(输入模式); OUTPUT(输出模式); INPUT_PULLUP(输入上拉模式)

        将引脚设置为"输入上拉模式",则引脚会使用开发板自带的内部上拉电阻,该引脚在开关打开时为高电平,在开关关闭时接地

2.2 通过网络服务显示开发板引脚状态

#include <ESP8266WiFi.h>        
#include <ESP8266WiFiMulti.h>   
#include <ESP8266WebServer.h>   
 
#define buttonPin D3           // 给D3起一个别名"buttonPin"(D3本身和开发板FLASH按钮相连)
 
ESP8266WiFiMulti wifiMulti;   
 
ESP8266WebServer esp8266_server(80);
 
bool pinState;                      // 存储引脚状态用变量
 
void setup(){
  Serial.begin(9600);        
  delay(10);
  Serial.println("");
 
  pinMode(buttonPin, INPUT_PULLUP); // 将按键引脚设置为输入上拉模式
 
  wifiMulti.addAP("WIFI1", "12345678"); 
  wifiMulti.addAP("WIFI2", "12345678"); 
  wifiMulti.addAP("WIFI3", "12345678"); 
  Serial.println("Connecting ...");                         
                                                              
  int i = 0;                                 
  while (wifiMulti.run() != WL_CONNECTED) {  
    delay(1000);                             
    Serial.print(i++); Serial.print(' '); 
  }                                          
  Serial.println('\n');                     
  Serial.print("Connected to ");            
  Serial.println(WiFi.SSID());           
  Serial.print("IP address:\t");          
  Serial.println(WiFi.localIP());          
  
  esp8266_server.begin();                  
  esp8266_server.on("/", handleRoot);      
  esp8266_server.onNotFound(handleNotFound);        
 
  Serial.println("HTTP esp8266_server started");
}
 
void loop(){
  esp8266_server.handleClient();   
  pinState = digitalRead(buttonPin);  // 获取引脚状态
}                                                                   
   
void handleRoot() {  
  esp8266_server.send(200, "text/html", sendHTML(pinState));  
}
 
String sendHTML(bool buttonState){
  String htmlCode = "<!DOCTYPE html> <html>\n";
  htmlCode +="<head><meta http-equiv='refresh' content='5'/>\n";
  htmlCode +="<title>ESP8266 Butoon State</title>\n";
  htmlCode +="<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n";
  htmlCode +="body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;} h3 {color: #444444;margin-bottom: 50px;}\n";
  htmlCode +="</style>\n";
  htmlCode +="</head>\n";
  htmlCode +="<body>\n";
  htmlCode +="<h1>ESP8266 BUTTON STATE</h1>\n";
  
  if(buttonState)
    {htmlCode +="<p>Button Status: HIGH</p>\n";}
  else
    {htmlCode +="<p>Button Status: LOW</p>\n";}
    
  htmlCode +="</body>\n";
  htmlCode +="</html>\n";
  
  return htmlCode;
}
 
void handleNotFound(){                                        
  esp8266_server.send(404, "text/plain", "404: Not found");  
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值