EspTouch V2配网,Blinker EspTouch V2配网

  使用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;

  }

}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值