使用ESP32
在Arduino中Blinker有自己的EspTouch V2配网示例,但我在网上看到说BlinkerEspTouch V2配网的过程是
->首次运行
->进入EspTouch V2,配网成功
->再次上电运行,自动配网
->如配网失败,一段时间后自动进入EspTouch V2
(这个过程不知道准不准确,都是网上看的,以前也没有了解过,如有错误还请大佬指正。)
这就会造成一个问题,如果刚开始没连上网就会一直处于智能配网。此方法是通过按钮进入智能配网和清除配网信息,如智能配网失败(3分钟后),会自动结束配网,然后自动连接之前保存的WiFi。可按需调节,操作性强。
操作逻辑:
->上电,自动连接之前保存的WiFi。
->换网,引脚32加按钮,短按(小于3s)进入智能配网,长按清除配网信息
配网过程很简单:
->通过按钮进入智能配网
->手机连接WiFi,打开EspTouch
->选择EspTouch V2
->输入密码,密钥(代码中的密钥是1234567890123456)(自定义数据随便填)
->点击确定,开始智能配网
----------------------------------------------我是分割线-----------------------------------------
上面都是废话,请看食用步骤
-->提前安装Blinker库
-->Arduino新建项目,将下面代码复制到编辑区(第7行设备密钥换成自己的)
-->连接开发板上传程序
-->单击ESP32 32号引脚进入配网
-->打开EspTouch选择EspTouch V2填好密码和密钥,确认
-->等待配网完成
-->长按32号引脚清除配网信息(一般用不到)
不做过多介绍啦,放代码吧,代码注释很详细!
程序我已经跑了很多遍了,肯定编译的过,实际配网测试中也基本莫有问题,后续如有发现bug会改正滴!(现在如果使用Arduino提供的Blinker库,编译会报错)
写的有点乱,有什么问题可以评论或私聊
#define BLINKER_WIFI //WiFi
#define BLINKER_ESP_TASK //ESP多任务,使用多任务之后不再需要Blinker.run()
#include <Blinker.h> //Blinker库
#define smaco 32 //单击此键进入配网,长按此键清除配网信息
char auth[]="这里填设备密钥"; //Blinker设备密钥
volatile uint8_t mo=0; //模式切换
void smacofuncone(){ //配网1
WiFi.begin(); //连接WiFi,智能配网后会自动储存WiFi信息,所以不需要加参数
delay(1000);
Serial.println("");
Serial.print("连接到 -> -> -> ");
Serial.print(WiFi.SSID().c_str()); //WiFi.SSID().c_str()就是WiFi名称
Serial.print(" 密钥:");
Serial.println(WiFi.psk().c_str()); //WiFi.psk().c_str() 就是WiFi密码
Serial.println("");
for(uint8_t numl=40;numl>0;numl--){ //阻塞20s,循环检测WiFi连接状态
delay(500);
Serial.print(".");
if(WiFi.status() == WL_CONNECTED){ //如果WiFi连接成功
Blinker.begin(auth,WiFi.SSID().c_str(),WiFi.psk().c_str()); //连接到Blinker,
//Blinker.begin(),本身就可以进行WiFi连接,但直接使用这一句,连接不上
//因为WiFi.SSID().c_str(),没连上WiFi时这个ssid是打印不出来的
//所以先用WiFi.begin()连上网,再用Blinker.begin()重新连一下
//大佬们还有没有更好的方法
Serial.println("WiFi正确性验证成功");
Serial.println("连接到Blinker -> -> -> ");
delay(1000);
for(uint8_t numl=40;numl>0;numl--){ //阻塞20,再次检测连接状态
delay(500);
if(WiFi.status() == WL_CONNECTED){ //如果WiFi连接成功
Serial.println("");
Serial.println("无线网络已连接");
Serial.print("IP 地址: ");
Serial.println(WiFi.localIP()); //打印IP
Serial.println("");
break;
}
}
break;
}
if(numl==1){
Serial.println("连接网络超时,已跳过连接");
}
}
}
void smacofunctwo(){ //配网2
Serial.println("进入网络配置");
Serial.println("");
delay(20); //20ms去抖
if(digitalRead(smaco)!=LOW){ //smaco不为低,代表只是抖动,不进入配网
return;
}
uint8_t numl=0;
while(digitalRead(smaco)==LOW && numl!=60){ //3s,按键3s内松开进入智能配网,3s后松开清除配网信息
numl++;
delay(50);
}
if(numl>=60){ //3s
WiFi.disconnect(true,true); //清除配网信息
Serial.println("清除配网信息成功!");
Serial.println("");
}
else{ //智能配网
Serial.println("进入广播配网");
Serial.println("");
WiFi.mode(WIFI_STA); //设为STA模式
WiFi.beginSmartConfig(SC_TYPE_ESPTOUCH_V2, "1234567890123456"); //开始智能配网,采用EspTouch V2,第二个参数为AES密钥
uint8_t numl=180;
while (!WiFi.smartConfigDone()&&numl--) { //如果SmartConfig配置状态为未配置,或等待自动跳出循环
//这里循环判断一下配网是否成功,留有3分钟的时间,可按需缩短
//实际上执行WiFi.beginSmartConfig()后会一直执行配网直到配网成功,具体会不会有时长暂不可知
delay(500);
Serial.print(".");
if(WiFi.smartConfigDone()){ //如果SmartConfig配置状态为已配置
delay(500);
Serial.println("");
Serial.println("SmartConfig Success");
Serial.println("");
Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str()); //打印ssid
Serial.printf("PSW :%s\r\n", WiFi.psk().c_str()); //打印密码
Serial.println("");
WiFi.setAutoConnect(true); // 设置自动连接
WiFi.persistent(true); //将WiFi模式、SSID、密码、自动重连等信息存储于flash中,默认为true
Serial.println("获取SSID成功,正在重启!");
Serial.println("");
delay(500);
ESP.restart(); //重启,也可按需不进行重启,直接连接Blinker
}
}
Serial.println("");
Serial.println("获取SSID失败,请重新配置!");
Serial.println("正在重连!");
WiFi.mode(WIFI_OFF); //如果3分钟还没智能配网成功,便重启WiFi,结束智能配网。没有找到结束智能配网的函数(手动狗头)
WiFi.mode(WIFI_STA); //设为STA模式
Blinker.begin(auth,WiFi.SSID().c_str(),WiFi.psk().c_str()); //连接到Blinker
}
}
void smacointe(){ //配网中断
detachInterrupt(smaco); //关闭中断,防止重复触发中断
mo=4; //主循环同过switch(mo)控制程序走向
}
void ioandinter(){
//引脚配置
pinMode(smaco , INPUT_PULLUP); //上拉输入
//中断配置
attachInterrupt(smaco ,smacointe , FALLING); //开启,下降沿触发中断
}
void setup() {
Serial.begin(115200);
smacofuncone();
BLINKER_TAST_INIT(); //ESP多任务
ioandinter(); //io和中断
}
void loop() {
if(WiFi.status() == WL_CONNECTED){ //循环打印IP,测试用的
Serial.println("");
Serial.println("无线网络已连接");
Serial.print("IP 地址: ");
Serial.println(WiFi.localIP());
Serial.println("");
delay(3000);
}
switch(mo){
case 4: //配网
{
smacofunctwo(); //调用配网2函数
mo=0; //配网结束后回归正常模式
attachInterrupt(smaco ,smacointe , FALLING); //开启中断,等待下一次配网2
}
break;
}
}