簡介
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_1 和 char2_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;
}
望採納,謝謝!