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