在ESP32使用EEPROM断电保存数据

在ESP32使用EEPROM断电保存数据

什么是EEPROM

EEPROM代表可擦除可编程只读存储器(Electrically Erasable Programmable Read-Only Memory,缩写为EEPROM),是一种电子存储器,可在不需要外部设备的情况下擦除和重写。 EEPROM是一个非易失性存储器(NVM),这意味着它可以保留存储的数据即使没有电源供应。 EEPROM广泛应用于各种电子设备中,如计算机、手机、数字相机等。

ESP32中EEPROM的特点

ESP32并不具有内置的EEPROM,ESP32是通过Flash内存来模拟EEPROM。而Flash内存和EEPROM非常类似,也是一种非易失性存储器,非常适合于存储需要长期保存的数据,支持100,000 到 1,000,000 次写入操作。

ESP32中的EEPROM具有以下特点:

  1. $1

  2. $1

  3. $1

  4. $1

ESP32 EEPROM的使用方法

  1. $1

  2. $1

  3. $1

  4. $1

  5. $1

代码示例

以下的代码展示怎样保存LED灯在关机前的状态,使用了NodeMCU开发版,其中默认BUILDIN_LED是第二引脚。

// 引入头文件
#include 

// 定于EEPROM容量
#define EEPROM_SIZE 1
// 定义引脚, 我们使用开发板的IO0按钮,默认被拉高
#define BUTTON_PIN 0
// 使用板载LED灯
#define BUILDIN_LED 2

// LED状态
int ledState = HIGH;
// 按钮状态
int buttonState;
// 之前的按钮状态
int lastButtonState = HIGH;

// 上次被触发的时间
unsigned long lastDebounceTime = 0; 
// 防抖动计时器
unsigned long debounceDelay = 50; 

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

  // 初始化EEPROM
  EEPROM.begin(EEPROM_SIZE);

 //使用GPIO0需要设置默认上拉
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  pinMode(BUILDIN_LED, OUTPUT);

  // 读取LED在EEPROM的状态
  ledState = EEPROM.read(0);
  // 写入关机前的状态
  digitalWrite(BUILDIN_LED, ledState);
}

void loop() {
  // 读取按钮状态
  int reading = digitalRead(BUTTON_PIN);

  // 检查按钮状态是否改变
  if (reading != lastButtonState) {
    // 重制防抖计时器
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
   // 需要按下时间大于防抖时间,才会进入改变状态

    // 如果按钮状态改变
    if (reading != buttonState) {
      buttonState = reading;

      //只有等新的状态是LOW,才改变LED状态
      if (buttonState == LOW) {
        ledState = !ledState;
      }
    }
  }
  // 保存已经读取的状态
  lastButtonState = reading;

  // 如果LED状态盒当前状态不一样
  if (digitalRead(BUILDIN_LED)!= ledState) {
    Serial.println("State changed");
    // 改变LED状态
    digitalWrite(BUILDIN_LED, ledState);
    // 保存LED状态到EEPROM
    EEPROM.write(0, ledState);
    EEPROM.commit();
    Serial.println("State saved in flash memory");
  }
}