可参考的代码文件说明
理论知识
使用Arduino IDE为NodeMCU编写控制程序
关于开发板
引脚D1,D2(GPIO)…数字引脚,A0(ADC)模拟引脚(能够读取连续变化的电压值)
两种供电方式,一种是通过micro口,一种是vin引脚
NodeMCU的数字引脚电压为3.3V,模拟引脚可读取电压范围0~1V
1 2
| digitalWrite(D2, HIGH); digitalRead(D2);
|
关于互联网
TCP/IP协议:包含许多协议

IP地址协议有两个版本
IPv4,四个十进制数字组成
IPv6
默认网关:WIFI路由器的IP地址
子网掩码:限制哪些是属于子网地址,哪些是设备本身自带的。几台设备的IP地址相同部分对应子网掩码是255的部分,而设备IP地址不同的部分对应子网掩码0,用255这个数字标出IP地址的哪一部分是子网地址。而用0这个数字来表示IP地址的哪一部分是设备部分
MAC地址:网络中的每一个设备都有一个独立的MAC地址。不光要知道彼此的IP地址,还要知道设备的MAC地址(也叫MAC码)。会依据IP地址得到对应设备的MAC码,并记录下来。让两台完全不认识彼此的设备获取到对方IP和MAC地址的协议就是ARP
TCP,UDP:选择这两种协议中的一种来保证数据传输的准确性
HTTP协议:由请求和响应构成。HTTP请求主要分为两大部分。一部分是请求头(Request Header)一部分是请求体(Request Body)。相应也是。

DNS(Domain Name System/域名系统):可以解析出IP
接入点模式,关于开发板的联网功能
ESP8266建立wifi,别的设备可以依此和开发板进行连接
接入MCU创建的wifi,但注意这个是没有internet互联网服务的
连接后可在shell输入如下代码进行确认
“ping”:测试电脑与某一设备是否已成功建立网络连接。原理是电脑向IP地址所在的网络设备发送一连串的数据包,当网络设备成功接收到数据包后会回复一些数据包。以此判断是否已成功连接
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
| #include <ESP8266WiFi.h> // 本程序使用ESP8266WiFi库 const char *ssid = "taichi-maker"; const char *password = "12345678"; void setup() { Serial.begin(9600); WiFi.softAP(ssid, password); Serial.print("Access Point: "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.softAPIP()); } void loop() { }
|
无线终端模式
开发板可以连接到wifi服务器,其他网络设备就可以连接到开发板
此时IP地址是由路由器动态分配的
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
| #include <ESP8266WiFi.h> // 本程序使用ESP8266WiFi库 const char* ssid = "xxxx"; const char* password = "xxx"; void setup() { Serial.begin(9600); WiFi.begin(ssid, password); Serial.print("Connecting to "); Serial.print(ssid); Serial.println(" ..."); int i = 0; while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print(i++); Serial.print(' '); } Serial.println(""); Serial.println("Connection established!"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); } void loop() { }
|
会搜索预先存储好的
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
| #include <ESP8266WiFi.h> // 本程序使用ESP8266WiFi库 #include <ESP8266WiFiMulti.h> // 本程序使用ESP8266WiFiMulti库 ESP8266WiFiMulti wifiMulti; void setup() { Serial.begin(9600);
wifiMulti.addAP("taichi-maker", "12345678"); wifiMulti.addAP("taichi-maker2", "87654321"); wifiMulti.addAP("taichi-maker3", "13572468"); Serial.println("Connecting ..."); int i = 0; while (wifiMulti.run() != WL_CONNECTED) { delay(1000); Serial.print('.'); } Serial.println('\n'); Serial.print("Connected to "); Serial.println(WiFi.SSID()); Serial.print("IP address:\t"); Serial.println(WiFi.localIP()); } void loop() { }
|
混合模式
又能是无线终端模式又能是接入点模式
建立基本网络服务器
浏览器访问网站默认是通过80端口
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 51 52 53 54
| #include <ESP8266WiFi.h> // 本程序使用 ESP8266WiFi库 #include <ESP8266WiFiMulti.h> // ESP8266WiFiMulti库 #include <ESP8266WebServer.h> // ESP8266WebServer库 ESP8266WiFiMulti wifiMulti; ESP8266WebServer esp8266_server(80); void setup(void){ Serial.begin(9600); wifiMulti.addAP("taichi-maker", "12345678"); wifiMulti.addAP("taichi-maker2", "87654321"); wifiMulti.addAP("taichi-maker3", "13572468"); 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(void){ esp8266_server.handleClient(); } void handleRoot() { esp8266_server.send(200, "text/plain", "Hello from ESP8266"); }
void handleNotFound(){ esp8266_server.send(404, "text/plain", "404: Not found"); }
|
通过网络服务实现NodeMCU开发板基本控制,即物联网
添加点灯按钮
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| pinMode(LED_BUILTIN,OUTPUT);
esp8266_server.on("/", HTTP_GET, handleRoot); esp8266_server.on("/LED", HTTP_POST, handleLED);
void handleRoot() { esp8266_server.send(200, "text/html", "<form action=\"/LED\" method=\"POST\"><input type=\"submit\" value=\"Toggle LED\"></form>"); }
void handleLED() { digitalWrite(LED_BUILTIN,!digitalRead(LED_BUILTIN)); esp8266_server.sendHeader("Location","/"); esp8266_server.send(303); }
|
对其中的html进行分析。其中的双引号与反斜杠是为了说明哪些是html的双引号
1 2 3 4 5
| <form action=\"/LED\" method=\"POST\"> <input type=\"submit\" value=\"Toggle LED\"> </form>
|
通过网络服务将开发板引脚状态显示在网页中
可以通过NodeMCU开发板上的FLASH按键控制D3引脚的电平。当我们没有按下该按键时,D3引脚将会保持高电平状态。当按下该按键后,D3引脚会变为低电平
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #define buttonPin D3 // 按钮引脚D3 bool pinState;
pinMode(buttonPin, INPUT_PULLUP);
pinState = digitalRead(buttonPin);
void handleRoot() { String displayPinState; if(pinState == HIGH){ displayPinState = "Button State: HIGH"; } else { displayPinState = "Button State: LOW"; } esp8266_server.send(200, "text/plain", displayPinState); }
|
当要自动刷新
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
| 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; }
|
对于其中html分析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <!DOCTYPE html> <html> <head> <meta http-equiv='refresh' content='5'/> <title>ESP8266 Butoon State</title> <style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;} body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;} h3 {color: #444444;margin-bottom: 50px;}\n"; </style> </head> <body> <h1>ESP8266 BUTTON STATE</h1> <p>Button Status: HIGH</p> <p>Button Status: LOW</p> </body> </html>
|