Arduino - 使用EEPROM保存数据

本文详细介绍如何在Arduino中使用EEPROM存储数据,包括基本的写入、读取操作,以及利用共用体实现复杂数据类型的存储技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

EEPROM (Electrically Erasable Programmable Read-Only Memory),电可擦可编程只读存储器–一种掉电后数据不丢失的存储芯片。
arduino已经为我们准备好了EEPROM类库”EEPROM.h”。
我们要使用得先调用EEPROM.h,然后使用write和read方法,即可操作EEPROM。

一、写入方法:EEPROM.write(address, value)

#include <EEPROM.h>
int addr = 0;
void setup()
{
}
void loop()
{
  //每次写入1个字节,注意不要溢出。
  //比如要保存模拟值,模拟值读出后是一个0-1024的值,但每字节的大小为0-255,容纳不了,所以这里可以变通一下,将值除以4再存储到val,就能够容纳了。使用的时候读出来再乘以4还原回来。  
  int val = analogRead(0) / 4;
  EEPROM.write(addr, val);

  addr = addr + 1;
  if (addr == 512)  // 当读写位置到了最大容量时,注意不要溢出。
    addr = 0;
  delay(100);
}

二、读取方法:EEPROM.read(address)

#include <EEPROM.h>
int address = 0;
byte value;
void setup()
{
  Serial.begin(9600);
}

void loop()
{
  // 读入一个字节
  value = EEPROM.read(address);

  Serial.print(address);
  Serial.print("\t");
  Serial.print(value, DEC);
  Serial.println();

  // 到下一个地址
  address = address + 1;

  // 注意地址不要溢出
  if (address == 512)
    address = 0;

  delay(500);
}

三、清除数据:每个地址都写入0

#include <EEPROM.h>
void setup()
{
  // 让EEPROM的512字节内容全部清零
  for (int i = 0; i < 512; i++)
    EEPROM.write(i, 0);
}
void loop()
{
}

四、使用共用体,快捷的存储各类型数据到EEPROM

首先了解一下什么是【共用体】:将几个不同(类型不同,但长度相同)的变量放到同一段内存中,共同占用这一段内存数据,使各变量的内存数据始终保持一致。

你可能发现了,使用Arduino提供的EEPROM API,只能将【字节型】的数据的存入EEPROM,也就是一次只能写入1个字节。如果要存储多个字节的数据类型,又需要怎么做呢?

例如:一个float类型的数据,需要占用4个字节的存储空间。因此我们可以把一个float拆分为4个字节,然后逐字节的写入EEPROM,来达到保存float数据的目的。但是手动计算的话,比较麻烦。
这里我们使用共用体,通过其它数据结果,快捷的把float数据拆分为4个字节。

首先定义一个名为data的共用体结构,共用体中有两个类型不同的成员变量:

union data
 {
   float a;  // 浮点型,占用4个字节
   byte b[4];  // 字节型数组,占用4个字节。
   // 这两个类型的变量都是占用4个字节,且是相同的4个字节,所以能始终保持数据一致,其中一个变了,另一个也随之改变。
 };

再申明一个data类型的变量col:

data col;

现在你可以通过 col.a 访问这个共用体中的 float 类型成员 a,也可以通过 col.b 访问这个共用体中的 byte 类型成员 b。
col.a 和 col.b 共同占用四个字节的地址。
给 col.a 赋值后,通过 col.b 即可拆分 float 为4个字节。

(1)通过共用体写入:

#include <EEPROM.h>
union data
{
  float a;
  byte b[4];
};
data col;
int addr = 0;

void setup()
{
  col.a=987.65;  // 通过 a 赋值
  for(int i=0;i<4;i++)
  EEPROM.write(i, col.b[i]);  // 通过 b 拆分为4个字节 
}

void loop()
{
}

(2)通过共用体读取:

#include <EEPROM.h>
union data
{
  float a;
  byte b[4];
};
data col;
int addr = 0;

void setup()
{
  Serial.begin(9600);   
  for(int i=0;i<4;i++)
  col.b[i]=EEPROM.read(i);
  Serial.println(col.a);
}

void loop()
{
}
Arduino平台上,EEPROM是Electronically Erasable Programmable Read-Only Memory(电可擦除可编程只读存储器)的一种常见使用方式。它允许你在电路断电后仍能保留数据,不像RAM(随机访问内存),不保存电源就会丢失信息。下面是关于Arduino EEPROM的一些关键点: 1. **数据持久性**: ArduinoEEPROM可以用来存储一些配置设置、计数器值或有限的用户数据,因为它们不会因设备关闭而丢失。 2. **编程示例**[^2]: - EEPROM有`EEPROM.write()`和`EEPROM.read()`函数,用于写入和读取数据。例如,存储一个整数值: ```cpp int storedValue; EEPROM.begin(EEPROM_SIZE); // 初始化EEPROM EEPROM.write(0, storedValue); // 写入位置0的数据 ``` - 之后可以通过索引读回数据: ```cpp EEPROM.read(0, &storedValue); // 从位置0读取数据到变量storedValue ``` 3. **与定时器结合**: 如果需要定期更新或刷新EEPROM中的数据,可以利用Arduino的定时器功能,比如`TimerOne`库来实现周期性的数据备份或清除。 4. **内存选项**: - Arduino板通常有两种类型的内存:`FLASH`(闪存,常用于固件)和`SRAM`(静态随机存储器,临时数据存储)。 - 除了EEPROM,还有`AnalogWrite`用于模拟信号输出,以及`Serial`用于串口通信。 **相关问题--:** 1. Arduino EEPROM的容量是多少? 2. 如何在Arduino程序中初始化并开始使用EEPROM? 3. 如何在Arduino中实现数据的定期自动同步到EEPROM
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卢光庆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值