EEPROM用于储存一些数据,可以使其掉电不丢失。一般用来保存一些设置信息,例如WiFi的用户名和用户密码。
需要注意的是:
使用时:
#include //加载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 类型占两个字节,那么如何使用EEPROM存放两个字节的东西呢。当然是分开,使用两个EEPROM空间存放。
在这里请允许我粗略的介绍一下接下来要使用的union结构,中文是“联合体、共用体”。其形式为:
union 共用体名{
数据类型 成员名;
数据类型 成员名;
…
}
称之为联合体、共用体是有原因的,请见如下截图:
我们需要了解的是:图中l 和 i 的值是相同的。其原因是所有的共用体成员共用一个空间,所以各个变量名的值都是相同的。所以若是使用如下代码,是否可以将一个int类型,分为两个byte值呢?
#include
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类型的保存和读取。
我想偷个懒, float类型和long类型一样占用4个字节,所以我们将上面的union结构函数更改一下,就可以存放啦。这里就不再展示了~~
首先,我们都清楚所谓的字符串就是用一个一个的字符拼接而来(非中文),都可以转化为相应的ASCII码。所以我们是否可以通过循环的方式来存储字符串呢,以下是我使用的方法。
#include
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;
}
望采纳,谢谢!