EEPROM (Electrically Erasable Programmable Read-Only Memory),电可擦可编程只读存储器–一种掉电后数据不丢失的存储芯片。
arduino已经为我们准备好了EEPROM类库”EEPROM.h”。
我们要使用得先调用EEPROM.h,然后使用write和read方法,即可操作EEPROM。
一、写入方法:EEPROM.write(address, value)
#include <EEPROM.h>
int addr = 0;
void setup()
{
}
void loop()
{
//每次写入1个字节,注意不要溢出。
//比如要保存模拟值,模拟值读出后是一个0-1024的值,但每字节的大小为0-255,容纳不了,所以这里可以变通一下,将值除以4再存储到val,就能够容纳了。使用的时候读出来再乘以4还原回来。
int val = analogRead(0) / 4;
EEPROM.write(addr, val);
addr = addr + 1;
if (addr == 512) // 当读写位置到了最大容量时,注意不要溢出。
addr = 0;
delay(100);
}
二、读取方法:EEPROM.read(address)
#include <EEPROM.h>
int address = 0;
byte value;
void setup()
{
Serial.begin(9600);
}
void loop()
{
// 读入一个字节
value = EEPROM.read(address);
Serial.print(address);
Serial.print("\t");
Serial.print(value, DEC);
Serial.println();
// 到下一个地址
address = address + 1;
// 注意地址不要溢出
if (address == 512)
address = 0;
delay(500);
}
三、清除数据:每个地址都写入0
#include <EEPROM.h>
void setup()
{
// 让EEPROM的512字节内容全部清零
for (int i = 0; i < 512; i++)
EEPROM.write(i, 0);
}
void loop()
{
}
四、使用共用体,快捷的存储各类型数据到EEPROM
首先了解一下什么是【共用体】:将几个不同(类型不同,但长度相同)的变量放到同一段内存中,共同占用这一段内存数据,使各变量的内存数据始终保持一致。
你可能发现了,使用Arduino提供的EEPROM API,只能将【字节型】的数据的存入EEPROM,也就是一次只能写入1个字节。如果要存储多个字节的数据类型,又需要怎么做呢?
例如:一个float类型的数据,需要占用4个字节的存储空间。因此我们可以把一个float拆分为4个字节,然后逐字节的写入EEPROM,来达到保存float数据的目的。但是手动计算的话,比较麻烦。
这里我们使用共用体,通过其它数据结果,快捷的把float数据拆分为4个字节。
首先定义一个名为data的共用体结构,共用体中有两个类型不同的成员变量:
union data
{
float a; // 浮点型,占用4个字节
byte b[4]; // 字节型数组,占用4个字节。
// 这两个类型的变量都是占用4个字节,且是相同的4个字节,所以能始终保持数据一致,其中一个变了,另一个也随之改变。
};
再申明一个data类型的变量col:
data col;
现在你可以通过 col.a 访问这个共用体中的 float 类型成员 a,也可以通过 col.b 访问这个共用体中的 byte 类型成员 b。
col.a 和 col.b 共同占用四个字节的地址。
给 col.a 赋值后,通过 col.b 即可拆分 float 为4个字节。
(1)通过共用体写入:
#include <EEPROM.h>
union data
{
float a;
byte b[4];
};
data col;
int addr = 0;
void setup()
{
col.a=987.65; // 通过 a 赋值
for(int i=0;i<4;i++)
EEPROM.write(i, col.b[i]); // 通过 b 拆分为4个字节
}
void loop()
{
}
(2)通过共用体读取:
#include <EEPROM.h>
union data
{
float a;
byte b[4];
};
data col;
int addr = 0;
void setup()
{
Serial.begin(9600);
for(int i=0;i<4;i++)
col.b[i]=EEPROM.read(i);
Serial.println(col.a);
}
void loop()
{
}