天天看點

Arduino,ESP32-CAM/ESP8266 EEPROM操作

實作把wifi資訊存儲到ESP32-CAM的EERPOM,重新開機自動讀取存儲到EERPOM的wifi資訊,并自動連接配接wifi。

//eeprom讀寫
//儲存WIFI資訊,并且開機自動連接配接

#include <EEPROM.h>
#include <WiFi.h>
String ssid_s="xxxx";  //  輸入你的WIFI名稱
String password_s="xxxx";  //  輸入你的WIFI密碼
String ssid;
String password;
String e_flag="N";  //如果想要修改已儲存的WIFI資訊,改下這個字母就可以
char sd[30];
char pd[30];
void setup() 
{

  Serial.begin(115200);
  Serial.println("");

  save_or_read_wifi();//讀取或者儲存wifi資訊
  
  Serial.println("wifi資訊");
  Serial.print("ssid:");
  Serial.println(ssid);
  Serial.print("password:");
  Serial.println(password);

  
  strcpy(sd,ssid.c_str()); //需要轉換格式
  strcpy(pd,password.c_str());  //需要轉換格式
  
  WiFi.begin(sd, pd);
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
  Serial.println("");
  Serial.println("連接配接wifi成功");
  Serial.print("IP位址:");
  Serial.println(WiFi.localIP());
}
void loop() 
{
}


//讀取或儲存wifi等資訊;
void save_or_read_wifi(void){
  EEPROM.begin(1024);
  if(get_string(1,0) == e_flag){ //如果第0位字元為“M”,則表示已儲存WIFI資訊
      Serial.println("已儲存WIFI資訊");    
      //提取資訊
      ssid=get_string(EEPROM.read(10),15);
      password=get_string(EEPROM.read(50),55);
  }
  else{
    Serial.println("未儲存有WIFI資訊,将儲存wifi資訊");
    //儲存資訊
    set_string(10,15,ssid_s,1); //儲存wifi名稱
    set_string(50,55,password_s,1); //儲存wifi名稱

    set_string(1,0,e_flag,0); //錄入"M"字元
    Serial.println("完成儲存WIFI資訊");
    Serial.println("即将重新開機");
    ESP.restart(); 
  }

  EEPROM.end();
}

//用EEPROM的a位儲存字元串的長度,字元串的從EEPROM的b位開始儲存,str為要儲存的字元串,s為是否儲存字元串長度
void set_string(int a,int b,String str,int s)
{
  if(s)EEPROM.write(a,str.length()); //EEPROM第a位,寫入str字元串的長度
  //通過一個for循環,把str所有資料,逐個儲存在EEPROM
  for(int i = 0; i < str.length(); i++){
    EEPROM.write(b + i, str[i]);
  }
  EEPROM.commit();  //執行儲存EEPROM
  
}

//擷取指定EEPROM位置的字元串,a是字元串長度,b是起始位,從EEPROM的b位開始讀取
String get_string(int a,int b){
  String data="";
  //通過一個for循環,從EEPROM中逐個取出每一位的值,并連接配接起來
  for(int i=0; i<a; i++){
    data += char(EEPROM.read(b+i));
  }
  return data;
}
           

繼續閱讀