如何使用Arduino将任意大小的数据放入EEPROM中?

Arduino Uno 具有 1 kB 的 EEPROM 存储空间。EEPROM 是一种非易失性存储器,即掉电后其内容仍会保留。因此,它可用于存储您希望跨电源循环保持不变的数据。配置或设置是此类数据的示例。

在本文中,我们将看到如何将任意大小(不仅仅是一个字节)的数据放入 EEPROM。我们将介绍 Arduino 中的一个内置示例。可以从以下位置访问 EEPROM 示例:文件 → 示例 → EEPROM

示例

我们将查看eeprom_put示例。感兴趣的主要功能是。它需要两个参数,开始写入/更新数据的起始地址,以及要写入的数据(可以是原始类型,如float或自定义结构)。其他原始数据类型的示例有shortintlongchardouble函数的行为类似于. 功能,即仅当要写入的新值与存储在该存储位置中的现有值不同时才写入 EEPROM。EEPROM.put()put()update()

我们从包含库开始。

#include <EEPROM.h>

接下来,我们定义了一个结构体,它包含两个浮点数和一个字符数组。

struct MyObject {
   float field1;
   byte field2;
   char name[10];
};

在 Setup 中,我们首先初始化 Serial。接下来,我们初始化一个浮点数,并将其写入 EEPROM 的开头(地址 = 0)。然后我们将地址变量推进浮点数的大小(使用sizeof()函数),并存储一个结构(使用之前定义的结构)。

void setup() {

   Serial.begin(9600);
   while (!Serial) {
      ; //等待串口连接。仅本地 USB 端口需要
   }

   float f = 123.456f; //存储在 EEPROM 中的变量。
   int eeAddress = 0; // 我们希望放置数据的位置。

   // 一个简单的调用,首先是地址,然后是对象。
   EEPROM.put(eeAddress, f);

   Serial.println("写浮点数据类型!");

   /** Put is designed for use with custom structures also. **/

   // 要存储的数据。
   MyObject customVar = {
      3.14f,
      65,
      "Working!"
   };

   eeAddress += sizeof(float); // 将地址移动到 float 'f' 之后的下一个字节。

   EEPROM.put(eeAddress, customVar);
   Serial.print("Written custom data type! \n\nView the example sketch eeprom_get to see how you can retrieve the values!");
}

循环中什么也没有发生。

void loop() {
   /* Empty loop */
}

此示例是eeprom_get示例的前身。换句话说,eeprom_get示例将假设您已经在 Arduino 上运行过这个eeprom_put示例。