• C++
  • ESP32 for Arduino EEPROM 学习笔记教程

  • @ 2025-7-29 19:52:00

ESP32 for Arduino EEPROM 学习笔记教程

一、学习目标

  1. 清晰掌握 EEPROM 概念,学会运用相关函数进行 ESP32 数据的掉电存储与读写操作。
  2. 完成密码修改实操任务,借助 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 里完成读写操作,不需要循环执行啥
  // 要是后续想做密码验证、修改之类的循环检测,就可以在这里添加代码啦
}

程序运行逻辑讲解

  1. 初始化与设置
    • 先包含头文件,定义好要存的密码和用来存读取结果的变量。然后在 setup 函数里,初始化串口,方便看信息。接着用 EEPROM.begin(16) 设置 EEPROM 大小为 16 字节,成功的话串口输出提示 。
  2. 写入密码:通过 for 循环,把密码字符串 psw 里的每个字符,依次写到 EEPROM 地址 0 到 7 的位置,写完调用 EEPROM.commit() 提交,确保数据存到 EEPROM 里 。
  3. 读取密码:再用一个 for 循环,从 EEPROM 地址 0 到 7 逐个读取字节,转成字符后拼接到 passward 字符串,最后串口输出,这样就能看到存的密码是不是正确读出来啦 。
  4. 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):");
  }
}

代码说明

  1. setup 函数:初始化串口和 EEPROM ,如果 EEPROM 初始化失败就提示并停止程序。然后提示用户可以输入新密码啦 。
  2. loop 函数:不断检测串口有没有输入。如果有,就读取输入的字符串当新密码,先检查长度是否是 8 个字符。符合的话,就把新密码写入 EEPROM 对应地址,提交保存。接着读取 EEPROM 里刚存的密码,和输入的新密码对比,一致就提示修改成功,不一致提示失败。要是密码长度不对,也提示用户重新输入 。
  3. 这样就实现了一个简单的通过串口修改 EEPROM 中存储密码的功能啦,后续还能拓展,比如开机先读 EEPROM 密码进行验证,验证通过才执行某些操作之类的,就更像实际的密码应用场景咯 。

通过上面这些内容,相信你对 ESP32 for Arduino 里的 EEPROM 已经从概念到实际操作都有了比较清晰的认识啦,好好练习实践,就能灵活运用它做很多有趣的掉电数据存储应用啦,比如存设备配置信息、密码、运行参数等等哟 !

0 条评论

目前还没有评论...