闪存

即使 ESP32 复位或断电计时器flash,保存在闪存中的数据仍然保留。闪存与 非常相似。两者都是非易失性存储器。

将数据保存在闪存中特别有助于:

闪存的一项限制是向其写入数据的次数。可以根据需要多次从闪存读取数据,但大多数设备设计用于大约 100,000 到 1,000,000 次写入操作。

要使用 IDE 读取和写入 ESP32 闪存,将使用 库。将此库与 ESP32 一起使用与与 一起使用非常相似。

通过 ESP32 和 库,您最多可以使用 512 字节的闪存。这意味着有 512 个不同的地址,并且可以在每个地址位置保存 0 到 255 之间的值。

写数据

要将数据写入闪存,可以使用.write()接受要保存数据的位置或地址以及要保存的值(字节变量)作为参数的函数:

EEPROM.write(address, value);

例如,要在地址 0 上写入 9:.write(0, 9);

其次是:mit() 用于保存更改。

读数据

要从闪存读取一个字节,可以使用.read()功能。该函数将要读取的字节的地址作为参数: .read();

例如,要读取先前存储在地址 0 中的字节,使用:.read(0);

这将返回9,这是我们存储在地址 0 中的值。

记住最后的 GPIO 状态

展示如何在 ESP32 闪存中保存数据,将保存输出的最后状态,在本例中为 LED。例如,想象以下场景:

正在使用 ESP32 控制灯您将灯设置为打开ESP32突然断电当电源重新打开时计时器flash,灯会保持关闭状态 - 因为它不会保持最后的状态

计时器在线_计时器flash_计时器秒表下载

为了解决这个问题,可以将灯的状态保存在闪存中。然后,只需在程序的开头添加一个条件来检查最后一个灯的状态,并相应地打开或关闭灯。

计时器秒表下载_计时器在线_计时器flash

示意图

将按钮和 LED 连接到 ESP32,如下图所示。

代码

将以下代码复制到 IDE 并将其上传到您的 ESP32。确保选择了正确的板和 COM 端口。

// 包括用于从闪存读写的库
#include 
// 定义要访问的字节数
#define EEPROM_SIZE 1
const int buttonPin = 4;    //  按键引脚
const int ledPin = 16;      // LED引脚
:
int ledState = HIGH;         // 输出引脚的当前状态
int buttonState;             // 从输入引脚读取状态
int lastButtonState = LOW;   // 以前输入引脚的状态
.
unsigned long lastDebounceTime = 0;  // 最后一次切换输出引脚的时间
unsigned long debounceDelay = 50;    // 抖动时间; 如果输出则增加
void setup() { 
  Serial.begin(115200);
  
  // 用预定义的大小初始化 EEPROM
  EEPROM.begin(EEPROM_SIZE);
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);
  // 从闪存中读取最后一次 LED 状态
  ledState = EEPROM.read(0);
  // 将 LED 设置为最后存储状态
  digitalWrite(ledPin, ledState);
}
void loop() {
  // 将开关的状态读入一个局部变量:
  int reading = digitalRead(buttonPin);
  //如果开关因按键等而改变
  if (reading != lastButtonState) {
    //重置去抖动计时器
    lastDebounceTime = millis();
  }
  if ((millis() - lastDebounceTime) > debounceDelay) {
 
    //如果按键状态改变
    if (reading != buttonState) {
      buttonState = reading;
      // 只有在新按钮状态为高时才切换 LED
      if (buttonState == HIGH) {
        ledState = !ledState;
      }
    }
  }
  // 保存读数。下次通过循环时,它将是 lastButtonState:
  lastButtonState = reading;
  
  // 如果 ledState 变量与当前 LED 状态不同
  if (digitalRead(ledPin)!= ledState) {  
    Serial.println("State changed");
    // 改变LED状态该
    digitalWrite(ledPin, ledState);
    // 保存LED状态
    EEPROM.write(0, ledState);
    EEPROM.commit();
    Serial.println("State saved in flash memory");
  }
}


限时特惠:
本站持续每日更新海量各大内部创业课程,一年会员仅需要98元,全站资源免费下载
点击查看详情

站长微信:Jiucxh

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注