- C++
ESP32 for Arduino EEPROM 学习笔记教程
- 2025-7-29 19:52:00 @
ESP32 for Arduino EEPROM 学习笔记教程
一、学习目标
- 清晰掌握 EEPROM 概念,学会运用相关函数进行 ESP32 数据的掉电存储与读写操作。
- 完成密码修改实操任务,借助 EEPROM 实现密码的存储、读取和更新 。
二、EEPROM 概念解析
(一)基本定义
EEPROM(Electrically Erasable Programmable Read-Only Memory ),是一种掉电后数据不会丢失的存储芯片 。可以把它理解成一个“迷你硬盘”,不过和真正硬盘比,它的容量很小,通常以 KB 为单位。最初 EEPROM 是独立的集成电路,现在很多时候已经集成到芯片内部啦,它通过串行通信和微控制器(像咱们用的 ESP32 )配合,实现数据的读和写操作 ,这样即便 ESP32 断电重启,存在 EEPROM 里的数据也能保留哟。
(二)ESP32 与 Arduino Uno 中 EEPROM 差异
- ESP32 的 EEPROM:它是在自身 Flash 空间里额外划分出一块存储区域来当 EEPROM 用的。这就很灵活啦,咱们可以在程序初始化的时候,自己指定 EEPROM 想设置的大小 。
- Arduino Uno 的 EEPROM:存储大小是固定死的。比如常用的 ATmega328 芯片,它的 EEPROM 容量就是 1KB ,没办法自己去调整大小 。
三、EEPROM 功能函数(ESP32 for Arduino 环境 )
在 ESP32 for Arduino 开发里,要使用 EEPROM 功能,得先包含头文件 #include<EEPROM.h>
,然后这些常用函数帮我们操作 EEPROM :
(一)EEPROM.begin(size)
- 功能:用来设定我们要用的 EEPROM 空间大小 。ESP32 里 EEPROM 默认的对象大小是 4096 字节,但咱们可以根据实际需求,用这个函数设置合适的大小,比如存密码可能用不了那么大,就可以设小点儿 。
- 返回值:返回布尔类型的值哦。要是返回
true
,就说明设定 EEPROM 大小这事儿成功啦;返回false
就是设定失败,可能是设置的大小超出了一些限制之类的原因 。 - 参数
size
:就是咱们想设定的 EEPROM 大小数值,单位是字节哟。
(二)EEPROM.write(addr, data)
- 功能:往 EEPROM 里面写数据 。不管是存密码、配置信息啥的,都靠它把数据写到指定位置。
- 参数说明:
addr
:表示要写入数据的地址 。可以把 EEPROM 想象成一个一排格子的存储区,每个格子有自己的编号,addr
就是这个编号,告诉程序把数据放到哪个“格子”里。data
:就是咱们实际要写入 EEPROM 的数据啦 。
(三)EEPROM.commit()
- 功能:提交数据,这一步很关键!咱们用
EEPROM.write(addr, data)
把数据写到 EEPROM 对应的“临时区域”后,得调用EEPROM.commit()
函数,才能真正把数据确定保存到 EEPROM 实实在在的存储区域里 。不然数据可能没存进去,掉电就丢啦。 - 返回值:也是布尔类型。
true
表示提交成功,数据好好保存到 EEPROM 了;false
就是提交失败,数据没存好 。
(四)EEPROM.read(addr)
- 功能:从 EEPROM 里读取一个字节的数据 。想获取之前存在 EEPROM 里的内容,就用它。
- 返回值:返回读取到的那个字节的数据 。
- 参数
addr
:要读取的数据所在的地址,也就是之前写数据时用的那个“格子编号” ,这样才能准确拿到对应位置的数据。
四、EEPROM 读写测试程序(示例:密码存储读取 )
下面这个程序示例,咱们用 EEPROM 来存储和读取一个简单的密码字符串,看看具体怎么用上面这些函数哈,代码里都加了详细注释:
// 包含 EEPROM 操作的头文件,这样才能使用相关函数
#include<EEPROM.h>
// 定义要存储的密码字符串,这里假设密码是 "12345678",还定义一个空字符串 passward 用来存读取到的密码
String psw = "12345678", passward = "";
void setup() {
// 初始化串口通信,设置波特率 9600,这样后面可以在串口监视器看输出信息
Serial.begin(9600);
/*
* 设置 EEPROM 的空间大小为 16 字节。因为我们的密码是 8 个字符,一个字符占 1 字节,
* 这里设 16 字节足够啦,也可以根据实际情况调整,只要不超过 ESP32 允许的范围
*/
if (EEPROM.begin(16) == true) {
// 如果设置 EEPROM 大小成功,就在串口输出 "succesful" 提示一下
Serial.println("succesful");
}
/*
* 循环往 EEPROM 地址 0 到 7 里面存入密码 psw 的字符。
* 因为 psw 是字符串,psw[i] 就是逐个取它的字符,然后写到对应的 EEPROM 地址
*/
for (int i = 0; i <= 7; i++) {
EEPROM.write(i, psw[i]);
}
// 提交数据,把刚才写的数据真正保存到 EEPROM 里,这样掉电也不会丢
EEPROM.commit();
/*
* 循环从 EEPROM 地址 0 到 7 读取存储的数据。
* 每次读取一个字节,然后转成字符类型,拼接到 passward 字符串里
*/
for (int i = 0; i <= 7; i++) {
passward += char(EEPROM.read(i));
}
// 把读取到并拼接好的密码字符串输出到串口,这样就能看到是否读取正确啦
Serial.println(passward);
}
void loop() {
// loop 函数这里暂时为空,因为我们这次主要是在 setup 里完成读写操作,不需要循环执行啥
// 要是后续想做密码验证、修改之类的循环检测,就可以在这里添加代码啦
}
程序运行逻辑讲解
- 初始化与设置:
- 先包含头文件,定义好要存的密码和用来存读取结果的变量。然后在
setup
函数里,初始化串口,方便看信息。接着用EEPROM.begin(16)
设置 EEPROM 大小为 16 字节,成功的话串口输出提示 。
- 先包含头文件,定义好要存的密码和用来存读取结果的变量。然后在
- 写入密码:通过
for
循环,把密码字符串psw
里的每个字符,依次写到 EEPROM 地址 0 到 7 的位置,写完调用EEPROM.commit()
提交,确保数据存到 EEPROM 里 。 - 读取密码:再用一个
for
循环,从 EEPROM 地址 0 到 7 逐个读取字节,转成字符后拼接到passward
字符串,最后串口输出,这样就能看到存的密码是不是正确读出来啦 。 loop
函数:目前是空的,后续要是想做密码验证(比如不断检测输入密码和 EEPROM 存的是否一致 )、密码修改(重新写入新密码到 EEPROM )这些循环执行的功能,就可以在loop
里添加代码哟 。
五、实操任务:密码修改
(一)任务需求
咱们要实现一个简单的密码修改功能。流程大概是这样:先从串口接收用户输入的新密码,然后把新密码存到 EEPROM 里,之后再读取验证一下是否存成功啦 。
(二)示例代码(基于前面知识扩展 )
#include<EEPROM.h>
// 定义存储密码的字符串,初始设个默认密码,也可以是之前存过的
String newPsw = "", storedPsw = "";
const int EEPROM_SIZE = 16; // 定义 EEPROM 大小,这里设 16 字节
void setup() {
Serial.begin(9600);
// 初始化 EEPROM,大小用上面定义的常量
if (!EEPROM.begin(EEPROM_SIZE)) {
Serial.println("Failed to initialize EEPROM!");
while (1); // 初始化失败就卡住,方便排查问题
}
Serial.println("EEPROM initialized. Ready to change password.");
Serial.println("Please enter new password (8 characters):");
}
void loop() {
if (Serial.available() > 0) { // 检测串口是否有输入
newPsw = Serial.readStringUntil('\n'); // 读取串口输入的字符串,直到换行
newPsw.trim(); // 去掉字符串前后可能的空格、换行符之类的
if (newPsw.length() == 8) { // 检查密码是否是 8 个字符
// 把新密码写入 EEPROM
for (int i = 0; i < 8; i++) {
EEPROM.write(i, newPsw[i]);
}
EEPROM.commit(); // 提交写入,真正保存到 EEPROM
// 读取刚写入的密码,验证是否成功
for (int i = 0; i < 8; i++) {
storedPsw += char(EEPROM.read(i));
}
if (storedPsw == newPsw) { // 对比读取的和输入的是否一致
Serial.println("Password changed successfully! New password: " + storedPsw);
} else {
Serial.println("Password change failed. Please try again.");
}
} else {
Serial.println("Password must be 8 characters. Please try again.");
}
// 清空,方便下次输入
newPsw = "";
storedPsw = "";
Serial.println("Please enter new password (8 characters):");
}
}
代码说明
setup
函数:初始化串口和 EEPROM ,如果 EEPROM 初始化失败就提示并停止程序。然后提示用户可以输入新密码啦 。loop
函数:不断检测串口有没有输入。如果有,就读取输入的字符串当新密码,先检查长度是否是 8 个字符。符合的话,就把新密码写入 EEPROM 对应地址,提交保存。接着读取 EEPROM 里刚存的密码,和输入的新密码对比,一致就提示修改成功,不一致提示失败。要是密码长度不对,也提示用户重新输入 。- 这样就实现了一个简单的通过串口修改 EEPROM 中存储密码的功能啦,后续还能拓展,比如开机先读 EEPROM 密码进行验证,验证通过才执行某些操作之类的,就更像实际的密码应用场景咯 。
通过上面这些内容,相信你对 ESP32 for Arduino 里的 EEPROM 已经从概念到实际操作都有了比较清晰的认识啦,好好练习实践,就能灵活运用它做很多有趣的掉电数据存储应用啦,比如存设备配置信息、密码、运行参数等等哟 !
0 条评论
目前还没有评论...