怎样在Arduino上永久存储数据

一些arduino板允许您将数据永久存储在eeprom中但必须保持电路板插入。本文将教你如何写入板载eeprom(如果你的arduino有一个),并向您介绍一种允许您使用外部存储器的替代方法。
你可以将本指南用于支持通过i2c总线通信的任何微控制器。
支持的arduino开发板
下表列出了每个mcu可以提供的数据量商店:
连接内置eeprom
eeprom代表电子可擦除可编程只读存储器。虽然您可以覆盖芯片上的数据,但在开始出现故障之前,您只能进行有限次数的操作。但是,您可以根据需要多次读取它。
write()方法
以下示例说明了如何存储字节。
#include
void setup()
{
int word_address = 0;
eeprom.write(word_address, 0x7f);
}
void loop()
{ }
将write()方法与字地址和要存储的值一起使用。地址必须是介于零和eeprom.length() - 1之间的值,它告诉mcu在哪里存储值。
read()方法
以下示例从eeprom中读取一个字节:
#include
void setup()
{
serial.begin(9600);
int word_address = 0;
byte value;
value = eeprom.read(word_address);
serial.println(value, hex);
}
void loop()
{ }
read() - 方法也将地址作为参数并返回值作为一个字节。
清除内存
要清除内存,请在eeprom的每个位置存储零:
void erase(void)
{
for (int i = 0 ; i 《 eeprom.length() ; i++)
eeprom.write(i, 0);
}
“hello world”示例
以下代码将清除eeprom,然后在将字符串写入控制台之前将“hello world!”存储在其中:
#include
void erase(void)
{
for (int i = 0 ; i 《 eeprom.length() ; i++)
eeprom.write(i, 0);
}
void printmessage(byte* first, size_t len)
{
for (int i = 0; i 《 len; i++)
{
serial.print((char)first[i]);
}
}
void writemsg(byte* first, size_t len)
{
for(int i = 0; i 《 len; i++)
{
eeprom.write(i, first[i]);
}
}
void readmsg(size_t len)
{
byte res;
serial.print(“message: ”);
for(int i = 0; i 《 len; i++)
{
res = eeprom.read(i);
serial.print((char)res);
}
serial.println(“”);
}
void setup()
{
char* string = “hello world!”;
serial.begin(9600);
serial.print(“serial connection opened! ”);
serial.print(“eeprom length: ”);
serial.println(eeprom.length());
serial.print(“attempting to erase eeprom.。. ”);
erase();
serial.print(“done! ”);
serial.print(“message: ”);
printmessage(string, 12);
serial.print(“ ”);
serial.print(“attempting to write to eeprom.。. ”);
writemsg(string, 12);
serial.print(“done! ”);
serial.print(“attempting to read from eeprom.。. ”);
readmsg(12);
serial.print(“done! ”);
}
void loop()
{ }
使用外部eeprom
如果您不使用arduino或如果您想拥有额外的存储空间,可以使用外部eeprom ic来存储字节。在这个例子中,我们将使用4lc16b(pdf),它是一个16 kb i2c eeprom。
电路很简单,只需要添加一个100k上拉电阻并将ic连接到arduino(或您想要使用的任何其他mcu):
将4lc16b外部eeprom添加到电路图arduino。
该ic的第七个引脚是写保护指示灯。如果要写入存储器,请将此引脚连接到gnd。如果它很高,芯片将不会保存任何数据。无论引脚的状态如何,都可以进行读取。
与外部存储器通信
设置arduino和外部存储器之间的通信比较复杂内置存储器。
4lc16b ic的数据表详细描述了如何与它进行通信以存储数据。我写了这个草图,允许你在外部eeprom上连接一个字(或一个字节)。我使用16 kb变体对其进行了测试,但只要通信以相同的方式工作,它应该适用于所有其他大小(来自此制造商):
#include
static const byte device_base_address = 0x50;
void setup()
{
wire.begin();
serial.begin(9600);
}
byte readbytefromeeprom(byte block, byte word_offset)
{
wire.begintransmission(block);
wire.write(int(word_offset));
wire.endtransmission(true);
wire.requestfrom(int(block), 1);
if (wire.available())
return wire.read();
}
void readblockfromeeprom(byte block, byte outarray[256])
{
for(int i = 0; i 《 256; i++)
{
outarray[i] = readbytefromeeprom(block, i);
}
}
void readpagefromeeprom(byte block, byte word_offset, byte outarray[16])
{
for(int i = 0; i 《 16; i++)
{
outarray[i] = readbytefromeeprom(block, word_offset + i);
}
}
void writebytetoeeprom(byte block, byte word_offset, byte data)
{
writepagetoeeprom(block, word_offset, &data, 1);
}
/**
* block:
* 0x50 = first block = device_base_address
* 0x51 = second block
* 。..
* 0x57 = eight block
*/
void writepagetoeeprom(byte block, byte word_offset, byte *data, size_t len)
{
wire.begintransmission(block);
wire.write(word_offset);
for(int i = 0; i 《 len; i++)
{
wire.write(data[i]);
}
wire.endtransmission(true);
delay(10);
}
内存分为八个块可以直接寻址256个字节和每个块。 device_base_address(0x50)表示第一个,0x57表示最后一个块。
不同的芯片也有不同的基址。如有必要,请参阅eeprom的数据表并更新代码。
另一个“ hello world“示例
此程序将”hello world“存储在外部eeprom上第一个块的第一页,然后读取整个第一个块并将其打印到控制台:
void printblock(byte blockcontent[256])
{
for(int i = 0; i 《 16; i++)
{
serial.print(“page ”);
if(i+1 《 10)
serial.print(“0”);
serial.print(i+1);
serial.print(“: ”);
for(int u = 0; u 《 16; u++)
{
serial.print((char)blockcontent[i*16+u]);
if(u==7)
serial.print(“ ”);
}
serial.println(“”);
}
}
void loop()
{
byte result[256];
writepagetoeeprom(device_base_address, 0, “hello world!”, 12);
readblockfromeeprom(device_base_address, result);
printblock(result);
delay(20000);
exit(0);
}
执行此示例将为您提供以下结果(或类似的内容取决于你的eeprom的内容:

比亚迪首次与一家全球主要汽车制造商达成电池供应协议
作为ESD保护器件,TVS和压敏电阻有什么不同?该如何选择?
电力监理智能监管系统的功能实现和应用设计
疾速存储!大华T70移动固态硬盘勇登中国科技风云榜榜单
可穿戴设备“安全气囊”可防止摔伤
怎样在Arduino上永久存储数据
加特兰发布全新毫米波雷达芯片产品——Alps-Pro与Andes
中国移动正式发布5G手机测试版集采公告5G手机共计8100台
索尼RX100M5A拥有各种专业的视频拍摄功能非常符合Vlog视频的入门需求
调节方便的动态甲类偏置电路
英飞凌与腾讯云携手推进智能楼宇解决方案
PLC与这7种设备的连接方式,一看就懂!
Python的虚拟环境究竟是什么
浅谈SPB嵌入式音频处理系统设计
APEC推出可高达400KHz的同步降压稳压器APU3146
开关电源测试全面解读
CGL将退出对JDI援助框架
噪声计算软件的特点介绍,如何用其计算噪音?
汽车尾灯和刹车控制器设计分析
PLC远程监控网关在不同行业的作用