如何在 Arduino 中更新 EEPROM 中的现有数据?


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

在本文中,我们将了解如何更新 EEPROM 中的现有数据。我们将逐步介绍 Arduino 中的内置示例。EEPROM 示例可以从以下位置访问:**文件 → 示例 → EEPROM**。

示例

我们将研究 **eeprom_update** 示例。您实际上使用的是 **EEPROM.update()** 函数。**EEPROM.update()** 函数与 **EEPROM.write()** 函数的不同之处在于,它只有在新的值与已存储在该地址中的值不同时才会覆盖 EEPROM 中的值。为什么?因为每个 EEPROM 每个地址的写入周期数量有限(约 100,000 次)。如果我们不断覆盖任何地址位置的相同值,就会缩短 EEPROM 的寿命。

我们首先包含库文件。

#include <EEPROM.h>

接下来,我们定义一个用于地址的全局变量。在 setup 函数中没有任何操作。

int address = 0;
void setup() {
   /** EMpty setup **/
}

在循环中,我们从模拟输入(本例中为 A0)读取值,并使用 **.update()** 函数将其写入 EEPROM。然后我们递增地址并重复此操作。如果到达 EEPROM 长度的结尾,我们返回开头 (**addr = 0**)。

请注意,我们将模拟读取输出除以 4,因为字节只能具有 0 到 255 的值,而 **analogRead()** 输出值的范围是 0 到 1023。

void loop() {
   int val = analogRead(A0) / 4;
   EEPROM.update(address, val);
   /***
      The function EEPROM.update(address, val) is equivalent to the following:
      if( EEPROM.read(address) != val ){
         EEPROM.write(address, val);
      }
   ***/
   address = address + 1;
   if (address == EEPROM.length()) {
      address = 0;
   }
   delay(100);
}

正如注释中提到的那样,**.update()** 函数等效于读取该地址处的 EEPROM,并且仅当新值与读取的值不同时才写入它。

更新于:2021年7月26日

浏览量 1K+

开启您的 职业生涯

完成课程后获得认证

开始学习
广告