找回密码
 立即注册

QQ登录

只需一步,快速开始

Arduino将数据存储到EEPROM




EEPROM简介

EEPROM (ElectricallyErasable Programmable Read-Only Memory),上电可擦可编程只读存储器--一种掉电后数据不丢失的存储芯片,简而言之就是你想断电后arduino还要保存一些参数,就使用EEPROM吧。在各型号的arduino控制器上的AVR芯片均带有EEPROM,也有外接的EEPROM芯片,常见arduino控制器的EEPROM大小:Arduino UNO、Arduino duemilanove-m328、Zduino m328均使用ATmega328芯片,EEPROM都为1K,Arduino duemilanove-m168的EEPROM为512bytes。下面以arduino leonardo介绍arduino自带的EEPROM使用方法,以及arduino插拔次数的计数方法,arduino中已经存在EEPROM类库,我们要使用得先调用EEPROM.h,然后使用write和read方法,即可操作EEPROM。

239.jpg

下面的官方例子我们将EEPROM的大小都定为了512字节,实际使用中,大家可参照上面所说的EEPROM大小,自行更改。

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

  1. 多个字节写入数据
  2. #include <EEPROM.h>//调用库
  3. int addr = 0; // EEPROM 的当前地址,即你将要写入的地址,这里就是从0开始写
  4. void setup()
  5. {
  6. }
  7. void loop()
  8. {
  9.   EEPROM.write(addr, 10);
  10.   //每次写入1个字节,字节的大小为0-255,注意不要溢出,
  11. //我们在这里写入的数值为10
  12.   
  13. addr = addr + 1;
  14.   if (addr == 512)  // 当读写位置到了最大容量时,注意不要溢出。
  15.     addr = 0;
  16.   delay(100);
  17. }
  18. 单个字节写入数据
  19. #include <EEPROM.h>//调用库
  20. int addr = 0; // EEPROM 的当前地址,即你将要写入的地址,这里就是从0开始写
  21. void setup()
  22. {
  23. }
  24. void loop()
  25. {
  26.   EEPROM.write(addr, 10);
  27.   //每次写入1个字节,字节的大小为0-255,注意不要溢出,
  28. //我们在这里写入的数据为10
  29.   //实现效果,地址为0的字节写入数据10
复制代码

读取方法:EEPROM.read(address)

  1. 多个字节读取数据
  2. #include <EEPROM.h>//调用库文件
  3. int address = 0; //需要读取的EEPROM地址
  4. byte value; //声明字节变量
  5. void setup()
  6. {
  7.   Serial.begin(9600);
  8. }
  9. void loop()
  10. {
  11.   // 读入一个字节
  12.   value = EEPROM.read(address);
  13.   Serial.print(address);//打印地址号
  14.   Serial.print("\t");
  15.   Serial.print(value);//打印字节
  16.   Serial.println();
  17.   // 到下一个地址
  18.   address = address + 1;
  19.   // 注意地址不要溢出
  20.   if (address == 512)
  21.     address = 0;
  22.   delay(500);
  23. }
  24. 单个字节读取数据
  25. #include <EEPROM.h>//调用库文件
  26. int address = 0; //需要读取的EEPROM地址
  27. byte value; //声明字节变量
  28. void setup()
  29. {
  30.   Serial.begin(9600);
  31. }
  32. void loop()
  33. {
  34.   // 读入一个字节
  35.   value = EEPROM.read(address);
  36.   Serial.print(address);//打印地址号
  37.   Serial.print("\t");
  38.   Serial.print(value);//打印字节
  39.   Serial.println();
复制代码

Mixly相同程序实现

单个字节数据读取

240.png

单个字节数据读取

241.png

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

  1. #include <EEPROM.h>
  2. void setup()
  3. {
  4.   // 让EEPROM的512字节内容全部清零
  5.   for (int i = 0; i < 512; i++)
  6.     EEPROM.write(i, 0);
  7. }
  8. void loop()
  9. {
  10. }
复制代码

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

首先了解一下什么是【共用体】:将几个不同(类型不同,但长度相同)的变量放到同一段内存中,共同占用这一段内存数据,使各变量的内存数据始终保持一致。
你可能发现了,使用Arduino提供的EEPROM API,只能将【字节型】的数据的存入EEPROM,也就是一次只能写入1个字节。如果要存储多个字节的数据类型,又需要怎么做呢?
例如:一个float类型的数据,需要占用4个字节的存储空间。因此我们可以把一个float拆分为4个字节,然后逐字节的写入EEPROM,来达到保存float数据的目的。但是手动计算的话,比较麻烦。
这里我们使用共用体,通过其它数据结果,快捷的把float数据拆分为4个字节。
首先定义一个名为data的共用体结构,共用体中有两个类型不同的成员变量:

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

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

  1. data col;
复制代码

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

(1)通过共用体写入:

  1. #include <EEPROM.h>
  2. union data
  3. {
  4.   float a;
  5.   byte b[4];
  6. };
  7. data col;
  8. int addr = 0;

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

  15. void loop()
  16. {
  17. }
复制代码

(2)通过共用体读取:

  1. #include <EEPROM.h>
  2. union data
  3. {
  4.   float a;
  5.   byte b[4];
  6. };
  7. data col;
  8. int addr = 0;

  9. void setup()
  10. {
  11.   Serial.begin(9600);   
  12.   for(int i=0;i<4;i++)
  13.   col.b[i]=EEPROM.read(i);
  14.   Serial.println(col.a);
  15. }

  16. void loop()
  17. {
  18. }
复制代码
分享至 : QQ空间
收藏

0 个回复

您需要登录后才可以回帖 登录 | 立即注册