1、Flash 作用
Flash 与 EEPROM 类似,即使 ESP32 复位或断电,Flash 中保存的数据也不会丢失。
Flash 可以用于:
- 记住变量的最后状态;
- 保存设置;
- 保存设备被激活的次数;
- 或您需要永久保存的任何其他类型的数据。
2、Flash 读写
Flash 中最多可以使用 512 字节,相当 512 个地址,可以在每个地址位置保存一个介于 0 到 255 之间的值。
Flash 可以任意读取其数据,但会限制写入数据的次数,大多数设备大约 100,000 到 1,000,000 次写入。
Flash 库函数:
引入 Flash 库:#include <EEPROM.h>
Flash 初始化函数:
初始化 Flash:EEPROM.begin(size);
- size:要访问的字节数
Flash 写入函数:
写入 Flash:EEPROM.write(address, value);
- address:要保存数据的地址
- value:要保存的值
保存更改:EEPROM.commit();
Flash 读取函数:
读取 Flash:EEPROM.read(address);
- address:将要读取字节的地址
3、Coed
案例:每次按下按键时都会更改 LED 状态,在 ESP32 复位或断电后,也能记住最后的 LED 状态(带有按键消抖)。
#include <Arduino.h>
#include <EEPROM.h>
#define EEPROM_SIZE 1 // 要访问的字节数
const int buttonPin = 4; // button pin
const int ledPin = 2; // LED pin
int ledState = HIGH; // led 当前引脚状态
int buttonState; // button 当前引脚状态
int lastButtonState = LOW; // button 上次状态
unsigned long lastDebounceTime = 0; // 最后一次切换输出引脚时间
unsigned long debounceDelay = 50; // 防抖时间
void setup()
{
Serial.begin(115200);
EEPROM.begin(EEPROM_SIZE);
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
ledState = EEPROM.read(0); // 读取上次引脚状态
digitalWrite(ledPin, ledState);
}
void loop()
{
int reading = digitalRead(buttonPin); // 读取开关状态
// 开关被按下,记录切换时间
if (reading != lastButtonState)
{
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) // 防抖
{
// 按键按下,更新 led 状态
if (reading != buttonState)
{
buttonState = reading;
if (buttonState == HIGH)
{
ledState = !ledState;
}
}
}
lastButtonState = reading;
// ledState 变量与当前 LED 状态不同
if (digitalRead(ledPin) != ledState)
{
Serial.println("State changed");
// change the LED state
digitalWrite(ledPin, ledState); // 改变 led 状态
EEPROM.write(0, ledState); // 写入 led 状态
EEPROM.commit(); // 更新
Serial.println("State saved in flash memory");
}
}