如何使用Arduino EEPROM在重启后保存数据

您知道Arduino在关闭时可以存储数据吗?草图不存储在闪存中。我说的是EEPROM中的可变数据。加入我的行列,向我展示如何读写它,以及它对您的项目有什么作用。

如果您不熟悉Arduino,请确保阅读我们的初学者指南。

什么是EEPROM?

EEPROM代表电可擦可编程只读存储器。这是一种非易失性存储器。如果您不了解任何含义,请不要担心。即使没有电源,它也可以简单地存储数据(与RAM不同,RAM需要电力才能保留任何数据)。

EEPROM内置于众多处理器中,例如现场可编程门阵列(FPGA)。

工作原理?

EEPROM是通过 Fowler-Nordheim隧道电擦除和编程的。您无需了解技术细节即可使用它。基本前提是用电来更改二进制数据(什么是binary)。可以电子方式读取,擦除和重写。

幸运的是,Arduino语言可以轻松更改数据,而无需任何计算机科学学位。

Life期望

尽管在Arduino中易于使用EEPROM,但寿命有限。 EEPROM指定可处理100,000个读/擦除周期。这意味着您可以在EEPROM变得不稳定之前写入并擦除/重写数据100,000次。实际上,取决于每个处理器的容差,Atmel(Arduino“芯片"的制造商)半导体可以处理更高或更低的循环数。

一旦写入位置并写入擦除次数过多,可能会变得不可靠。它可能无法返回正确的数据,也可能无法返回相邻位的值。

这听起来像是很多次写入,但是如果以编程方式进行读取和写入(在例如,循环。读取数据不会降低芯片质量,仅写入会。您可以无忧无虑地从EEPROM读取数据!

请务必注意,此限制适用于每个内存位置。您的Arduino在EEPROM中可能有1,000个或更多可用的存储位置,因此,如果您对一个位置写入太多次,则只会影响该位置,而不会影响其他位置。稍后,我将讨论损耗平衡,它可以通过均匀分配数据来减少EEPROM损耗,这是SSD可以利用的东西。

它有什么用?

EEPROM对于您的Arduino项目非常有用。由于即使断电也能记住数据,因此您可以存储Arduino的状态。也许您可以建造一个激光炮塔,并记录设备被激活的次数。

EEPROM最适合诸如设置或高分的事情。如果您想定期写入复杂的数据,则可以考虑使用以太网屏蔽。

读取和写入

现在,理论已不复存在,让我们看一下如何读取和写入数据一些数据!首先,包括库(Arduino IDE随附):

#include <EEPROM.h>

现在写入一些数据:

EEPROM.write(0, 12);

这会将数字 12 写入EEPROM位置 0 。每次写入需要3.3毫秒( ms ,1000ms = 1秒)。请注意,您不能写字母( char ),只允许从0到255的数字。这就是为什么EEPROM非常适合设置或高分,但不适用于播放器名称或单词的原因。可以使用这种方法存储文本(您可以将字母表中的每个字母映射到一个数字),但是您将需要具有多个存储位置-每个字母一个位置。

以下是您的阅读方式该数据:

EEPROM.read(0);

零是您之前写入的地址。如果您以前没有写过地址,它将返回最大值( 255 )。

有一些更有用的方法可用。假设您要存储小数位或字符串:

EEPROM.put(2,"12.67");

这会将数据写入多个位置,这很容易自己编写,但仍然很方便。您仍需要跟踪已写入的位置数,以免意外覆盖数据!您必须使用 get 方法再次检索该数据:

float f = 0.00f;EEPROM.get(2, f);

get中的值存储在float f 变量中。请注意,如何使用 0.00f 作为值进行初始化。 f 使编译器知道您可能希望在此变量中存储大量数字,因此它会在编译过程中设置一些其他配置。

Arduino网站上的EEPROM文档还有更多示例。

磨损平衡

磨损平衡是一种用于减少磨损并延长EEPROM寿命的技术。如果您仅在一个小型项目上工作,则不必担心这一点。

您可以做的最简单的保存EEPROM寿命的操作是将写入限制在特定位置。您可以通过先读取地址来完成此操作,如果您要写入的值已经存在,则无需再次写入(请记住,读取数据无害)。操作方法如下:

int safeWrite(int data, address) {    if(EEPROM.read(address) != data) {        EEPROM.write(address, data);    }}

这是相当简单的代码,但是它仅适用于整数!不用重新发明轮子,而是使用Arduino EEPROM库中内置的功能:

EEPROM.update(address, val);

此方法与 write 方法具有完全相同的签名,尽管它可能会大大减少所需的写入次数!

如果您需要写入大量数据,并且担心硅片会耗尽,则可以跟踪执行的写入次数,尽管这会使用更多的数据。这是伪代码的粗略实现:

var address = 0var writeCount = 0if(writeCount > 75,000)    writeCount = 0    address += 1EEPROM.write(address, data)

您需要将地址和writeCount存储在EEPROM中(并且writeCount需要在地址位置之间划分)。在大多数情况下,将不需要此级别的保护。 Arduino也是如此便宜,因此您可能会发现购买备份更容易!

您现在应该已经足够了解做一些很棒的项目了。让我们知道您是否做得很酷!您可以识别图片中的所有设备吗?在下面给我们留言!

标签: Arduino 电子技术