arduino IDE写8266 SmartConfig 保存WiFi和密码断电连接

#include <ESP8266WiFi.h>
#include <EspSaveCrash.h>//重启
//自动保存  如果wifi不再了就会重启如果连接不上就 重新配置了!还没加入隔多少次重新连接原来保存的!2017-6-9-10:52小和QQ496631085
#include <EEPROM.h>
#define EEPROM_SIZE 512//EEPROM 大小
//#define addr 0//wifi mode地址
#define Udp_Port 1//UDP server 端口号
//#define LED_BRIGHTNESS_ADDR 2//led亮度信息存储地址
#define id_addr 3        //devID 存储地址
#define ssid_addr 4//ssid长度地址
#define pwd_addr 5//password长度地址
#define USART_addr 6//usart setting flag addr
#define DATA_addr 11//数据开始地址
#define lianjie_addr 10//数据开始地址
WiFiClient client;
#define LED 5//LED彩灯脚
bool lianjiebz = 0; //0是配置STA模式  1是连接保存
char *ssidz;
char *pwdz;
int ipm=0;//ip每隔多少检测一次ip然后判断是否重启
int ipmt=0;
void smartConfig()
{
  
  WiFi.mode(WIFI_STA);
  Serial.println("\r\nWait for Smartconfig....ing");
  String pwd = read_pwd();
  String ssid = read_ssid();
  Serial.println(ssid);
  Serial.println(pwd);

  WiFi.beginSmartConfig();
  while (1)
  {
    Serial.print(".");
    digitalWrite(LED, 0);
    delay(500);
    digitalWrite(LED, 1);
    delay(500);//LED灯闪烁
    if (WiFi.smartConfigDone())
    {
      ssid = WiFi.SSID().c_str();
      pwd = WiFi.psk().c_str();
      Serial.println("SmartConfig Success");
      Serial.println(ssid);
      Serial.println(pwd);
      save_ssid_pwd(ssid, pwd); //保存密码
      save_udp_ser_port(3);
      save_lianjie(1);
      break;
    }
  }
}
void setup()
{
  Serial.begin(115200);
  Init_EEPROM();
  Serial.println("Start module");
  pinMode(LED, OUTPUT);
  digitalWrite(LED, 0);



  if (read_udp_ser_port() == 3 && read_lianjie() == 1) {
    String pwd = read_pwd();
    delay(55);
    String ssid = read_ssid();
    delay(55);
    Serial.println("duqudeWifi");
    Serial.println(ssid);
    Serial.println(pwd);
    const char *pwdz = pwd.c_str();
    const char *ssidz = ssid.c_str();


    Serial.print("lianjwifiing............");
    delay(55);
    Serial.println(ssidz);
    Serial.println(pwdz);
    WiFi.begin(ssidz, pwdz);//连接wifi
    int rest_s=0;
    while (WiFi.status() != WL_CONNECTED)
      //WiFi.status() 这个函数是wifi连接状态,返回wifi链接状态
    {
      Serial.print("_");
      delay(1000);
      rest_s++;
      if(rest_s>=5)
      {save_lianjie(0);ESP.reset();}
    } 
 }
 else   smartConfig();

    //获取IP地址——————————   
IPAddress myIP = WiFi.localIP();
 while( myIP[0]==0)
 { //IPAddress  
 myIP = WiFi.localIP();delay(500);}
 Serial.println(myIP);
 //获取IP地址——————————   
 
}

void loop()
{
  //每隔多少秒执行一次--------判定是否有ip----------
  if(millis()/1000!=ipmt)
  {ipmt=millis()/1000;
    ipm++;
    if(ipm>=10){ipm=0;PDIP();}
  }
  //每隔多少秒执行一次--------判定是否有ip----------

  
  delay(1000);
  Serial.print("+");
}


void PDIP(){
      //获取IP地址——————————   
IPAddress myIP = WiFi.localIP();
 while( myIP[0]==0)//如果ip为0000就开始重启
 { //IPAddress  
  
 myIP = WiFi.localIP();
 Serial.println(myIP);
 delay(500);
 ESP.reset();}
 Serial.println(myIP);
 //获取IP地址——————————   
 
  }


void Init_EEPROM()                                   //初始化EEPROM size
{
  EEPROM.begin(EEPROM_SIZE);//初始化EEPROM
}
int read_dev_id()                                //读取dev id信息
{
  return  EEPROM.read(id_addr);
}

bool read_lianjie()                                //读取dev id信息
{
  return  EEPROM.read(lianjie_addr);
}
int read_udp_ser_port()                         //读取UDP server 端口号
{
  return  EEPROM.read(Udp_Port);
}
/*
  int read_wifi_mode()                                 //读取wifu mode信息
  {
  return EEPROM.read(addr);
  }*/
String read_ssid()                                   //读取ssid数据
{
  int ssid_length = EEPROM.read(ssid_addr); //读取ssid数据长度
  String temp = "";
  for (int i = 0; i < ssid_length; i++)
  {
    temp += char(EEPROM.read(DATA_addr + i)); //读取数据
  }
  return temp;
}
String read_pwd()                                    //读取password数据
{
  int pwd_length = EEPROM.read(pwd_addr); //读取password数据长度
  int ssid_length = EEPROM.read(ssid_addr); //读取ssid数据长度
  int add = DATA_addr + ssid_length; //password数据起始地址
  String temp = "";
  for (int i = 0; i < pwd_length; i++)
  {
    temp += char(EEPROM.read(add + i)); //读取数据
  }
  return temp;
}
void write_string(int addr, String buf)              //从addr地址开始写入buf
{
  char _buf[buf.length() + 1];
  buf.toCharArray(_buf, buf.length() + 1); //转换成char数组
  for (int i = 0; i < buf.length(); i++) //写入数据
  {
    EEPROM.write(addr + i, _buf[i]);
  }
  EEPROM.commit();
}
void save_udp_ser_port(int port)        //保存UDP server port 数据
{
  EEPROM.write(Udp_Port, port);
  EEPROM.commit();
}
void save_ssid(String ssid)                          //保存ssid数据
{
  EEPROM.write(ssid_addr, ssid.length());//写入长度数据
  String temp = "";
  temp += ssid;
  temp += read_pwd();
  write_string(DATA_addr, temp); //保存数据
}
void save_pwd(String pwd)                            //保存password数据
{
  EEPROM.write(pwd_addr, pwd.length());//写入长度数据
  String temp = "";
  temp += read_ssid();
  temp += pwd;
  write_string(DATA_addr, temp); //保存数据
}
void save_ssid_pwd(String ssid, String pwd)          //保存ssid password 信息
{
  EEPROM.write(ssid_addr, ssid.length());//写入长度数据
  EEPROM.write(pwd_addr, pwd.length());//写入长度数据
  String temp = ssid + pwd;
  write_string(DATA_addr, temp); //保存数据
}

/*
  void save_wifi_mode(int wifi_mode)                   //保存wifi mode信息
  {
  EEPROM.write(addr,wifi_mode);
  EEPROM.commit();
  }*/
void save_dev_id(int id)                   //保存dev id信息
{
  EEPROM.write(id_addr, id);
  EEPROM.commit();
}


void save_lianjie(bool id)                   //保存dev id信息
{
  EEPROM.write(lianjie_addr, id);
  EEPROM.commit();
}
void save_init()
{
  //  save_wifi_mode(2);
  // save_ssid_pwd();
  // save_dev_id(1)
  //  save_udp_ser_port(55);
}

  

posted @ 2017-06-09 10:54  xiaohe520  阅读(273)  评论(0编辑  收藏  举报