永久存储数据(读和写)

零知ESP32有一个大小为512字节的闪存,可以在每个字节存储0到255之间的数据。 利用这个闪存我们可以存储数据记录GPIO的状态,即使ESP32复位或断电,闪存中保存的数据仍保留在其中。

一、工具原料

1、零知ESP32
2、按钮开关
3、220Ω电阻
4、LED

二、连线

三、代码


												

	#include <EEPROM.h>
	 
	#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(9600);
	  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;
	 
	      if (buttonState == HIGH) {
	        ledState = !ledState;
	      }
	    }
	  }
	  lastButtonState = reading;
	   
	  // 如果led state变量与当前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");
	  }
	}
					

导入程序代码,在右侧选择ESP32开发板,然后验证程序,如图:

然后上传程序到开发板,可以看到如下图的效果: