ESP32 断电数据保存 EEPROM数据读取和写入

EEPROM (electrically erasable programmable read-only memory)是一种用户可修改的ROM,又或者称为闪存(Flash Memory)。它可以通过施加高于正常电压的电压,就可以反复擦除和重新编程(写入)的闪存 。

EEPROM 是一种非易失性ROM,可以擦除和重新编程单个字节的数据。这就是 EEPROM芯片被称为字节可擦除芯片的原因。EEPROM 通常用于在计算和其他电子设备中存储少量数据。

Arduino Uno 的EEEROM大小为1024个字节。

ESP32的EEPROM大小为 512 字节。
这意味着使用 ESP32 和 EEPROM 库可以有 512 个不同的地址,可以在每个地址位置保存一个 0 到 255 之间的值。

简单来说EEPROM里面的数据是可以断电保存的,重新上电数据并不会丢失。但是,闪存的一个限制是可刷写数据的次数。你可以根据需要多次从闪存中读取数据,但大多数设备闪存的写入次数设计为大约 100,000 到 1,000,000 次写入操作。

在 ESP32 的闪存读取和写入将使用 EEPROM 库。其实是和 Arduino EEPROM 一样的,并没有太大区别。

本示例,主要记录ESP32/Arduino如何使用EEPROM,并且读取和写入数据。

程序提点

首先需要加载EEPROM的库

// 加载EEPROM的库
#include <EEPROM.h>

在setup中初始化EEPROM的大小

// 定义EEPROM的大小
#define EEPROM_SIZE 1  // 这里定义1个字节的大小

void setup() { 
  ...
  // 初始化EEPROM为预习定义的大小
  EEPROM.begin(EEPROM_SIZE);
  ...
}

读取EEPROM指定位置的数据

例如,读取第0位的数据:

read_value = EEPROM.read(0); // 读区 EEPROM 第0位的数据

EEPROM刷写指定位置的数据

例如,第0位的数据刷写为read_value的值,最后,不要忘记EEPROM.commit();提交,运行这句代码才能正真刷写数据。

EEPROM.write(0, read_value); // 把 变量read_value的数值写入第0位
EEPROM.commit(); // 需要提交才能正真地把数据写入EEPROM

完整代码

该程序
实现每一秒都会把变量read_value + 1 ,并写入EEPROM中。
当中途断电,重新通电也能继续断电前的数据,而不是从0开始。

// welcome to lingshunlab.com
// 加载EEPROM的库
#include <EEPROM.h>

// 定义EEPROM的大小
#define EEPROM_SIZE 1  // 这里定义1个字节的大小

int read_value = 0;

void setup() { 
  Serial.begin(115200);

  // 初始化EEPROM为预习定义的大小
  EEPROM.begin(EEPROM_SIZE);
}

void loop() {
  read_value = EEPROM.read(0); // 读区 EEPROM 第0位的数据
  Serial.println(read_value);  

  read_value++;   // read_value+1 ,但EEPROM只接受0~255的数值,超出的将会是255的取余值
  EEPROM.write(0, read_value); // 把 变量read_value的数值写入第0位
  EEPROM.commit(); // 需要提交才能正真地把数据写入EEPROM

  delay(1000);
}