ESP-12F学习总结——01
前言
跟随太极创客教程学习了ESP-12F,现简单总结如下,以待不时之需。
一、搭建开发环境
1.1、安装Arduino_IDE,下载链接如下:https://arduino.me/home。安装过程全部选是就行。
1.2、界面选择中文:
1.3、双击安装8266支持包:
1.4、安装Notepad++,将界面设置为中文:
1.5、安装CH340驱动
CH340/CH341Windows 驱动下载链接:https://www.wch.cn/download/CH341SER_EXE.html/
二、配套代码学习
以下代码为参考B站太极创客团队的《ESP8266教程》零基础入门学用物联网–基础知识篇
2.1、打开IDE,开发板选择ESP-12E;端口选择对应的串口端口。
2.2、点亮一个小灯
点亮一个小灯代码如下:
/**********************************************************************
程序名称/Program name : 01、点亮一个小灯
团队/Team : 橡木工作室
作者/Author : 志城
日期/Date(YYYYMMDD) :2402081633
程序目的/Purpose :已成功点亮LED,通过修改时间即可进行不同时间的亮灭调节
-----------------------------------------------------------------------
***********************************************************************/
void setup() {
pinMode(LED_BUILTIN, OUTPUT); // Initialize the LED_BUILTIN pin as an output
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(LED_BUILTIN, LOW); // Turn the LED on (Note that LOW is the voltage level
// but actually the LED is on; this is because
// it is active low on the ESP-01)
delay(1000); // Wait for a second
digitalWrite(LED_BUILTIN, HIGH); // Turn the LED off by making the voltage HIGH
delay(1000); // Wait for two seconds (to demonstrate the active low LED)
}
/***********************************************************************/
2.3、(3-1ESP8266物联网开发基础)教程配套代码测试通过
第一款代码如下(示例):
/**********************************************************************
程序名称/Program name : 02、调用softAP()将ESP12F12F变为一个wifi终端
团队/Team : 太极创客团队
作者/Author : 小黑
日期/Date(YYYYMMDD) : 2402081638
程序目的/Purpose : 测试成功
此程序使用ESP8266WiFiAP库来演示softAP()函数的用法
softAP()函数会开启一个校验式wifi。我们可以在代码中设置WiFi网络名称、
WiFi密码、最大允许连接设备数量、信号通道编号、是否广播WiFi名称。
-----------------------------------------------------------------------
***********************************************************************/
#include <ESP8266WiFi.h>
#define AP_ssid "abcd" //这里改成你的设备当前环境下接入点名字
#define password "12345678" //这里改成你的设备当前环境下接入点密码
void setup() {
pinMode(LED_BUILTIN, OUTPUT); //LED引脚设置为输出模式
Serial.begin(9600); // 启动串口通讯
Serial.println();
WiFi.mode(WIFI_AP); //配置接入点信息
Serial.print("设置接入点中 ... "); //启动接入点模式,并设置账号和密码
Serial.println(""); // 通过串口监视器输出信息
Serial.print("当前工作模式:"); // 告知用户设备当前工作模式
Serial.println(WiFi.getMode());
Serial.print("接入点名字:");
Serial.println(AP_ssid); // 告知用户建立的接入点WiFi名
Serial.print("接入点密码:");
Serial.println(password); // 告知用户建立的接入点WiFi密码
//WiFi.softAP(AP_ssid, password,3,1); //启动校验式网络(需要输入账号密码的网络),通道为3,wifi隐藏,最大连接数=4
WiFi.softAP(AP_ssid, password,3,0); //启动校验式网络(需要输入账号密码的网络),通道为3,wifi非隐藏,最大连接数=4
}
void loop() {
digitalWrite(LED_BUILTIN, LOW); // Turn the LED on (Note that LOW is the voltage level
delay(1000); // Wait for a second
digitalWrite(LED_BUILTIN, HIGH); // Turn the LED off by making the voltage HIGH
delay(1000); // Wait for two seconds (to demonstrate the active low LED)
}
/***********************************************************************/
第二款代码如下(示例):
/**********************************************************************
程序名称/Program name : 03、调用WiFi.begin()将12F接入WIFI
团队/Team : 太极创客团队
作者/Author : 小黑
日期/Date(YYYYMMDD) : 2402081644
程序目的/Purpose :
此程序使用ESP8266WiFiSTA库来演示建立连接,ESP8266模块切换工作模式为无线终端模式。
***********************************************************************/
#include <ESP8266WiFi.h>
#define AP_ssid "abcd" //这里改成你的设备当前环境下接入点名字
#define password "12345678" //这里改成你的设备当前环境下接入点密码
int i = 0; //用来判定连接是否超时的累加量
void setup() {
Serial.begin(9600); // 启动串口通讯,波特率设置为9600
Serial.println("开始连接");
//调用 WiFi.begin()函数,开始连接接入点
WiFi.begin(AP_ssid, password);
Serial.print("正在连接到");
Serial.print(AP_ssid);
//这里的循环用来判断是否连接成功的。连接过程中每隔500毫秒会检查一次是否连接成功,,并打一个点表示正在连接中
//连接成功后会给出提示,但是若60秒后还是没有连接上,则会提示超时
while (WiFi.status() != WL_CONNECTED) {
i++;
delay(500);
Serial.print(".");
if (i > 120) { //60秒后如果还是连接不上,就判定为连接超时
Serial.print("连接超时!请检查网络环境");
break;
}
}
Serial.println("网络连接成功");
//这一部分用来输出连接网络的基本信息
Serial.println("500"); // 延时500毫秒
Serial.print("当前工作模式:"); // 告知用户设备当前工作模式
Serial.println(WiFi.getMode());
Serial.print("连接到的接入点名字:");
Serial.println(AP_ssid); // 告知用户建立的接入点WiFi名
Serial.print("连接到的接入点密码:");
Serial.println(password); // 告知用户建立的接入点WiFi密码
Serial.print("无线终端模式成功开启,网络连接成功");
Serial.print("IP_address: "); // 告知用户NodeMCU的IP地址
Serial.println(WiFi.softAPIP()); //通过调用WiFi.softAPIP()可以得到NodeMCU的IP地址
Serial.println("初始化完成");
}
void loop() {
}
/***********************************************************************/
第三款代码如下(示例):
/**********************************************************************
程序名称/Program name : 04、将12F接入WIFI打印IP地址
团队/Team : 太极创客团队
作者/Author : 小黑
日期/Date(YYYYMMDD) : 2402081644
程序目的/Purpose : 测试成功
此程序使用ESP8266WiFiSTA库来演示建立连接,ESP8266模块切换工作模式为无线终端模式。
备注:一个开发板无线终端IP地址为: 192.168.1.10
另个开发板无线终端IP地址为: 192.168.1.11
IP地址是模块联网之后,由路由器给模块动态分配的地址。
通过CMD里面:C:\Users\123>ping 192.168.1.11
正在 Ping 192.168.1.11 具有 32 字节的数据:
来自 192.168.1.11 的回复: 字节=32 时间=104ms TTL=255
来自 192.168.1.11 的回复: 字节=32 时间=4ms TTL=255
来自 192.168.1.11 的回复: 字节=32 时间=4ms TTL=255
来自 192.168.1.11 的回复: 字节=32 时间=4ms TTL=255
192.168.1.11 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 4ms,最长 = 104ms,平均 = 29ms
***********************************************************************/
#include <ESP8266WiFi.h>
#define AP_ssid "abcd" //这里改成你的设备当前环境下接入点名字
#define password "12345678" //这里改成你的设备当前环境下接入点密码
void setup() {
Serial.begin(9600); // 启动串口通讯,波特率设置为9600
Serial.println("开始连接");
WiFi.begin(AP_ssid, password); //调用 WiFi.begin()函数,开始连接接入点
Serial.print("正在连接到");
Serial.print(AP_ssid);Serial.println("...");
int i = 0; //用来判定连接是否超时的累加量
//这里的循环用来判断是否连接成功的。连接过程中每隔500毫秒会检查一次是否连接成功,,并打一个点表示正在连接中
//连接成功后会给出提示,但是若60秒后还是没有连接上,则会提示超时
while (WiFi.status() != WL_CONNECTED) {
i++;
delay(500);
Serial.print(".");
if (i > 120) { //60秒后如果还是连接不上,就判定为连接超时
Serial.print("连接超时!请检查网络环境");
break;
}
}
Serial.println("网络连接成功");
//这一部分用来输出连接网络的基本信息
Serial.println("500"); // 延时500毫秒
Serial.print("当前工作模式:"); // 告知用户设备当前工作模式
Serial.println(WiFi.getMode());
Serial.print("连接到的接入点名字:");
Serial.println(AP_ssid); // 告知用户建立的接入点WiFi名
Serial.print("连接到的接入点密码:");
Serial.println(password); // 告知用户建立的接入点WiFi密码
Serial.print("无线终端模式成功开启,网络连接成功");
Serial.print("IP_address: "); // 告知用户NodeMCU的IP地址
Serial.println(WiFi.softAPIP()); //ESP8266开发板建立WiFi接入点后, 我们可以使用WiFi.softAPIP()函数获取ESP8266开发板的IP地址。
if (WiFi.status() == WL_CONNECTED)
{
Serial.print("无线终端IP地址为: ");
Serial.println(WiFi.localIP()); //localIP函数可在无线终端模式下获取当前ESP8266模块的IP地址
}
}
void loop() {}
/***********************************************************************/
2.4、(3-2 ESP8266网络服务器)教程配套代码测试通过
第一段代码如下(示例):
/**********************************************************************
程序名称/Program name : 07、使用12F连接WIFI;从浏览器输入12F的IP地址;进行对应语句的显示。
团队/Team :
作者/Author :
日期/Date(YYYYMMDD) : 2402081644
程序目的/Purpose : 测试成功
使用8266作为WebServer,并用浏览器打开设备IP+80端口进行访问,会显示如下信息:
Hello i am here ;test homepage !
***********************************************************************/
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266WebServer.h>
//设置您的WiFi接入信息
#define AP_ssid "abcd" //这里改成你的设备当前环境下接入点名字
#define password "12345678" //这里改成你的设备当前环境下接入点密码
ESP8266WebServer server(80);
//自定义主页访问处理函数
void homepage() {
server.send(200, "text/plain", "Hello i am here ;test homepage !");
Serial.println("用户访问了主页");
}
void setup(void) {
Serial.begin(9600); //初始化串口
Serial.println("");
WiFi.begin(AP_ssid, password); //调用 WiFi.begin()函数,开始连接接入点
Serial.print("正在连接到");
Serial.print(AP_ssid);Serial.println("...");
int i = 0; //用来判定连接是否超时的累加量
//这里的循环用来判断是否连接成功的。连接过程中每隔500毫秒会检查一次是否连接成功,,并打一个点表示正在连接中
//连接成功后会给出提示,但是若60秒后还是没有连接上,则会提示超时
while (WiFi.status() != WL_CONNECTED) {
i++;
delay(500);
Serial.print(".");
if (i > 120) { //60秒后如果还是连接不上,就判定为连接超时
Serial.print("连接超时!请检查网络环境");
break;
}
}
Serial.println("网络连接成功");
//这一部分用来输出连接网络的基本信息
Serial.println("500"); // 延时500毫秒
Serial.print("当前工作模式:"); // 告知用户设备当前工作模式
Serial.println(WiFi.getMode());
Serial.print("连接到的接入点名字:");
Serial.println(AP_ssid); // 告知用户建立的接入点WiFi名
Serial.print("连接到的接入点密码:");
Serial.println(password); // 告知用户建立的接入点WiFi密码
Serial.print("无线终端模式成功开启,网络连接成功");
if (WiFi.status() == WL_CONNECTED)
{
Serial.print("无线终端IP地址为: ");
Serial.println(WiFi.localIP()); //localIP函数可在无线终端模式下获取当前ESP8266模块的IP地址
}
//------------------ “启动网络服务功”程序部分开始--------------//初始化WebServer
server.on("/", homepage);
server.begin();
//------------------ “启动网络服务功”程序部分结束--------------//
Serial.println("HTTP server started");
}
void loop(void) {
//监听客户请求并处理
server.handleClient();
}
/***********************************************************************/
第二段代码如下(示例):
/**********************************************************************
程序名称/Program name : 08、使用12F连接WIFI;从浏览器输入12F的IP地址;进行对应语句的显示。
团队/Team :
作者/Author :
日期/Date(YYYYMMDD) : 2402082355
程序目的/Purpose : 测试成功
使用8266作为WebServer,并用浏览器打开设备IP+80端口进行访问;http://192.168.1.10/123 显示404
***********************************************************************/
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
//设置您的WiFi接入信息
#define AP_ssid "abcd" //这里改成你的设备当前环境下接入点名字
#define password "12345678" //这里改成你的设备当前环境下接入点密码
ESP8266WebServer server(80);
//设置主页
void homepage() {
server.send(200, "text/plain", "test homepage !");
Serial.println("用户访问了主页");
}
// 设置处理404情况的函数'handleNotFound'
void handleNotFound() { // 当浏览器请求的网络资源无法在服务器找到时,
server.send(404, "text/plain", "404: Not found"); // NodeMCU将调用此函数。
}
void setup(void) {
//初始化串口
Serial.begin(9600);
Serial.println("");
//初始化网络
WiFi.mode(WIFI_STA);
WiFi.begin(AP_ssid, password); //调用 WiFi.begin()函数,开始连接接入点
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
//初始化WebServer
server.on("/", homepage);
server.onNotFound(handleNotFound);
server.begin();
Serial.println("HTTP server started");
}
void loop(void) {
//监听客户请求并处理
server.handleClient();
}
/***********************************************************************/
第三段代码如下(示例):
这个代码开始有点意思了。
/**********************************************************************
程序名称/Program name : 09、使用12F连接WIFI;从浏览器输入12F的IP地址;点击按钮控制模块LED亮灭。
团队/Team :
作者/Author :
日期/Date(YYYYMMDD) : 2402082355
程序目的/Purpose : 使用NodeMCU建立基本服务器。用户可通过浏览器使用8266的IP地址
访问8266所建立的基本网页并通过该页面点亮/熄灭NodeMCU的内置LED
***********************************************************************/
#include <ESP8266WiFi.h> // 本程序使用 ESP8266WiFi库
#include <ESP8266WiFiMulti.h> // ESP8266WiFiMulti库
#include <ESP8266WebServer.h> // ESP8266WebServer库
ESP8266WiFiMulti wifiMulti; // 建立ESP8266WiFiMulti对象,对象名称是 'wifiMulti'
ESP8266WebServer esp8266_server(80);// 建立网络服务器对象,该对象用于响应HTTP请求。监听端口(80)
void setup(void){
Serial.begin(9600); // 启动串口通讯
pinMode(LED_BUILTIN, OUTPUT); //设置内置LED引脚为输出模式以便控制LED
wifiMulti.addAP("ChinaNet-fLQc", "vxgdwscn"); // 将需要连接的一系列WiFi ID和密码输入这里
wifiMulti.addAP("abcd", "12345678"); // ESP8266-NodeMCU再启动后会扫描当前网络
wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3"); // 环境查找是否有这里列出的WiFi ID。如果有
Serial.println("Connecting ..."); // 则尝试使用此处存储的密码进行连接。
int i = 0;
while (wifiMulti.run() != WL_CONNECTED) { // 此处的wifiMulti.run()是重点。通过wifiMulti.run(),NodeMCU将会在当前
delay(1000); // 环境中搜索addAP函数所存储的WiFi。如果搜到多个存储的WiFi那么NodeMCU
Serial.print(i++); Serial.print(' '); // 将会连接信号最强的那一个WiFi信号。
} // 一旦连接WiFI成功,wifiMulti.run()将会返回“WL_CONNECTED”。这也是
// 此处while循环判断是否跳出循环的条件。
// WiFi连接成功后将通过串口监视器输出连接成功信息
Serial.println('\n');
Serial.print("Connected to ");
Serial.println(WiFi.SSID()); // 通过串口监视器输出连接的WiFi名称
Serial.print("IP address:\t");
Serial.println(WiFi.localIP()); // 通过串口监视器输出ESP8266-NodeMCU的IP
esp8266_server.begin(); // 启动网站服务
esp8266_server.on("/", HTTP_GET, handleRoot); // 设置服务器根目录即'/'的函数'handleRoot'
esp8266_server.on("/LED", HTTP_POST, handleLED); // 设置处理LED控制请求的函数'handleLED'
esp8266_server.onNotFound(handleNotFound); // 设置处理404情况的函数'handleNotFound'
Serial.println("HTTP esp8266_server started");// 告知用户ESP8266网络服务功能已经启动
}
void loop(void){
esp8266_server.handleClient(); // 检查http服务器访问
}
//设置服务器根目录即'/'的函数'handleRoot'
//该函数的作用是每当有客户端访问NodeMCU服务器根目录时,
//NodeMCU都会向访问设备发送 HTTP 状态 200 (Ok) 这是send函数的第一个参数。
//同时NodeMCU还会向浏览器发送HTML代码,以下示例中send函数中第三个参数,
//也就是双引号中的内容就是NodeMCU发送的HTML代码。该代码可在网页中产生LED控制按钮。
//当用户按下按钮时,浏览器将会向NodeMCU的/LED页面发送HTTP请求,请求方式为POST。
//NodeMCU接收到此请求后将会执行handleLED函数内容
void handleRoot() {
esp8266_server.send(200, "text/html", "<form action=\"/LED\" method=\"POST\"><input type=\"submit\" value=\"Toggle LED\"></form>");
}
//处理LED控制请求的函数'handleLED'
void handleLED() {
digitalWrite(LED_BUILTIN,!digitalRead(LED_BUILTIN));// 改变LED的点亮或者熄灭状态
esp8266_server.sendHeader("Location","/"); // 跳转回页面根目录
esp8266_server.send(303); // 发送Http相应代码303 跳转
}
// 设置处理404情况的函数'handleNotFound'
void handleNotFound(){
esp8266_server.send(404, "text/plain", "404: Not found"); // 发送 HTTP 状态 404 (未找到页面) 并向浏览器发送文字 "404: Not found"
}
/***********************************************************************/
第四段代码如下(示例):
/**********************************************************************
程序名称/Program name : 10、使用12F连接WIFI;从浏览器输入12F的IP地址;点击板子按键网络可以看到引脚状态
团队/Team :
作者/Author :
日期/Date(YYYYMMDD) : 2402090952
程序目的/Purpose : 使用NodeMCU建立基本服务器。该页面将会显示NodeMCU
的D3引脚状态。NodeMCU开发板上的FLASH按键可以控制D3引脚的电平。
没有按下该按键时D3引脚将会保持高电平状态。当按下该按键后,
D3引脚会变为低电平。需要按住按键然后刷新一下页面才可以看到引脚状态。
-----------------------------------------------------------------------
修订历史/Revision History
日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description
***********************************************************************/
#include <ESP8266WiFi.h> // 本程序使用 ESP8266WiFi库
#include <ESP8266WiFiMulti.h> // ESP8266WiFiMulti库
#include <ESP8266WebServer.h> // ESP8266WebServer库
#define buttonPin D3 // 按钮引脚D3
ESP8266WiFiMulti wifiMulti; // 建立ESP8266WiFiMulti对象,对象名称是'wifiMulti'
ESP8266WebServer esp8266_server(80);// 建立网络服务器对象,该对象用于响应HTTP请求。监听端口(80)
bool pinState; // 存储引脚状态用变量
void setup(){
Serial.begin(9600); // 启动串口通讯
pinMode(buttonPin, INPUT_PULLUP); // 将按键引脚设置为输入上拉模式
wifiMulti.addAP("ChinaNet-fLQc", "vxgdwscn"); // 将需要连接的一系列WiFi ID和密码输入这里
wifiMulti.addAP("abcd", "12345678"); // ESP8266-NodeMCU再启动后会扫描当前网络
wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3"); // 环境查找是否有这里列出的WiFi ID。如果有
Serial.println("Connecting ..."); // 则尝试使用此处存储的密码进行连接。
int i = 0;
while (wifiMulti.run() != WL_CONNECTED) { // 此处的wifiMulti.run()是重点。通过wifiMulti.run(),NodeMCU将会在当前
delay(1000); // 环境中搜索addAP函数所存储的WiFi。如果搜到多个存储的WiFi那么NodeMCU
Serial.print(i++); Serial.print(' '); // 将会连接信号最强的那一个WiFi信号。
} // 一旦连接WiFI成功,wifiMulti.run()将会返回“WL_CONNECTED”。这也是
// 此处while循环判断是否跳出循环的条件。
// WiFi连接成功后将通过串口监视器输出连接成功信息
Serial.println('\n'); // WiFi连接成功后
Serial.print("Connected to "); // NodeMCU将通过串口监视器输出。
Serial.println(WiFi.SSID()); // 连接的WiFI名称
Serial.print("IP address:\t"); // 以及
Serial.println(WiFi.localIP()); // NodeMCU的IP地址
esp8266_server.begin(); // 启动网站服务
esp8266_server.on("/", handleRoot); // 设置服务器根目录即'/'的函数'handleRoot'
esp8266_server.onNotFound(handleNotFound);// 设置处理404情况的函数'handleNotFound'
Serial.println("HTTP esp8266_server started");// 告知用户ESP8266网络服务功能已经启动
}
void loop(){
esp8266_server.handleClient(); // 处理http服务器访问
pinState = digitalRead(buttonPin); // 获取引脚状态
}
//以下函数处理网站首页的访问请求。此函数为本示例程序重点1
//详细讲解请参见太极创客网站《零基础入门学用物联网》
//第3章-第2节“通过网络服务将开发板引脚状态显示在网页中”的说明讲解。
void handleRoot() {
String displayPinState; // 存储按键状态的字符串变量
if(pinState == HIGH){ // 当按键引脚D3为高电平
displayPinState = "Button State: HIGH"; // 字符串赋值高电平信息
} else { // 当按键引脚D3为低电平
displayPinState = "Button State: LOW"; // 字符串赋值低电平信息
}
esp8266_server.send(200, "text/plain", displayPinState);
// 向浏览器发送按键状态信息
}
// 设置处理404情况的函数'handleNotFound'
void handleNotFound(){ // 当浏览器请求的网络资源无法在服务器找到时,
esp8266_server.send(404, "text/plain", "404: Not found"); // NodeMCU将调用此函数。
}
/***********************************************************************/
第五段代码如下(示例):
/**********************************************************************
程序名称/Program name : 11、使用12F连接WIFI;从浏览器输入12F的IP地址;点击板子按键网络自动刷新可以看到引脚状态
团队/Team :
作者/Author :
日期/Date(YYYYMMDD) : 2402090952
程序目的/Purpose : 使用NodeMCU建立基本服务器。该网页将显示引脚D3状态。同时状态会
每隔5秒钟更新一次。
-----------------------------------------------------------------------
修订历史/Revision History
日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description
***********************************************************************/
#include <ESP8266WiFi.h> // 本程序使用 ESP8266WiFi库
#include <ESP8266WiFiMulti.h> // ESP8266WiFiMulti库
#include <ESP8266WebServer.h> // ESP8266WebServer库
#define buttonPin D3 // 按钮引脚D3
ESP8266WiFiMulti wifiMulti; // 建立ESP8266WiFiMulti对象,对象名称是'wifiMulti'
ESP8266WebServer esp8266_server(80);// 建立网络服务器对象,该对象用于响应HTTP请求。监听端口(80)
bool pinState; // 存储引脚状态用变量
void setup(){
Serial.begin(9600); // 启动串口通讯
delay(10);
Serial.println("");
pinMode(buttonPin, INPUT_PULLUP); // 将按键引脚设置为输入上拉模式
wifiMulti.addAP("ChinaNet-fLQc", "vxgdwscn"); // 将需要连接的一系列WiFi ID和密码输入这里
wifiMulti.addAP("abcd", "12345678"); // ESP8266-NodeMCU再启动后会扫描当前网络
wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3"); // 环境查找是否有这里列出的WiFi ID。如果有
Serial.println("Connecting ..."); // 则尝试使用此处存储的密码进行连接。
int i = 0;
while (wifiMulti.run() != WL_CONNECTED) { // 此处的wifiMulti.run()是重点。通过wifiMulti.run(),NodeMCU将会在当前
delay(1000); // 环境中搜索addAP函数所存储的WiFi。如果搜到多个存储的WiFi那么NodeMCU
Serial.print(i++); Serial.print(' '); // 将会连接信号最强的那一个WiFi信号。
} // 一旦连接WiFI成功,wifiMulti.run()将会返回“WL_CONNECTED”。这也是
// 此处while循环判断是否跳出循环的条件。
// WiFi连接成功后将通过串口监视器输出连接成功信息
Serial.println('\n'); // WiFi连接成功后
Serial.print("Connected to "); // NodeMCU将通过串口监视器输出。
Serial.println(WiFi.SSID()); // 连接的WiFI名称
Serial.print("IP address:\t"); // 以及
Serial.println(WiFi.localIP()); // NodeMCU的IP地址
esp8266_server.begin();
esp8266_server.on("/", handleRoot);
esp8266_server.onNotFound(handleNotFound);
Serial.println("HTTP esp8266_server started");// 告知用户ESP8266网络服务功能已经启动
}
void loop(){
esp8266_server.handleClient(); // 处理http服务器访问
pinState = digitalRead(buttonPin); // 获取引脚状态
}
//以下函数处理网站首页的访问请求。此函数为本示例程序重点1
//详细讲解请参见太极创客网站《零基础入门学用物联网》
//第3章-第2节“通过网络服务将开发板引脚状态显示在网页中”的说明讲解。
void handleRoot() { //处理网站目录“/”的访问请求
esp8266_server.send(200, "text/html", sendHTML(pinState));
}
//建立用于发送给客户端浏览器的HTML代码。此代码将会每隔5秒刷新页面。通过页面刷新,引脚的最新状态也会显示于页面中
String sendHTML(bool buttonState){
String htmlCode = "<!DOCTYPE html> <html>\n";
htmlCode +="<head><meta http-equiv='refresh' content='1'/>\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;
}
// 设置处理404情况的函数'handleNotFound'
void handleNotFound(){ // 当浏览器请求的网络资源无法在服务器找到时,
esp8266_server.send(404, "text/plain", "404: Not found"); // NodeMCU将调用此函数。
}
/***********************************************************************/
2.5、(3-3ESP8266闪存文件系统)教程配套代码测试通过
第一段代码如下(示例):
/**********************************************************************
程序名称/Program name : 11、使用12F写内容到闪存;esp8266-flash-write
团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author : CYNO 朔
日期/Date(YYYYMMDD) : 2402091130
程序目的/Purpose : 此程序用于演示如何向NodeMCU的SPIFFS中建立名为
notes.txt的文件,程序还将向该文件写入信息。
-----------------------------------------------------------------------
不知道您有没有想过,当我们上传程序给ESP8266时,我们的程序具体存放在什么地方呢?每一个ESP8266都配有一个闪存,这个闪存很像是一个小硬盘,
我们上传的文件就被存放在这个闪存里。这个闪存的全称是Serial Peripheral Interface Flash File System(SPIFFS)。
除了可以存放上传的程序以外,我们还可以将网页文件或者系统配置文件存放在ESP8266的闪存中。在这节课里,
我们将学习如何利用程序对闪存文件系统(SPIFFS)进行文件读取和修改。
函数说明:
SPIFFS.open(file_name, "w");
以上函数有两个参数:
第一个参数是被操作的文件名称,本示例中该文件为/notes.txt
第二个参数"w" 代表写入文件信息。(如需了解如何读取信息,请参阅示例程序esp8266-flash-read)
注意:点击工具->flash size->选择1M
***********************************************************************/
#include <FS.h>
String file_name = "/taichi-maker/notes.txt"; //被读取的文件位置和名称
void setup() {
Serial.begin(9600);
Serial.println("");
Serial.println("SPIFFS format start");
SPIFFS.format(); // 格式化SPIFFS
Serial.println("SPIFFS format finish");
if(SPIFFS.begin()){ // 启动SPIFFS
Serial.println("SPIFFS 启动成功。");
} else {
Serial.println("SPIFFS 启动失败。");
}
//文件对象
File dataFile = SPIFFS.open(file_name, "w");// 建立File对象用于向SPIFFS中的file对象(即/notes.txt)写入信息
dataFile.println("Hello IOT World.欢迎来到物联网世界。"); // 向dataFile写入字符串信息
dataFile.close(); // 完成文件写入后关闭文件
Serial.println("写入数据成功");
}
void loop() {
}
/***********************************************************************/
第二段代码如下(示例):
/**********************************************************************
程序名称/Program name : 12、读取12F闪存内容:esp8266-flash-read
团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author : CYNO 朔
日期/Date(YYYYMMDD) : 20191109
程序目的/Purpose : 此程序用于演示如何从NodeMCU的内置SPIFFS中存储的文件notes.txt读取数据。
notes.txt 文件内容将会通过串口监视器显示出来供用户确认。
注意在使用本程序以前需要先将notes.txt 文件上传到NodeMCU开发板的SPIFFS中
-----------------------------------------------------------------------
修订历史/Revision History
日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description
-----------------------------------------------------------------------
函数说明:
SPIFFS.open(file_name, "r");
以上SPIFFS函数有两个参数:
第一个参数是被操作的文件名称,本示例中该文件为/notes.txt
第二个参数"r" 代表读取文件信息。(如需了解如何写入信息,请参阅示例程序esp8266-flash-write)
***********************************************************************/
#include <FS.h>
//建立file_name字符串
String file_name = "/taichi-maker/notes.txt"; //被读取的文件位置和名称
void setup() {
Serial.begin(9600);
Serial.println("");
if(SPIFFS.begin()){ // 启动闪存文件系统
Serial.println("SPIFFS Started.");
} else {
Serial.println("SPIFFS Failed to Start.");
}
//确认闪存中是否有file_name文件
if (SPIFFS.exists(file_name)){ //exists 存在的意思;如果有这个文件,就告诉找到了,如果没有就告诉没有找到
Serial.print(file_name);
Serial.println(" FOUND.file_name.找到file_name文件了");
} else {
Serial.print(file_name);
Serial.print(" NOT FOUND.file_name.没有找到file_name文件");
}
//建立File对象用于从SPIFFS中读取文件
File dataFile = SPIFFS.open(file_name, "r");
//读取文件内容并且通过串口监视器输出文件信息
for(int i=0; i<dataFile.size(); i++){ //size大小,判断有多少个字符;8266系统每个字符都占用一个字节
Serial.print((char)dataFile.read()); //显示读取的一个字符信息
}
//完成文件读取后关闭文件
dataFile.close();
}
void loop() {
}
/***********************************************************************/
第三段代码如下(示例):
/**********************************************************************
程序名称/Program name : 13、向12F闪存添加内容:esp8266-flash-append
团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author : CYNO 朔
日期/Date(YYYYMMDD) : 20191109
程序目的/Purpose : 此程序用于演示如何向NodeMCU的内置SPIFFS中存储的文件
notes.txt添加数据。
备注:写入文件会格式化再写入,添加会执行几次添加几次
-----------------------------------------------------------------------
函数说明:
SPIFFS.open(file_name, "a");
以上SPIFFS函数有两个参数:
第一个参数是被操作的文件名称,本示例中该文件为/notes.txt
第二个参数"a" 代表添加文件信息。(如需了解如何读取信息,请参阅示例程序esp8266-flash-read)
此示例程序所演示的是向SPIFFS中的文件里添加信息。这一操作写入信息有所区别。
添加信息是不会删除文件内原有信息,而是在原有信息后面添加新的信息。
但写入操作(示例 esp8266-flash-write.ino)是将文件内容完全清除,重新写入新信息。
***********************************************************************/
#include <FS.h>
String file_name = "/taichi-maker/notes.txt"; //被读取的文件位置和名称
void setup() {
Serial.begin(9600);
Serial.println("");
if(SPIFFS.begin()){ // 启动闪存文件系统
Serial.println("SPIFFS Started.");
} else {
Serial.println("SPIFFS Failed to Start.");
}
//确认闪存中是否有file_name文件
if (SPIFFS.exists(file_name)){
Serial.print(file_name);
Serial.println(" FOUND.");
File dataFile = SPIFFS.open(file_name, "a");// 建立File对象用于向SPIFFS中的file对象(即/notes.txt)写入信息
dataFile.println("This is Appended Info.添加文件已成功。"); // 向dataFile添加字符串信息
dataFile.close(); // 完成文件操作后关闭文件
Serial.println("Finished Appending data to SPIFFS");
} else {
Serial.print(file_name);
Serial.print(" NOT FOUND.");
}
}
void loop() {
}
/***********************************************************************/
第四段代码如下(示例):
/**********************************************************************
程序名称/Program name : 13、向12F闪存添加内容:esp8266-flash-append
团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author : CYNO 朔
日期/Date(YYYYMMDD) : 20191109
程序目的/Purpose : 此程序用于演示如何向NodeMCU的内置SPIFFS中存储的文件
notes.txt添加数据。
备注:写入文件会格式化再写入,添加会执行几次添加几次
-----------------------------------------------------------------------
函数说明:
SPIFFS.open(file_name, "a");
以上SPIFFS函数有两个参数:
第一个参数是被操作的文件名称,本示例中该文件为/notes.txt
第二个参数"a" 代表添加文件信息。(如需了解如何读取信息,请参阅示例程序esp8266-flash-read)
此示例程序所演示的是向SPIFFS中的文件里添加信息。这一操作写入信息有所区别。
添加信息是不会删除文件内原有信息,而是在原有信息后面添加新的信息。
但写入操作(示例 esp8266-flash-write.ino)是将文件内容完全清除,重新写入新信息。
***********************************************************************/
#include <FS.h>
String file_name = "/taichi-maker/notes.txt"; //被读取的文件位置和名称
void setup() {
Serial.begin(9600);
Serial.println("");
if(SPIFFS.begin()){ // 启动闪存文件系统
Serial.println("SPIFFS Started.");
} else {
Serial.println("SPIFFS Failed to Start.");
}
//确认闪存中是否有file_name文件
if (SPIFFS.exists(file_name)){
Serial.print(file_name);
Serial.println(" FOUND.");
File dataFile = SPIFFS.open(file_name, "a");// 建立File对象用于向SPIFFS中的file对象(即/notes.txt)写入信息
dataFile.println("This is Appended Info.添加文件已成功。"); // 向dataFile添加字符串信息
dataFile.close(); // 完成文件操作后关闭文件
Serial.println("Finished Appending data to SPIFFS");
} else {
Serial.print(file_name);
Serial.print(" NOT FOUND.");
}
}
void loop() {
}
/***********************************************************************/
第五段代码如下(示例):
/**********************************************************************
程序名称/Program name : 14、内置SPIFFS中文件夹里读取文件信息: esp8266-flash-folder-read
团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author : CYNO 朔
日期/Date(YYYYMMDD) : 20191109
程序目的/Purpose : 此程序用于演示如何从NodeMCU的内置SPIFFS中文件夹里读取文件信息
文件夹内容将会通过串口监视器显示出来。
-----------------------------------------------------------------------
修订历史/Revision History
日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description
-----------------------------------------------------------------------
函数说明:
SPIFFS.openDir(folder_name);
以上函数打开指定目录并返回一个目录对象实例。
***********************************************************************/
#include <FS.h>
String file_name = "/taichi-maker/myFile.txt"; //被读取的文件位置和名称
String folder_name = "/taichi-maker"; //被读取的文件夹
void setup() {
Serial.begin(9600);
Serial.println("");
if(SPIFFS.begin()){ // 启动闪存文件系统
Serial.println("SPIFFS Started.");
} else {
Serial.println("SPIFFS Failed to Start.");
}
File dataFile = SPIFFS.open(file_name, "w");// 建立File对象用于向SPIFFS中的file对象(即myFile.txt)写入信息
dataFile.println("Hello Taichi-Maker."); // 向dataFile写入字符串信息
dataFile.close(); // 完成文件写入后关闭文件
Serial.println(F("Finished Writing data to SPIFFS"));
// 显示目录中文件内容以及文件大小
Dir dir = SPIFFS.openDir(folder_name); // 建立“目录”对象
while (dir.next()) { // dir.next()用于检查目录中是否还有“下一个文件”
Serial.println(dir.fileName()); // 输出文件名
}
}
void loop() {}
/***********************************************************************/
第六段代码如下(示例):
/**********************************************************************
程序名称/Program name : 14、内置SPIFFS中文件夹里读取文件信息: esp8266-flash-folder-read
团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author : CYNO 朔
日期/Date(YYYYMMDD) : 20191109
程序目的/Purpose : 此程序用于演示如何从NodeMCU的内置SPIFFS中文件夹里读取文件信息
文件夹内容将会通过串口监视器显示出来。
-----------------------------------------------------------------------
修订历史/Revision History
日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description
-----------------------------------------------------------------------
函数说明:
SPIFFS.openDir(folder_name);
以上函数打开指定目录并返回一个目录对象实例。
***********************************************************************/
#include <FS.h>
String file_name = "/taichi-maker/myFile.txt"; //被读取的文件位置和名称
String folder_name = "/taichi-maker"; //被读取的文件夹
void setup() {
Serial.begin(9600);
Serial.println("");
if(SPIFFS.begin()){ // 启动闪存文件系统
Serial.println("SPIFFS Started.");
} else {
Serial.println("SPIFFS Failed to Start.");
}
File dataFile = SPIFFS.open(file_name, "w");// 建立File对象用于向SPIFFS中的file对象(即myFile.txt)写入信息
dataFile.println("Hello Taichi-Maker."); // 向dataFile写入字符串信息
dataFile.close(); // 完成文件写入后关闭文件
Serial.println(F("Finished Writing data to SPIFFS"));
// 显示目录中文件内容以及文件大小
Dir dir = SPIFFS.openDir(folder_name); // 建立“目录”对象
while (dir.next()) { // dir.next()用于检查目录中是否还有“下一个文件”
Serial.println(dir.fileName()); // 输出文件名
}
}
void loop() {}
/***********************************************************************/
第七段代码如下(示例):
/**********************************************************************
程序名称/Program name : 15、删除文件夹:esp8266-flash-remove
团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author : CYNO 朔
日期/Date(YYYYMMDD) : 20191109
程序目的/Purpose : 此程序用于演示如何删除SPIFFS中存储的文件
***********************************************************************/
#include <FS.h>
String file_name = "/taichi-maker/notes.txt"; //被读取的文件位置和名称
void setup() {
Serial.begin(9600);
Serial.println("");
if(SPIFFS.begin()){ // 启动闪存文件系统
Serial.println("SPIFFS Started.");
} else {
Serial.println("SPIFFS Failed to Start.");
}
//从闪存中删除file_name文件
if (SPIFFS.remove(file_name)){
Serial.print(file_name);
Serial.println(" remove sucess");
} else {
Serial.print(file_name);
Serial.println(" remove fail");
}
}
void loop() {}
/***********************************************************************/
第八段代码如下(示例):
/**********************************************************************
程序名称/Program name : 16、文件夹信息:esp8266-flash-info
团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author : CYNO 朔
日期/Date(YYYYMMDD) : 20200204
程序目的/Purpose : 此程序用于演示如何使用FSInfo对象来显示闪存文件系统状态
-----------------------------------------------------------------------
修订历史/Revision History
日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description
***********************************************************************/
#include <FS.h>
FSInfo fs_info;
void setup() {
Serial.begin(9600);
SPIFFS.begin(); //启动SPIFFS
Serial.println("");
Serial.println("SPIFFS Started.");
// 闪存文件系统信息
SPIFFS.info(fs_info);
// 可用空间总和(单位:字节)
Serial.print("totalBytes: ");
Serial.print(fs_info.totalBytes);
Serial.println(" Bytes");
// 已用空间(单位:字节)
Serial.print("usedBytes: ");
Serial.print(fs_info.usedBytes);
Serial.println(" Bytes");
// 最大文件名字符限制(含路径和'\0')
Serial.print("maxPathLength: ");
Serial.println(fs_info.maxPathLength);
// 最多允许打开文件数量
Serial.print("maxOpenFiles: ");
Serial.println(fs_info.maxOpenFiles);
// 存储块大小
Serial.print("blockSize: ");
Serial.println(fs_info.blockSize);
// 存储页大小
Serial.print("pageSize: ");
Serial.println(fs_info.pageSize);
}
void loop() {}
/***********************************************************************/
第九段代码如下(示例):
/**********************************************************************
项目名称/Project : 零基础入门学用物联网
程序名称/Program name :17、 esp8266-data-upload
团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author : CYNO 朔
日期/Date(YYYYMMDD) : 20191109
程序目的/Purpose : 此程序用于演示如何使用Arduino IDE向NodeMCU开发板的闪存文件系统
上传文件。
-----------------------------------------------------------------------
修订历史/Revision History
日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description
-----------------------------------------------------------------------
说明:
在使用本程序以前,请先将ESP8266FS闪存文件上传插件安装到Arduino IDE中。具体操作请打开以下
链接前往太极创客网站相关教程页面获取详细信息。
http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/spiffs/upload-files/
***********************************************************************/
#include <ESP8266WiFi.h>
#include <FS.h>
String file_name = "/test_text.txt"; //被读取的文件位置和名称
void setup() {
Serial.begin(9600);
SPIFFS.begin(); //启动SPIFFS
Serial.println("SPIFFS Started.");
if (SPIFFS.exists(file_name)){
Serial.print(file_name);
Serial.println(" FOUND.");
} else {
Serial.print(file_name);
Serial.print(" NOT FOUND.");
}
//建立File对象用于从SPIFFS中读取文件
File dataFile = SPIFFS.open(file_name, "r");
//读取文件内容并且通过串口监视器输出文件信息
for(int i=0; i<dataFile.size(); i++){
Serial.print((char)dataFile.read());
}
//完成文件读取后关闭文件
dataFile.close();
}
void loop() {}
/***********************************************************************/
总结
欲知后事如何,且听下回分解。