(基于Ardunio)ESP8266之使用EEPROM

文章目录

  • 简介
  • 保存一个byte类型
  • 保存一个int类型
  • 保存一个long/float类型
  • 保存一个string类型

简介

EEPROM用于储存一些数据,可以使其掉电不丢失。一般用来保存一些设置信息,例如WiFi的用户名和用户密码。
需要注意的是:

  • 一个EEPROM空间占一个字节,只能存储0-255,就是一个byte值的范围。
  • EEPROM可操作的地址为0~4095。

使用时:

  • 调用#include 来使用EEPROM
  • 首先调用EEPROM.begin(size),开辟大小为size的空间,取值4~4096
  • 使用EEPROM.write(addr,data)来写数据,参数分别为地址、数据,
  • 写数据后需要通过EEPROM.commit()将数据保存到EEPROM(区别于ardunio uno)
  • 使用EEPROM.read(addr)来读数据

保存一个byte类型

#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中有串口监视器,在工具->串口监视器)
(基于Ardunio)ESP8266之使用EEPROM_第1张图片
需要注意的是:
其实char字符,和byte一样,同样可以使用一位EEPROM保存,它使用ASCII码,每个字符对应一个数字,a 对应 97,读取时使用char转换类型。详细见以上char2_1char2_2的区别。

保存一个int类型

众所周知,在单片机Int 类型占两个字节,那么如何使用EEPROM存放两个字节的东西呢。当然是分开,使用两个EEPROM空间存放。
在这里请允许我粗略的介绍一下接下来要使用的union结构,中文是“联合体、共用体”。其形式为:
union 共用体名{
数据类型 成员名;
数据类型 成员名;

}
称之为联合体、共用体是有原因的,请见如下截图:
(基于Ardunio)ESP8266之使用EEPROM_第2张图片
我们需要了解的是:图中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类型的保存和读取。

保存一个long/float类型

我想偷个懒, float类型和long类型一样占用4个字节,所以我们将上面的union结构函数更改一下,就可以存放啦。这里就不再展示了~~

保存一个string类型

首先,我们都清楚所谓的字符串就是用一个一个的字符拼接而来(非中文),都可以转化为相应的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;
}

望采纳,谢谢!

你可能感兴趣的:(ardunio,esp8266)