esp8266/esp32SmartCofig一键配网,并保存到内部EEPROM中。

在看到众多文章中,可以看到SmartCofig程序,很多都是完成一键配网后,下次开机,还需要手机进行配网,在实际应用中程序设计是不合理的。
程序设计主要是为了,当设备在一个新的环境下时,我们能更方便的连接网络。
本程序具体思路:
首先读取esp8266内部eeprom中保存的wifi信息,如果连接成功,则不进行SmartCofig,如歌连接不成功则需要使用手机进行SmartCofig,通过SmartConfig完成esp8266配网,获取到wifi名称、密码后在保存到eeprom中,完成新环境的wifi配置。

程序流程图

/*
  通过一键配网后把连接到的wifi名称 密码保存到EEPROM中 esp32
*/

//#include <WiFi.h>
#include <ESP8266WiFi.h>
#include <EEPROM.h>
String smart_data = "";
int size_data = 0; //WIFI数据长度
String wifiname;
String wifipsw;
bool flag; //读取EEPROM联网,是否成功标志位
int wifiname_len; // wifi名的长度

void Config_wifi(const char *wifiname, const char *psw) //函数用于直接读取eeprom中的数据,直接完成后直接联网
{
  int i = 0;
  WiFi.begin(wifiname, psw);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    if (i == 0)
    {
      Serial.print("正在配置网络");
    }
    Serial.print(".");
    i++;
    if (i == 15)
    {
      Serial.println("连接失败请使用APP一键配网");
      flag = true;
      break; 
    }
  }
  if (WiFi.isConnected())
  {

    Serial.println("网络连接成功");
    Serial.print("Local IP:");
    Serial.println(WiFi.localIP());
  }
}
void read_eeprom()
{
  wifiname = "";
  wifipsw = "";
  // EEPROM.begin(20); //申请操作到地址4095(比如你只需要读写地址为100上的一个字节,该处也需输入参数101)
  int a = int(EEPROM.read(0)) - int('0'); //wifi名的长度
  int b = (int(EEPROM.read(1)) - int('0')) * 10 + (int(EEPROM.read(2)) - int('0')) ; //读数据;
  // EEPROM.begin(b); //申请操作到地址4095(比如你只需要读写地址为100上的一个字节,该处也需输入参数101)
  Serial.println(a);
  Serial.println(b);
  for (int addr = 3; addr < b + 1; addr++)
  {
    int data = EEPROM.read(addr); //读数据
    // Serial.print(char(data));
    if (addr < a + 3)
    {
      wifiname = wifiname + char(data);
    }
    else
    {
      wifipsw = wifipsw + char(data);
    }
    delay(2);
  }
  Serial.print("SSID:");
  Serial.println(wifiname);
  Serial.print("PASSWORD:");
  Serial.println(wifipsw);

}
void smartConfig()
{
  WiFi.mode(WIFI_STA);
  Serial.println("\r\nWait for Smartconfig");
  delay(2000);
  // 等待配网
  WiFi.beginSmartConfig();

  while (1)
  {
    Serial.print(".");
    delay(500);
    if (WiFi.smartConfigDone())
    {
      Serial.println("SmartConfig Success");
      Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());
      Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());
      WiFi.setAutoConnect(true);  // 设置自动连接


      wifiname_len = String(WiFi.SSID().c_str()).length(); //获取wifi名的长度
      //  EEPROM.write(0, char(wifiname_len)); //写在地址0的数据为存入的wifi名的长度


      // EEPROM.write(1, char(size_data)); //写在地址1的数据为存入的数据长度

      smart_data = String(wifiname_len) + String(size_data) + String (WiFi.SSID().c_str()) + String(WiFi.psk().c_str());
      size_data = String(smart_data).length();
      smart_data = String(wifiname_len) + String(size_data) + String (WiFi.SSID().c_str()) + String(WiFi.psk().c_str());

      Serial.println(size_data);
      Serial.println(smart_data); //打印出保存在eeprom数据

      Serial.println(String(smart_data).length());//打印出保存在eeprom中的数据长度

      for (int addr = 0; addr < size_data + 1; addr++)
      {
        //int data = addr%256; //在该代码中等同于int data = addr;因为下面write方法是以字节为存储单位的.
        //String(smart_data).charAt(addr);
        EEPROM.write(addr, toascii(String(smart_data).charAt(addr))); //写数据
      }
      EEPROM.commit(); //保存更改的数据
      // EEPROM.end(); //同EEPROM.commit();

      Serial.println("End write");
      break;
    }
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void setup()
{
  Serial.begin(115200);
  EEPROM.begin(50); //申请操作到地址4095(比如你只需要读写地址为100上的一个字节,该处也需输入参数101)
  flag = false;
  read_eeprom();
  Config_wifi(wifiname.c_str(), wifipsw.c_str());
  if (flag)
  {
    smartConfig();
  }



}

void loop()
{
}

烧录完成后串口打印的数据
烧录完成后串口打印的数据

出现wait for samrtcofig后,使用手机一键配网
在这里插入图片描述
完成配网后,下次开机,会直接从esp8266内部EEPROM中读取wifi信息,进行联网。

发布了3 篇原创文章 · 获赞 2 · 访问量 377
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览