Arduino 入门学习笔记11 使用I2C读写EEPROM
- 一、Arduino 内置EEPROM介绍
- 二、EEPROM 操作
- 1. 包含EEPROM库:
- 2. 写入数据到EEPROM:
- 3. 从EEPROM读取数据
- 4. 完整示例:
一、Arduino 内置EEPROM介绍
Arduino的内置EEPROM(Electrically Erasable Programmable Read-Only Memory)是一种用于存储持久性数据的非易失性存储器,它嵌入在Arduino微控制器芯片内部。与外部EEPROM不同,Arduino的内置EEPROM通常具有较小的存储容量,通常在几百字节到几千字节之间,具体取决于Arduino的型号和芯片。以下是关于Arduino的内置EEPROM的重要信息:
容量:不同型号的Arduino板在芯片上都有内置EEPROM。例如,ATmega328P芯片(如Arduino Uno)具有1024字节的EEPROM。在编写代码时,要根据芯片的型号查阅相应的数据手册以获取准确的EEPROM容量。
使用方式:与外部EEPROM不同,Arduino的内置EEPROM不需要额外的硬件连接,因为它直接集成在芯片内部。你可以使用EEPROM库中的函数来读写EEPROM中的数据。
写入次数:Arduino的内置EEPROM的写入次数是有限的,通常在10,000到100,000次之间,具体取决于芯片型号。在使用EEPROM时,要注意避免频繁的写入操作,以延长其寿命。
库函数:Arduino的EEPROM库提供了一组函数来简化对内置EEPROM的读写操作。常用的函数包括EEPROM.write()用于写入一个字节数据,EEPROM.read()用于读取一个字节数据。
示例应用:内置EEPROM可用于存储持久性数据,如配置设置、用户选项、校准数据、设备标识等。由于内置EEPROM是芯片自带的存储器,因此无需外部连接和电源即可保留数据。
本文准备环境 :
- Arduino UNO 开发板
- Arduino 2.1.1
- EEPROM模组
二、EEPROM 操作
Arduino 官方提供了EEPROM 库,文档地址:
https://docs.arduino.cc/learn/built-in-libraries/eeprom
以下是在Arduino中使用内置EEPROM进行读写操作的步骤:
1. 包含EEPROM库:
首先,在你的Arduino代码中包含EEPROM库,以便使用EEPROM相关函数。
#include <EEPROM.h>
2. 写入数据到EEPROM:
使用EEPROM.write()函数将数据写入EEPROM。此函数接受两个参数,地址和要写入的值。
int address = 0; // EEPROM地址
byte valueToWrite = 42; // 要写入的值EEPROM.write(address, valueToWrite);
EEPROM每次写入都会消耗一次写入/擦除周期,所以请避免频繁写入操作以延长EEPROM的使用寿命。
3. 从EEPROM读取数据
使用EEPROM.read()函数从EEPROM读取数据。此函数接受一个地址参数,然后返回存储在该地址上的值。
int readAddress = 0; // 要读取的EEPROM地址
byte readValue = EEPROM.read(readAddress);
打开串口进行输出:你可以使用Serial库来在串口监视器中查看读取到的数据。
Serial.begin(9600);
Serial.print("Read value from EEPROM: ");
Serial.println(readValue);
4. 完整示例:
#include <EEPROM.h>int address = 0; // EEPROM地址
byte valueToWrite = 43; // 要写入的值
byte readValue; // 读取到的值void setup() {Serial.begin(9600);// 从EEPROM读取数据readValue = EEPROM.read(address);Serial.print("Read value from EEPROM: ");Serial.println(readValue);// 将新值写入EEPROMEEPROM.write(address, valueToWrite);Serial.println("Value written to EEPROM!");readValue = EEPROM.read(address);Serial.print("Read value from EEPROM: ");Serial.println(readValue);
}void loop() {// 循环中不需要做任何事情
}