EEPROM使用--SRAM的节省

Flash:一般用于程序存放,也就是电脑上下载的内容,存放的地方
EEPROM:用于存放在单片机操作过程中,需要掉电保存的数据
SRAM:掉电后,数据不可保存

变量节省SRAM空间

int a;		//在被使用的时候,就会从Flash里面调取出来放在SRAM中
const int PROGMEM a=123;//这个值就被放在Flash中,不会被取出放在SRAM中 

串口输出节省SRAM空间

Serial.print();		//会被在使用的时候,从Flash里面调取出来放在SRAM中
Serial.print(F());		//使用的时候就不会从Flash中取来,放在SRAM中

Arduino的EEPROM

Arduino uno的EEPROM只有1字节,也就是只有0-1024个位置可以存放数据,且每一个位置只能放下0-255的十进制数据…

如何使用EEPROM(0-255整数型的数据读写)

注意:EEPROM在执行完读写后,需要延时一段时间,因为EEPROM的读写速度比较慢.

示例程序EEPROM Write,已经由太极创客翻译为中文
http://www.taichi-maker.com/homepage/arduino-tutorial-index/intelligent-index/intelligent-12/


/*
 * EEPROM Write 示例程序
 * 
 * 储存于EEPROM的数值即使在断开Arduino开发板电源后仍会保存
 * 在EEPROM中。当我们将新程序上传Arduino开发板后,这些储存
 * 于EEPROM中的数值仍然可以被新的程序调用或者修改。
 * 
 * 本实例程序注释中文翻译:太极创客(WWW.TAICHI-MAKER.COM )
 * 如需要获得EEPROM的使用中文说明以及Arduino开发板开发的更多资料和
 * 视频教程,请参见太极创客网站:
 * 
 * 2017-11-22
 * 
 */
 
#include <EEPROM.h>
 
/** 被写入数据的EEPROM地址编号 (即.即哪一个存储地址将要被写入数据) **/
int addr = 0;
 
void setup() {
  /** setup内无内容 **/
}
 
 
 
void loop() {
  /***
    如使用EEPROM存储模拟输入引脚所读取到的数值(即使用analogRead函数
    读取Arduino开发板的模拟输入引脚并且将读取到的数值存储于EEPROM),
    则需要将该数值除以4。原因是用analogRead函数所读取到的数值为0-1023
    而EEPROM只能储存0-255的数值。(EEPROM每一个存储地址可以储存一个字节,
    因此只能存储0-255的数值。)
  ***/
 
  int val = 123;  // 将要存储于EEPROM的整数数值
  
  /***
    将数值写入相应EEPROM地址。该数值即使在断开
    Arduino开发板电源后,仍将保持在开发板的EEPROM中不变。
  ***/
  EEPROM.write(addr, val);		//将val这个数据,存放在addr这个地址空间
 
  /***
 
    转入下一存储地址。当存储地址序列号达到EEPROM的存储空间结尾,
    返回到EEPROM开始地址。
    
    不同型号Arduino开发板具有不同大小的EEPROM存储空间,即:
    - Arduno Duemilanove: 512b EEPROM 存储空间.
    - Arduino Uno:        1kb EEPROM 存储空间 (允许使用的EEPROM地址序列号为 0-1023 ).
    - Arduino Mega:       4kb EEPROM 存储空间.
  ***/
  addr = addr + 1;
  if (addr == EEPROM.length()) {		//其中EEPROM.length()可以获取EEPROM空间的大小
    addr = 0;
  }
 
  delay(10);			//因为EEPROM的读写速度比较慢,所以应该延时一段时间,再执行其它操作
}

示例程序EEPROM Read,已经由太极创客翻译为中文
http://www.taichi-maker.com/homepage/arduino-tutorial-index/intelligent-index/intelligent-12/

/*
 * EEPROM Write 示例程序
 * 
 * 储存于EEPROM的数值即使在断开Arduino开发板电源后仍会保存
 * 在EEPROM中。当我们将新程序上传Arduino开发板后,这些储存
 * 于EEPROM中的数值仍然可以被新的程序调用或者修改。
 * 
 * 本实例程序注释中文翻译:太极创客(WWW.TAICHI-MAKER.COM )
 * 如需要获得EEPROM的使用中文说明以及Arduino开发板开发的更多资料和
 * 视频教程,请参见太极创客网站:
 * 
 * 2017-11-22
 * 
 */
 
#include <EEPROM.h>
 
/*
 * EEPROM Read
 *
 * 读取所有EEPROM储存数值并显示于计算机屏幕供用户查看。
 * 
 * 本实例程序注释中文翻译:太极创客(WWW.TAICHI-MAKER.COM )
 * 如需要获得EEPROM的使用中文说明以及Arduino开发板开发的更多资料和
 * 视频教程,请参见太极创客网站:
 * 
 * WWW.TAICHI-MAKER.COM
 * 
 * 2017-11-22
 * 
 */
 
#include <EEPROM.h>
 
//从EEPROM的第一个字节(地址序号0)开始读取
int address = 0;
byte value;
 
void setup() {
  //初始化串口通讯并等待初始化完成
  Serial.begin(9600);
  while (!Serial) {
    ; // 等待初始化串口通讯初始化完成
  }
}
 
void loop() {
  //从当前EEPROM存储地址中读取数据
  value = EEPROM.read(address);		//读取address这个地址的数据,并赋值给value
 
  Serial.print(address);
  Serial.print("\t");
  Serial.print(value, DEC);
  Serial.println();
 
  /***
    转入下一存储单元。当存储序列号达到EEPROM的结尾,
    返回到EEPROM开始。
     
    不同型号Arduino开发板具有不同大小的EEPROM存储空间,即:
    - Arduno Duemilanove: 512b EEPROM 存储空间.
    - Arduino Uno:        1kb EEPROM 存储空间 (允许使用的EEPROM地址序列号为 0-1023 ).
    - Arduino Mega:       4kb EEPROM 存储空间.
  ***/
  address = address + 1;
  if (address == EEPROM.length()) {
    address = 0;
  }
 
  delay(500);
}

EEPROM其它数据类型的Write(写入)

注意:EEPROM在执行完读写后,需要延时一段时间,因为EEPROM的读写速度比较慢.

EEPROM.put();函数的使用
语法:EEPROM.put(fVar1Addr, floatVar1);
参数:
-------fVar1Addr:写入的位置
--------floatVar1:写入的值

以下代码,适用于所有数据类型,在使用的时候,只需要改变它的变量类型即可.

示例程序1 (小数的存放)
/*
 * eeprom_put_float
 * 太极创客(WWW.TAICHI-MAKER.COM )
 * 
 * 此示例程序旨在演示如何利用eeprom_put()函数
 * 向EEPROM存储带有小数点的浮点型数据。
 * 
 * 如需要获得EEPROM的使用中文说明以及Arduino开发板开发的更多资料和
 * 视频教程,请参见太极创客网站:
 * 
 * WWW.TAICHI-MAKER.COM
 */
 
#include <EEPROM.h>
 
void setup() {
 
  Serial.begin(9600);
 
  float floatVar1 = 123.456;         // 将要存储入EEPROM的浮点型数据1
  float floatVar2 = 234.567;         // 将要存储入EEPROM的浮点型数据2
  
  int fVar1Addr = 0;                  // 存储floatVar1的EEPROM地址
  int fVar2Addr = 4;                  // 存储floatVar2的EEPROM地址
 
  /*
   * 每一个浮点型变量所占的内存大小是4个字节
   * 假如我们选择EEPROM地址序号0来存储floatVar1变量。
   * 那么实际上Arduino将会用EEPROM地址序号为0-3这4个存储单元
   * 来存储floatVar1。
   * 
   * 因此存储第二个浮点型变量floatVar2的EEPROM地址序号就要从
   * 序号4或者4以后的序号选。这也就是为什么我们将fVar2Addr的数值设置为4。
  */
 
  EEPROM.put(fVar1Addr, floatVar1);  // 将floatVar1存入EEPROM地址1
  delay(10);
  EEPROM.put(fVar2Addr, floatVar2);  // 将floatVar2存入EEPROM地址2
  delay(10);   
/*
 * 此示例程序需要与eeprom_get_float示例程序配合使用,
 * 从而确定此示例程序中的浮点数据确实写入了EEPROM中。
 * 
 * eeprom_get_float示例程序的作用是从EEPROM读取此示例程序
 * 所写入EEPROM的浮点数并将其显示于串行监视器中。以供用户查验。
*/
 
  Serial.println("Finished writing float data!");
}
 
void loop() {
  /* 无内容 */
}


示例程序2(整数的存放)


/*
 * eeprom_put_int
 * 太极创客(WWW.TAICHI-MAKER.COM )
 * 
 * 此示例程序旨在演示如何利用eeprom_put()函数
 * 向EEPROM存储整数型数据。
 * 
 * 此示例程序需要与eeprom_get_int示例程序配合使用,
 * 从而确定此示例程序中的整数数据确实写入了EEPROM中。
 * 
 * eeprom_get_int示例程序的作用是从EEPROM读取此示例程序
 * 所写入EEPROM的整数数并将其显示于串行监视器中。以供用户查验。
 * 
 * 
 * 如需要获得EEPROM的使用中文说明以及Arduino开发板开发的更多资料和
 * 视频教程,请参见太极创客网站:
 * 
 * WWW.TAICHI-MAKER.COM
 */
 
#include <EEPROM.h>
 
void setup() {
 
  Serial.begin(9600);
 
  int i = 9999;               // 将要存储入EEPROM的整数型数据
  int address = 1;            // EEPROM存储地址
 
  EEPROM.put(address, i);    // 将整数型变量i存入EEPROM
  
/*
 * 此示例程序需要与eeprom_get_int示例程序配合使用,
 * 从而确定此示例程序中的整数数据确实写入了EEPROM中。
 * 
 * eeprom_get_int示例程序的作用是从EEPROM读取此示例程序
 * 所写入EEPROM的整数数并将其显示于串行监视器中。以供用户查验。
*/
 
  Serial.println("Finished writing int data type!");
}
 
void loop() {
  /* Empty loop */
}

EEPROM其它数据类型的Get(读取)

EEPROM.get()函数的使用方法
语法:
-------EEPROM.get(address,var)

参数:
--------address:需要读取的地址
---------var用于存储读取到的数据

如何读取EEPROM中带有小数点的浮点型数据


/*
 * eeprom_get_float 示例
 * 太极创客(WWW.TAICHI-MAKER.COM )
 * 
 * 此示例程序旨在演示如何利用eeprom_get()函数
 * 向EEPROM读取带有小数点的浮点型数据。
 * 
 * 如需要获得EEPROM的使用中文说明以及Arduino开发板开发的更多资料和
 * 视频教程,请参见太极创客网站:
 * WWW.TAICHI-MAKER.COM
 * 2018-01-12    
*/
  
#include <EEPROM.h>
  
void setup() {
  
  float floatVar1;   //此变量用于存储获取到的EEPROM浮点型数据1
  float floatVar2;   //此变量用于存储获取到的EEPROM浮点型数据2
  
  int fVar1Addr = 0;                  // 存储floatVar1的EEPROM地址
  int fVar2Addr = 4;                  // 存储floatVar2的EEPROM地址
  
  Serial.begin(9600);
  
  Serial.println("Get float from EEPROM: ");
  
  //从EEPROM获取浮点型数据
  EEPROM.get(fVar1Addr, floatVar1);
  delay(10);
  EEPROM.get(fVar2Addr, floatVar2);
  delay(10);
  /*
   * 此示例程序需要与eeprom_put_float示例程序配合使用。
   * 在运行本示例程序前,请先运行eeprom_put_float示例程序,
   * 从而确保EEPROM中已经写入可以获取的浮点型数据了。
   * 如果没有进行以上操作,此示例程序仍然可以运行,但是输出信息
   * 可能是毫无意义的乱码。  
   */
   
  Serial.print("floatVar1 = ");   
  Serial.println(floatVar1, 3);  
  Serial.print("floatVar2 = ");     
  Serial.println(floatVar2, 3);  
 
}
  
void loop() {
  /* Empty loop */
}

如何读取EEPROM中带有小数点的浮点型数据

/*
 * eeprom_get_int 示例
 * 太极创客(WWW.TAICHI-MAKER.COM )
 * 
 * 此示例程序旨在演示如何利用eeprom_get()函数
 * 向EEPROM读取整数型数据。
 * 
 * 如需要获得EEPROM的使用中文说明以及Arduino开发板开发的更多资料和
 * 视频教程,请参见太极创客网站:
 * WWW.TAICHI-MAKER.COM
 * 2018-01-12    
*/
  
#include <EEPROM.h>
  
void setup() {
  
  int i;             //此变量用于存储获取到的EEPROM整数型数据
  int eeAddress = 1; //起始获取信息的EEPROM地址
  
  Serial.begin(9600);
  
  Serial.print("Get int from EEPROM: ");
  
  //从'eeAddress'地址获取整数型数据
  EEPROM.get(eeAddress, i);
  Serial.println(i);    
/*
 * 此示例程序需要与eeprom_put_int示例程序配合使用。
 * 在运行本示例程序前,请先运行eeprom_put_int示例程序,
 * 从而确保EEPROM中已经写入可以获取的整数型数据了。
 * 如果没有进行以上操作,此示例程序仍然可以运行,但是输出信息
 * 可能是毫无意义的乱码。  
 */
}
  
void loop() {
  /* Empty loop */
}




整型数据的读取,可以读9999以上的数值


/*
 * eeprom_get_int 示例
 * 太极创客(WWW.TAICHI-MAKER.COM )
 * 
 * 此示例程序旨在演示如何利用eeprom_get()函数
 * 向EEPROM读取整数型数据。
 * 
 * 如需要获得EEPROM的使用中文说明以及Arduino开发板开发的更多资料和
 * 视频教程,请参见太极创客网站:
 * WWW.TAICHI-MAKER.COM
 * 2018-01-12    
*/
  
#include <EEPROM.h>
  
void setup() {
  
  int i;             //此变量用于存储获取到的EEPROM整数型数据
  int eeAddress = 1; //起始获取信息的EEPROM地址
  
  Serial.begin(9600);
  
  Serial.print("Get int from EEPROM: ");
  
  //从'eeAddress'地址获取整数型数据
  EEPROM.get(eeAddress, i);
  Serial.println(i);    
/*
 * 此示例程序需要与eeprom_put_int示例程序配合使用。
 * 在运行本示例程序前,请先运行eeprom_put_int示例程序,
 * 从而确保EEPROM中已经写入可以获取的整数型数据了。
 * 如果没有进行以上操作,此示例程序仍然可以运行,但是输出信息
 * 可能是毫无意义的乱码。  
 */
}
  
void loop() {
  /* Empty loop */
}

EEPROM里面的数据更新

语法:
-------EEPROM.update(address,val
);
参数:
-------address:数据的地址
-------val:需要更新的值

使用方法:在使用的时候,会自动判断address里面的内容,是否等于val,如果不相等,才会用val的值覆盖以前的值…如果相等,则不执行任何操作.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值