具体实现功能:网页+APP 实现控制舵机等IO操作。
1、使用 AP 模式提供WiFi接入,终端设备通过 Web 网页实现舵机控制;
2、使用串口连接蓝牙模组,提供蓝牙接入,终端设备通过手机APP实现舵机控制;
3、按键实现舵机角度录入;
4、LED 实现状态显示和告警;
5、ADC 实现系统电压检测。
功能演示+讲解视频地址:【esp8266+arduino】WiFi+蓝牙实现无线开关功能演示(宿舍神器)_哔哩哔哩_bilibili
源码地址:基于esp8266的开关外设装置: 存放关于此装置的所有工程文件和教程资料,供大家一起学习
目录
本篇作为开发记录
1、文档
开发过程中需要用到的官方文档
ESP8266 Arduino Core :Welcome to ESP8266 Arduino Core’s documentation! — ESP8266 Arduino Core 2.4.0 documentation
NodeMCU Documentation:NodeMCU Documentation
ESP12E DevKit:产品简介 | ESP12E DevKit 产品说明书
2、WiFi AP 测试
AP(Access Point):访问接入点,一般家庭的无线路由器就是一个AP。简单来说 AP 模式就是让 ESP8266 创建一个 WIFI,让它成为一个 WiFi,我们用手机或者电脑等设备去连接它,而不是让 ESP8266 去连接其它 WiFi
功能:提供 WIFI 连接
参照:ESP8266-Soft AP模式 —— 谁想连上我 - 天子骄龙 - 博客园
功能函数(参数):
设置WIFI模式为 AP 模式
WiFi.mode(WIFI_AP)
配置AP网络信息
IPAddress local_IP(192, 168, 1, 1); //实例化IP地址
IPAddress gateway(192, 168, 1, 1); //实例化网关IP地址
IPAddress subnet(255, 255, 255, 0); //实例化子网掩码
WiFi.softAPConfig(local_IP, gateway, subnet)
设置账号和密码
#define AP_SSID "TEST" //这里改成你的 AP(WiFi)名字
#define AP_PSW "12345678" //这里改成你的 AP (WiFi)密码 8位及以上!!!
WiFi.softAP(AP_SSID, AP_PSW)
注意:WiFi 密码必须是 8位及以上(我犯傻写了4位,弄了半天配置不成功)
#include <ESP8266WiFi.h>
#define AP_SSID "Test" //这里改成你的AP名字--AP账号
#define AP_PSW "12345678" //这里改成你的AP密码 8位以上
IPAddress local_IP(192, 168, 1, 1); //实例化IP地址
IPAddress gateway(192, 168, 1, 1); //实例化网关IP地址
IPAddress subnet(255, 255, 255, 0); //实例化子网掩码
void setup() {
Serial.begin(115200); //串口配置波特率
delay(2000);
Serial.print("配置AP网络信息。。。。。。");
WiFi.mode(WIFI_AP); //设置WIFI模式为AP模式
delay(2000);
Serial.println(WiFi.softAPConfig(local_IP, gateway, subnet) ? "网络配置成功" : "网络配置失败"); //配置AP网络信息---并且串口提示输出
Serial.print("设置AP......");
bool result = WiFi.softAP(AP_SSID, AP_PSW); //设置账号和密码,通道为1,wifi不隐藏,最大连接数=4
//返回值:是否成功
if (result) {
Serial.println("账号密码设置成功");
Serial.println(String("Soft-AP IP 地址是: ") + String(WiFi.softAPIP().toString()));
//WiFi.softAPIP() 获取AP的IP地址--就是IPAddress local_IP(192,168,1,1)
Serial.println(String("MAC 地址是: ") + WiFi.softAPmacAddress().c_str());
//WiFi.softAPmacAddress().c_str() 获取AP的mac地址并转化成指针
Serial.println("设置完成");
} else {
Serial.println("账号密码设置失败");
}
}
void loop() {
}
测试结果和 web server 测试一同在下面展示
3、web Server 测试
ESP8266 作为 web 服务器,提供 web 服务;连上 WiFi 后通过访问 IP 地址打开相应网页
功能:提供 Web 访问服务
功能函数(参数):
web 服务的请求路径(“/”)和相应处理函数(“handleRoot”)
server.on("/", handleRoot)
void handleRoot() {
server.send(200, "text/html", "You are connected");
}
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#define AP_SSID "Test" //这里改成你的AP名字--AP账号
#define AP_PSW "12345678" //这里改成你的AP密码 8位以上
IPAddress local_IP(192, 168, 1, 1); //实例化IP地址
IPAddress gateway(192, 168, 1, 1); //实例化网关IP地址
IPAddress subnet(255, 255, 255, 0); //实例化子网掩码
ESP8266WebServer server(80);
void handleRoot() {
server.send(200, "text/html", "<h1>This is a test</h1>");
}
void setup() {
Serial.begin(115200); //串口配置波特率
delay(2000);
Serial.print("配置AP网络信息。。。。。。");
WiFi.mode(WIFI_AP); //设置WIFI模式为AP模式
delay(2000);
Serial.println(WiFi.softAPConfig(local_IP, gateway, subnet) ? "网络配置成功" : "网络配置失败"); //配置AP网络信息---并且串口提示输出
Serial.print("设置AP......");
bool result = WiFi.softAP(AP_SSID, AP_PSW); //设置账号和密码,通道为1,wifi不隐藏,最大连接数=4
//返回值:是否成功
if (result) {
Serial.println("账号密码设置成功");
Serial.println(String("Soft-AP IP 地址是: ") + String(WiFi.softAPIP().toString()));
//WiFi.softAPIP() 获取AP的IP地址--就是IPAddress local_IP(192,168,1,1)
Serial.println(String("MAC 地址是: ") + WiFi.softAPmacAddress().c_str());
//WiFi.softAPmacAddress().c_str() 获取AP的mac地址并转化成指针
Serial.println("设置完成");
} else {
Serial.println("账号密码设置失败");
}
server.on("/", handleRoot);
server.begin();
Serial.println("HTTP server started");
}
void loop() {
server.handleClient();
}
测试结果:
4、web 控制 IO 测试
功能:控制 LED 、按键、舵机等IO
参考:ESP8266+网页控制LED :ESP8266+网页控制LED_Ti多芬的博客-CSDN博客_esp8266网页控制led
引脚图:(网上都是这图,但不知道具体型号,所以坑慢慢踩吧)
功能函数(参数):
设置 D5 引脚为输出模式以便控制 LED
pinMode(D5, OUTPUT);
改变 LED 的点亮或者熄灭状态
digitalWrite(D5,!digitalRead(D5));
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#define AP_SSID "Test" //这里改成你的AP名字--AP账号
#define AP_PSW "12345678" //这里改成你的AP密码 8位以上
IPAddress local_IP(192, 168, 1, 1); //实例化IP地址
IPAddress gateway(192, 168, 1, 1); //实例化网关IP地址
IPAddress subnet(255, 255, 255, 0); //实例化子网掩码
ESP8266WebServer server(80);
void setup() {
Serial.begin(115200); //串口配置波特率
delay(2000);
pinMode(D5, OUTPUT); //设置D5引脚为输出模式以便控制LED
Serial.print("配置AP网络信息。。。。。。");
WiFi.mode(WIFI_AP); //设置WIFI模式为AP模式
delay(2000);
Serial.println(WiFi.softAPConfig(local_IP, gateway, subnet) ? "网络配置成功" : "网络配置失败"); //配置AP网络信息---并且串口提示输出
Serial.print("设置AP......");
bool result = WiFi.softAP(AP_SSID, AP_PSW); //设置账号和密码,通道为1,wifi不隐藏,最大连接数=4
//返回值:是否成功
if (result) {
Serial.println("账号密码设置成功");
Serial.println(String("Soft-AP IP 地址是: ") + String(WiFi.softAPIP().toString()));
//WiFi.softAPIP() 获取AP的IP地址--就是IPAddress local_IP(192,168,1,1)
Serial.println("设置完成");
} else {
Serial.println("账号密码设置失败");
}
//server.on("/", handleRoot);
//server.begin();
server.begin(); // 启动网站服务
server.on("/", HTTP_GET, handleRoot); // 设置服务器根目录即'/'的函数'handleRoot'
server.on("/LED", HTTP_POST, handleLED); // 设置处理LED控制请求的函数'handleLED'
server.onNotFound(handleNotFound); // 设置处理404情况的函数'handleNotFound'
Serial.println("HTTP server started");
}
void loop() {
server.handleClient();
}
/*设置服务器根目录即'/'的函数'handleRoot'
该函数的作用是每当有客户端访问NodeMCU服务器根目录时,
NodeMCU都会向访问设备发送 HTTP 状态 200 (Ok) 这是send函数的第一个参数。
同时NodeMCU还会向浏览器发送HTML代码,以下示例中send函数中第三个参数,
也就是双引号中的内容就是NodeMCU发送的HTML代码。该代码可在网页中产生LED控制按钮。
当用户按下按钮时,浏览器将会向NodeMCU的/LED页面发送HTTP请求,请求方式为POST。
NodeMCU接收到此请求后将会执行handleLED函数内容*/
void handleRoot() {
server.send(200, "text/html", "<form action=\"/LED\" method=\"POST\"><input type=\"submit\" value=\"LED\"></form>");
Serial.println("访问根目录");
}
//处理LED控制请求的函数'handleLED'
void handleLED() {
digitalWrite(D5,!digitalRead(D5));// 改变LED的点亮或者熄灭状态
server.sendHeader("Location","/");// 跳转回页面根目录
server.send(303); // 发送Http相应代码303 跳转
Serial.println("/LED 请求");
}
// 设置处理404情况的函数'handleNotFound'
void handleNotFound(){
server.send(404, "text/plain", "404: Not found"); // 发送 HTTP 状态 404 (未找到页面) 并向浏览器发送文字 "404: Not found"
}
5、强制门户 测试
功能:强制门户概念:连接上wifi以后,手机会自动打开一个网页(连上 WiFi 后自动弹出操作 IO 的页面)
参考:ESP8266的Web配网以及强制门户的实现(连接wifi自动打开网页)_江麟的博客-CSDN博客_esp8266网页配网
实现原理:
当手机连接上一个 wifi 后,会访问一个手机内部的网址去查看是否可以上网,在访问此网址的时候会先发起DNS请求,向服务器问域名的IP地址。然后再发起HTTP请求,请求想要的内容。esp8266 相当于DNS服务器,会收到手机发来的DNS请求,这时将请求的 IP 地址指向 esp8266 的地址就可以实现强制门户功能。
DNSServer dnsServer; //创建dnsServer实例
IPAddress apIP(192, 168, 4, 1);//esp8266-AP-IP地址
const byte DNS_PORT = 53; //DNS端口号
dnsServer.start(DNS_PORT, "*", apIP)//所有地址映射到esp8266的ip上
server.on("/", HTTP_GET, handleRoot); //设置主页回调函数
server.onNotFound(handleRoot); //设置无法响应的http请求的回调函数
WiFi.setAutoConnect(true);//设置自动连接
注意:
① server.on("/", HTTP_GET, handleRoot);必须在第二个参数上添加上HTTP_GET才能不影响强制门户,防止有些设备无法弹出强制门户,要用域名访问,如果不加第二个参数,就只能实现域名访问而无法强制门户。
② server.onNotFound(handleRoot); 在无法响应的http请求响应回调设置为主页的回调函数,才可以强制门户
③经测试,WiFi.setAutoConnect(true); 加上这一句才能使用强制门户(知道原因的请指点一下,谢谢)
TestGateDemo:
目前实现了:输入密码连上 WiFi 后,自动弹出操作 IO 的页面(开/关),点击开关按键,跳转页面(“操作成功”),D5 端口输出(LED灯亮);点击“操作成功”按键,回到(开/关)页面。
#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
const char* AP_SSID = "TestGate"; //这里改成你的AP名字--AP账号
const char* AP_PSW = "12345678"; //这里改成你的AP密码 8位以上
//配网页面代码
const char* page_html = "\
<!DOCTYPE html>\r\n\
<html lang='en'>\r\n\
<head>\r\n\
<meta charset='UTF-8'>\r\n\
<meta name='viewport' content='width=device-width, initial-scale=1.0'>\r\n\
<title>Switch</title>\r\n\
<style>\r\n\
body {\r\n\
background-color: rgb(247, 250, 95);\r\n\
}\r\n\
.box {\r\n\
width: 200px;\r\n\
height: 110px;\r\n\
background-color: rgb(92, 134, 250);\r\n\
border: 4px solid gray;\r\n\
position: absolute;\r\n\
left: 50%;\r\n\
top: 50%;\r\n\
margin-top: -55px;\r\n\
margin-left: -100px;\r\n\
border-radius: 10px;\r\n\
font-size: 70px;\r\n\
font-weight: 500;\r\n\
color: white;\r\n\
outline: none;\r\n\
}\r\n\
</style>\r\n\
</head>\r\n\
<body>\r\n\
<form name='input' action='/SWITCH' method='POST' >\r\n\
<input type='submit' value='开/关' class='box'><br>\r\n\
</form>\r\n\
</body>\r\n\
</html>\r\n\
";
const char* page_success_html = "\
<!DOCTYPE html>\r\n\
<html lang='en'>\r\n\
<head>\r\n\
<meta charset='UTF-8'>\r\n\
<meta name='viewport' content='width=device-width, initial-scale=1.0'>\r\n\
<title>Switch</title>\r\n\
<style>\r\n\
body {\r\n\
background-color: rgb(247, 250, 95);\r\n\
}\r\n\
.box {\r\n\
width: 200px;\r\n\
height: 110px;\r\n\
background-color: rgb(92, 134, 250);\r\n\
border: 4px solid gray;\r\n\
position: absolute;\r\n\
left: 50%;\r\n\
top: 50%;\r\n\
margin-top: -55px;\r\n\
margin-left: -100px;\r\n\
border-radius: 10px;\r\n\
font-size: 40px;\r\n\
font-weight: 400;\r\n\
color: white;\r\n\
outline: none;\r\n\
}\r\n\
</style>\r\n\
</head>\r\n\
<body>\r\n\
<form name='input' action='/SUCCESS' method='POST' >\r\n\
<input type='submit' value='操作成功' class='box'><br>\r\n\
</form>\r\n\
</body>\r\n\
</html>\r\n\
";
const byte DNS_PORT = 53; //DNS端口号
IPAddress apIP(192, 168, 4, 1); //esp8266-AP-IP地址
DNSServer dnsServer; //创建dnsServer实例
ESP8266WebServer server(80); //创建WebServer
void handleRoot() {//访问主页回调函数
server.send(200, "text/html", page_html);
}
//Post回调函数:处理LED控制请求
void handleRootPost() {
digitalWrite(D5,!digitalRead(D5));// 改变LED的点亮或者熄灭状态
//server.sendHeader("Location",page_success_html);// 跳转回页面根目录
server.send(200, "text/html", page_success_html);
server.send(303); // 发送Http相应代码303 跳转
Serial.println("/SWITCH 请求");
}
void handleRootSuccess() {//访问主页回调函数
server.send(200, "text/html", page_html);
Serial.println("/SUCCESS请求");
}
//初始化基础
void initBasic(void){
Serial.begin(115200);
pinMode(D5, OUTPUT); //设置D5引脚为输出模式以便控制LED
}
//初始化AP模式
void initSoftAP(void){
WiFi.mode(WIFI_AP);
WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
if(WiFi.softAP(AP_SSID,AP_PSW)){
Serial.println("ESP8266 SoftAP is right");
}
}
//初始化WebServer
void initWebServer(void){
/*必须在第二个参数上添加上HTTP_GET才能不影响强制门户,防止有些设备无法弹出强制门户,要用域名访问,
如果不加第二个参数,就只能实现域名访问而无法强制门户
在无法响应的http请求响应回调设置为主页的回调函数,才可以强制门户*/
server.on("/", HTTP_GET, handleRoot);//设置主页回调函数
server.onNotFound(handleRoot);//设置无法响应的http请求的回调函数
server.on("/SWITCH", HTTP_POST, handleRootPost);//设置Post请求回调函数
server.on("/SUCCESS", HTTP_POST, handleRootSuccess);//设置Post请求回调函数
server.begin();//启动WebServer
Serial.println("WebServer started!");
}
void initDNS(void){//初始化DNS服务器
if(dnsServer.start(DNS_PORT, "*", apIP)){//判断将所有地址映射到esp8266的ip上是否成功
Serial.println("start dnsserver success.");
}
else Serial.println("start dnsserver failed.");
}
void connectNewWifi(void){
WiFi.setAutoConnect(true);//设置自动连接(经过测试,强制门户必须要加上这一句)
//WiFi.begin(); //(经过测试,强制门户必须要加上这一句,我并没有找到原因)
int count = 0;
while (WiFi.status() != WL_CONNECTED) {
delay(500);
count++;
if(count > 10){//如果5秒内没有连上,就开启Web配网 可适当调整这个时间
initSoftAP();
initWebServer();
initDNS();
break;//跳出 防止无限初始化
}
Serial.print(".");
}
}
void setup() {
initBasic();
connectNewWifi();
}
void loop() {
server.handleClient();
dnsServer.processNextRequest();
}
6、蓝牙数据传输 测试
蓝牙模块设置:
参考:【常用模块】HC-05蓝牙串口通信模块使用详解(实例:手机蓝牙控制STM32单片机)_Yngz_Miao的博客-CSDN博客_hc05
遇到 AT+NAME? 无响应的问题,参考:HC-05连接时部分AT指令有用,部分AT指令(AT+NAME?)无反应**_百岁老人月下的博客-CSDN博客_发→◇at+name?□ [17:03:39.571]收←◆+err:1003
功能:ESP8266 模块连接蓝牙模块,手机连接蓝牙发送数据,蓝牙模块接收到数据之后串口发送给 esp8266 ,esp8266 根据接收到的数据进行 IO 操作。
参考:ESP6266连接蓝牙模块实现LED控制 :ESP8266连接蓝牙模块实现LED控制 - Arduino专区 - 一板网电子技术论坛
功能函数(参数):
#include <SoftwareSerial.h>
SoftwareSerial btSerial(D7, D8); // 串口2: Rx(D7),Tx(D8)
// 串口1:Rx(D2),Tx(D4)
// 串口0:Rx(D9),Tx(D10) Arduino IDE 使用的串口
btSerial.begin(9600); // 蓝牙波特率
char data = btSerial.read(); // 读取蓝牙模块接收到的数据
btSerial.write("start"); // 同过串口发送数据
//蓝牙服务
void bluetoothService(){
if (btSerial.available() > 0) { // check if bluetooth module sends some data to esp8266
char data = btSerial.read(); // read the data from bluetooth
switch (data)
{
case 'C': // if receive data is 'C'(chance)
digitalWrite(D5,!digitalRead(D5)); // 改变LED的点亮或者熄灭状态
Serial.println("bluetooth chances the status");
break;
default:
break;
}
}
}
esp8266 板子的引脚是一个坑:
// 串口2: Rx(D7),Tx(D8)
// 串口1:Rx(D2),Tx(D4)
// 串口0:Rx(D9),Tx(D10) Arduino IDE 使用的串口
TestBluetooth:
目前实现了:①输入密码连上 WiFi 后,自动弹出操作 IO 的页面(开/关);
②弹出的网页:点击开关按键,跳转页面(“操作成功”),D5 端口输出(LED灯亮);点击“操作成功”按键,回到(开/关)页面;
③连上蓝牙,发送 C(change) D5 端口输出(LED灯亮/灭);
#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <SoftwareSerial.h>
//------------------------------- 页面代码 ----------------------------------------
const char* page_html = "\
<!DOCTYPE html>\r\n\
<html lang='en'>\r\n\
<head>\r\n\
<meta charset='UTF-8'>\r\n\
<meta name='viewport' content='width=device-width, initial-scale=1.0'>\r\n\
<title>Switch</title>\r\n\
<style>\r\n\
body {\r\n\
background-color: rgb(247, 250, 95);\r\n\
}\r\n\
.box {\r\n\
width: 200px;\r\n\
height: 110px;\r\n\
background-color: rgb(92, 134, 250);\r\n\
border: 4px solid gray;\r\n\
position: absolute;\r\n\
left: 50%;\r\n\
top: 50%;\r\n\
margin-top: -55px;\r\n\
margin-left: -100px;\r\n\
border-radius: 10px;\r\n\
font-size: 70px;\r\n\
font-weight: 500;\r\n\
color: white;\r\n\
outline: none;\r\n\
}\r\n\
</style>\r\n\
</head>\r\n\
<body>\r\n\
<form name='input' action='/SWITCH' method='POST' >\r\n\
<input type='submit' value='开/关' class='box'><br>\r\n\
</form>\r\n\
</body>\r\n\
</html>\r\n\
";
const char* page_success_html = "\
<!DOCTYPE html>\r\n\
<html lang='en'>\r\n\
<head>\r\n\
<meta charset='UTF-8'>\r\n\
<meta name='viewport' content='width=device-width, initial-scale=1.0'>\r\n\
<title>Switch</title>\r\n\
<style>\r\n\
body {\r\n\
background-color: rgb(247, 250, 95);\r\n\
}\r\n\
.box {\r\n\
width: 200px;\r\n\
height: 110px;\r\n\
background-color: rgb(92, 134, 250);\r\n\
border: 4px solid gray;\r\n\
position: absolute;\r\n\
left: 50%;\r\n\
top: 50%;\r\n\
margin-top: -55px;\r\n\
margin-left: -100px;\r\n\
border-radius: 10px;\r\n\
font-size: 40px;\r\n\
font-weight: 400;\r\n\
color: white;\r\n\
outline: none;\r\n\
}\r\n\
</style>\r\n\
</head>\r\n\
<body>\r\n\
<form name='input' action='/SUCCESS' method='POST' >\r\n\
<input type='submit' value='操作成功' class='box'><br>\r\n\
</form>\r\n\
</body>\r\n\
</html>\r\n\
";
//------------------------------- 环境配置 ----------------------------------------
const char* AP_SSID = "TestGate"; // 这里改成你的AP名字--AP账号
const char* AP_PSW = "12345678"; // 这里改成你的AP密码 8位以上
const byte DNS_PORT = 53; // DNS端口号
IPAddress apIP(192, 168, 4, 1); // esp8266-AP-IP地址
DNSServer dnsServer; // 创建dnsServer实例
ESP8266WebServer server(80); // 创建WebServer
SoftwareSerial btSerial(D7, D8); // 串口2: Rx,Tx
//------------------------------- 网页请求处理 ----------------------------------------
void handleRoot() {//访问主页回调函数
server.send(200, "text/html", page_html);
}
//Post回调函数:处理LED控制请求
void handleRootPost() {
digitalWrite(D5,!digitalRead(D5));// 改变LED的点亮或者熄灭状态
//server.sendHeader("Location",page_success_html);// 跳转回页面根目录
server.send(200, "text/html", page_success_html);
server.send(303); // 发送Http相应代码303 跳转
Serial.println("/SWITCH 请求");
}
void handleRootSuccess() {//访问主页回调函数
server.send(200, "text/html", page_html);
Serial.println("/SUCCESS请求");
}
//------------------------------- 配置函数 ----------------------------------------
//基础初始化
void initBasic(void){
delay(1000);
Serial.begin(115200); // 串口波特率
btSerial.begin(9600); // 蓝牙波特率
pinMode(D5, OUTPUT); //设置D5引脚为输出模式以便控制LED
Serial.println("Started...");
btSerial.write("start");
}
//初始化AP模式
void initSoftAP(void){
WiFi.mode(WIFI_AP);
WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
if(WiFi.softAP(AP_SSID,AP_PSW)){
Serial.println("ESP8266 SoftAP is right");
}
}
//初始化WebServer
void initWebServer(void){
/*必须在第二个参数上添加上HTTP_GET才能不影响强制门户,防止有些设备无法弹出强制门户,要用域名访问,
如果不加第二个参数,就只能实现域名访问而无法强制门户
在无法响应的http请求响应回调设置为主页的回调函数,才可以强制门户*/
server.on("/", HTTP_GET, handleRoot);//设置主页回调函数
server.onNotFound(handleRoot);//设置无法响应的http请求的回调函数
server.on("/SWITCH", HTTP_POST, handleRootPost);//设置Post请求回调函数
server.on("/SUCCESS", HTTP_POST, handleRootSuccess);//设置Post请求回调函数
server.begin();//启动WebServer
Serial.println("WebServer started!");
}
//初始化DNS
void initDNS(void){//初始化DNS服务器
if(dnsServer.start(DNS_PORT, "*", apIP)){//判断将所有地址映射到esp8266的ip上是否成功
Serial.println("start dnsserver success.");
}
else Serial.println("start dnsserver failed.");
}
//全部环境初始化
void connectNewWifi(void){
WiFi.setAutoConnect(true); //设置自动连接(经过测试,强制门户必须要加上这一句)
//WiFi.begin(); //(经过测试,强制门户必须要加上这一句,我并没有找到原因)
int count = 0;
while (WiFi.status() != WL_CONNECTED) {
delay(500);
count++;
if(count > 10){//如果5秒内没有连上,就开启Web配网 可适当调整这个时间
initSoftAP();
initWebServer();
initDNS();
break;//跳出 防止无限初始化
}
Serial.print(".");
}
}
//------------------------------- setup(配置函数) ----------------------------------------
void setup() {
initBasic();
connectNewWifi();
}
//------------------------------- loop(主函数) -------------------------------------------
void loop() {
server.handleClient();
dnsServer.processNextRequest();
bluetoothService();
}
//------------------------------- 服务函数 ----------------------------------------
//蓝牙服务
void bluetoothService(){
if (btSerial.available() > 0) { // check if bluetooth module sends some data to esp8266
char data = btSerial.read(); // read the data from bluetooth
switch (data)
{
case 'C': // if receive data is 'C'(change)
digitalWrite(D5,!digitalRead(D5)); // 改变LED的点亮或者熄灭状态
Serial.println("bluetooth chances the status");
break;
default:
break;
}
}
}
测试结果:
7、ADC外部电路电压 测试
功能:整个项目中用来检测电量:当电量低时 LED 灯亮(报警)
参考:arduino 读取模拟电压_ESP8266开发之旅 基础篇—ESP8266与Arduino的开发说明_龚匠的博客-CSDN博客
分压电路参考:arduino开发ESP8266学习笔记五——模拟输入 - 提货人 - 博客园
板子上有一个ADC口,电压范围为 0 - 1.0V;分压电路我踩了坑:电阻过大导致没有值。
TestADC:
void setup() {
Serial.begin(115200);
}
void loop() {
Serial.print("ADC Value: ");
//输出0-1023 对应 外部输入电压 0-1.0v
Serial.println(analogRead(A0));
//延时1s
delay(1000);
}
8、舵机控制 测试
功能:控制舵机完成 打开和关闭 开关面板 的机械动作
舵机文档:(注意工作电压,注意共地!)
参考:NodeMcu Esp8266 控制舵机 - freexiaoyu - 博客园
TestServo:
#include <Servo.h>
Servo myServo; // 定义Servo对象来控制
int pos = 0; // 角度存储变量
void setup() {
myServo.attach(12); //D6
myServo.write(120); // 舵机角度写入
delay(500);
}
void loop() {
for (pos = 0; pos <= 180; pos ++) { // 0°到180°
// in steps of 1 degree
myServo.write(pos); // 舵机角度写入
delay(15); // 等待转动到指定角度
}
delay(2000);//延时2s
for (pos = 180; pos >= 0; pos --) { // 从180°到0°
myServo.write(pos); // 舵机角度写入
delay(15); // 等待转动到指定角度
}
delay(2000);//延时2
}
9、按键 测试
10、EEPROM 测试
11、整合全部模块
篇幅原因,上面三部分写在了记录二:ESP8266+Arduino实现控制【开关外设装置-记录二】_YuBooy的博客-CSDN博客_arduino esp8266 按键消抖