具体实现功能:网页+APP 实现控制舵机等IO操作。

1、使用 AP 模式提供WiFi接入,终端设备通过 Web 网页实现舵机控制;

2、使用串口连接蓝牙模组,提供蓝牙接入,终端设备通过手机APP实现舵机控制;

3、按键实现舵机角度录入;

4、LED 实现状态显示和告警;

5、ADC 实现系统电压检测。

目录

1、文档

2、WiFi AP 测试

3、web Server 测试

4、web 控制 IO 测试

5、强制门户 测试

6、蓝牙数据传输 测试

7、ADC外部电路电压 测试

8、舵机控制 测试

9、按键 测试

10、EEPROM 测试

11、整合全部模块


本篇作为开发记录

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 连接

功能函数(参数):

设置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();
}

测试结果:

esp8266使用arduion输出小数频率 esp8266+arduino_arduino


4、web 控制 IO 测试

功能:控制 LED 、按键、舵机等IO

引脚图:(网上都是这图,但不知道具体型号,所以坑慢慢踩吧)

esp8266使用arduion输出小数频率 esp8266+arduino_arduino_02

功能函数(参数):

设置 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 的页面)

实现原理:

当手机连接上一个 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、蓝牙数据传输 测试

蓝牙模块设置:

功能函数(参数):

#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;
    }
  }
}

测试结果:

esp8266使用arduion输出小数频率 esp8266+arduino_嵌入式_03


7、ADC外部电路电压 测试

功能:整个项目中用来检测电量:当电量低时 LED 灯亮(报警)

板子上有一个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、舵机控制 测试

功能:控制舵机完成  打开和关闭  开关面板  的机械动作

舵机文档:(注意工作电压,注意共地!)

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、整合全部模块