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的值覆盖以前的值…如果相等,则不执行任何操作.