(基於Ardunio)ESP8266之使用EEPROM

簡介

EEPROM用於儲存一些數據,可以使其掉電不丟失。一般用來保存一些設置信息,例如WiFi的用戶名和用戶密碼。
需要注意的是:

  • 一個EEPROM空間佔一個字節,只能存儲0-255,就是一個byte值的範圍。
  • EEPROM可操作的地址爲0~4095。

使用時:

  • 調用#include <EEPROM.h>來使用EEPROM
  • 首先調用EEPROM.begin(size),開闢大小爲size的空間,取值4~4096
  • 使用EEPROM.write(addr,data)來寫數據,參數分別爲地址、數據,
  • 寫數據後需要通過EEPROM.commit()將數據保存到EEPROM(區別於ardunio uno)
  • 使用EEPROM.read(addr)來讀數據

保存一個byte類型

#include <EEPROM.h>         //加載EEPROM的庫

byte byte1=220;            //byte類型數值
char char1= 'a';           //char字符 

void setup() {
  Serial.begin(115200); 
  Serial.println("");   
  EEPROM.begin(1024);                  //開啓EEPROM,開闢1024個位空間  

  //讀取與保存byte類型
  EEPROM.write(0,byte1);              //給EEPROM 第0位,寫入byte_1的值
  EEPROM.commit();
  byte byte2=EEPROM.read(0);
  Serial.print("byte2的值:"); 
  Serial.println(byte2+1);
  
  //讀取與保存char類型
  EEPROM.write(1,char1);              //給EEPROM 第1位,寫入char1的值
  EEPROM.commit();
  int char2_1=EEPROM.read(1);
  char char2_2=EEPROM.read(1);
   Serial.print("char2_1的值:"); 
  Serial.println(char2_1);
  Serial.print("char2_2的值:"); 
  Serial.println(char2_2);
  
}

void loop() {

}

打開串口監視器,按下復位鍵如下:(另ardunio IDE中有串口監視器,在工具->串口監視器)
在這裏插入圖片描述
需要注意的是:
其實char字符,和byte一樣,同樣可以使用一位EEPROM保存,它使用ASCII碼,每個字符對應一個數字,a 對應 97,讀取時使用char轉換類型。詳細見以上char2_1char2_2的區別。

保存一個int類型

衆所周知,在單片機Int 類型佔兩個字節,那麼如何使用EEPROM存放兩個字節的東西呢。當然是分開,使用兩個EEPROM空間存放。
在這裏請允許我粗略的介紹一下接下來要使用的union結構,中文是“聯合體、共用體”。其形式爲:
union 共用體名{
數據類型 成員名;
數據類型 成員名;

}
稱之爲聯合體、共用體是有原因的,請見如下截圖:
在這裏插入圖片描述
我們需要了解的是:圖中l 和 i 的值是相同的。其原因是所有的共用體成員共用一個空間,所以各個變量名的值都是相同的。所以若是使用如下代碼,是否可以將一個int類型,分爲兩個byte值呢?
在這裏插入圖片描述

#include <EEPROM.h> 
int a=1234;
union int_value{
  int i;                //int類型成員變量
  byte b[2];            //byte類型數組成員
};
int_value e_int;        //定義一個結構對象

void setup() {
  Serial.begin(115200); 
  Serial.println("");   
  EEPROM.begin(1024);

  e_int.i=a;                       //給e_int.i重新賦值爲a
  EEPROM.write(0,e_int.b[0]);     //給EEPROM 第0位寫入e_int.b[0]的值
  EEPROM.write(1,e_int.b[1]);     //給EEPROM 第1位寫入e_int.b[1]的值
  EEPROM.commit();
  byte a1=EEPROM.read(0);         //a1獲取EEPROM 0 位的值
  byte a2=EEPROM.read(1);         //a2獲取EEPROM 1 位的值
  e_int.b[0]=a1;
  e_int.b[1]=a2;
  Serial.print("e_int.i的值:"); 
  Serial.println(e_int.i);        //這裏打印輸出的e_int.i,其實就是間接的a

}

void loop() {

}

通過如上方法,將一個字節保存不了的int類型拆爲2個字節保存,最後可以再組裝回來,實現對int類型的保存和讀取。

保存一個long/float類型

我想偷個懶, float類型和long類型一樣佔用4個字節,所以我們將上面的union結構函數更改一下,就可以存放啦。這裏就不再展示了~~

保存一個string類型

首先,我們都清楚所謂的字符串就是用一個一個的字符拼接而來(非中文),都可以轉化爲相應的ASCII碼。所以我們是否可以通過循環的方式來存儲字符串呢,以下是我使用的方法。

#include <EEPROM.h> 
String str="hello";

void setup() {
  Serial.begin(115200); 
  Serial.println("");
  EEPROM.begin(1024);
  
  set_String(0,1,str);
  String s=get_String(EEPROM.read(0),1);

  Serial.print("s的值:");
  Serial.println(s);
}

void loop() {

}

//a寫入字符串長度,b是起始位,str爲要保存的字符串
void set_String(int a,int b,String str){
  EEPROM.write(a, str.length());//EEPROM第a位,寫入str字符串的長度
  //把str所有數據逐個保存在EEPROM
  for (int i = 0; i < str.length(); i++){
    EEPROM.write(b + i, str[i]);
  }
  EEPROM.commit();
}

//a位是字符串長度,b是起始位
String get_String(int a, int b){ 
  String data = "";
  //從EEPROM中逐個取出每一位的值,並鏈接
  for (int i = 0; i < a; i++){
    data += char(EEPROM.read(b + i));
  }
  return data;
}

望採納,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章