使用Arduino开发ESP32(三十):EEPROM读写,附上随机数写入读取例程

代码

/*
   EEPROM(带电可擦可编程只读存储器) 写入

   将随机数存储进EEPROM.
   这些数据会保存在EEPROM中,esp32掉电重启后依然存在,并可被其他例程调用
*/

#include "EEPROM.h"

// we're going to write to next)
int addr = 0; //EEPROM当前地址
#define EEPROM_SIZE 64        //64字节 申请空间的大小必须为4的倍数,如:23则会更改成24
void setup()
{
  Serial.begin(115200);
  Serial.println("初始化...");
  if (!EEPROM.begin(EEPROM_SIZE))         //申请EEPROM 64字节的空间
  {
    Serial.println("初始化EEPROM失败"); delay(1000000);
  }
  
  Serial.println(" 从Flash中读取到数据,值为:");
  for (int i = 0; i < EEPROM_SIZE; i++)
  {
    Serial.print(byte(EEPROM.read(i))); Serial.print(" ");
  }
  Serial.println();
  Serial.println("正将随机数写入到内存中");
}

void loop()
{
  // need to divide by 4 because analog inputs range from
  // 0 to 1023 and each byte of the EEPROM can only hold a
  // value from 0 to 255.
  // int val = analogRead(10) / 4;
  int val = byte(random(10020));
  // write the value to the appropriate byte of the EEPROM.
  // these values will remain there when the board is
  // turned off.
  EEPROM.write(addr, val);
  Serial.print(val); Serial.print(" ");
  addr = addr + 1;  //前进到下一地址
  if (addr == EEPROM_SIZE)
  {
    Serial.println();
    addr = 0;
    EEPROM.commit();                 //保存更改
    Serial.print(EEPROM_SIZE);
    Serial.println("字节  Flash存储的数据:");
    for (int i = 0; i < EEPROM_SIZE; i++)
    {
      Serial.print(byte(EEPROM.read(i))); Serial.print(" ");
    }
    Serial.println(); Serial.println("----------------------------------");
  }

  delay(100);
}

运行结果

在这里插入图片描述

注:

例程所示,申请了64字节的空间,地址范围0~63,若addr=64,等价于addr=0。

补充:

说一些需要注意的地方
1.我们使用开辟的空间是从ESP32的FLASH中分配出来的
2.包含的那个头文件的库里面已经有一个EEPROM对象可以直接使用
3.默认的EEPROM对象大小为4096字节,用户操作地址为0~4095;
4.读取和写入有函数支持,但切忌写入的东西都写完后要用保存函数保存更改才会正式生效,保存函数为EEPROM.commit()或EEPROM.end()
5.空间的申请都是4字节的倍数,即使你申请23,系统内部也会给你改成24字节
6.ESP32的EEPROM只是从flash上申请一个扇区用,所以读写都只能按扇区(4096字节)来
7.这个东西存在的目的本就不是存什么大东西的哈,只是存一些关键的需要掉电存储的参数,所以建议大家不要改申请地址,一直用这个大小就好,如果大改小会导致一些原来的数据丢失哈
8.那么存一些字符串和很大的数怎么办呢?你可以封装一个专门用于存储读取字符串的函数,但是这个东西存字符串这种东西的应用不常见,那么存一些大的数怎么办呢,这个非常常见,因为我们是8位的,也就是0-255,如果太大或者是小数呢,我们可以分高低位存储,除以255和取余255分别为高低位,甚至分高中低三位都行,而小数呢,也很简单,比如我们可以放大1000倍取整然后高低位存进去,之后取出来还原,再除以1000,就可以得到0.001精度的小数保留,精度还可以再放大。

参考,感谢:

(ESP32学习10)内部存储的使用(Flash-EEPROM)

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值