Микроконтроллеры AVR, на основе которых создаются платы Arduino и
Genuino, обладают встроенной EEPROM: памятью, которая хранит значения
переменных, пока плата выключена (подобно крошечному жесткому диску).
Описываемая в данной статье библиотека позволяет считывать и записывать
данные в EEPROM.
Поддерживаемые микроконтроллеры на различных
платах Arduino и Genuino обладают разным размером EEPROM: 1024 байта в
ATmega328, 512 байт в ATmega168 и ATmega8, 4 KB (4096 байт) в ATmega1280
и ATmega2560. Платы Arduino и Genuino 101 обладают эмуляцией EEPROM
пространства размером 1024 байт.
Функции для работы с EEPROM:
read()
- Описание
- Считывает байт из EEPROM. Ячейки, которые никогда не были записаны, содержат значение 255.
- Синтаксис
EEPROM.read(address)
- Параметры
address
: адрес ячейки для считывания, начинается с 0 (int
).- Возвращаемое значение
- Значение, записанное в ячейку (
byte
). - Пример
#include <EEPROM.h>
int address = 0;
byte value;
void setup() {
Serial.begin(9600);
while (!Serial) {
;
}
}
void loop() {
value = EEPROM.read(address);
Serial.print(address);
Serial.print("\t");
Serial.print(value, DEC);
Serial.println();
address = address + 1;
if (address == EEPROM.length()) {
address = 0;
}
delay(500);
}
write()
- Описание
- Записывает байт в EEPROM.
- Синтаксис
EEPROM.write(address, value)
- Параметры
address
: адрес ячейки для записи, начинается с 0 (int
).
value
: значение для записи, от 0 до 255 (byte
).- Возвращаемое значение
- Ничего не возвращается.
- Примечание
- Запись
в EEPROM занимает 3,3 мс. Память EEPROM обладает жизненным циклом 100
000 операций записи/стирания, поэтому, возможно, вам придется быть
осторожными с тем, как часто записываете её.
- Пример
#include <EEPROM.h>
int addr = 0;
void setup() {
}
void loop() {
int val = analogRead(0) / 4;
EEPROM.write(addr, val);
addr = addr + 1;
if (addr == EEPROM.length()) {
addr = 0;
}
delay(100);
}
update()
- Описание
- Записывает байт в EEPROM. Значение записывается, только если оно отличается от значения уже записанного по этому адресу.
- Синтаксис
EEPROM.update(address, value)
- Параметры
address
: адрес ячейки для записи, начинается с 0 (int
).
value
: значение для записи, от 0 до 255 (byte
).- Возвращаемое значение
- Ничего не возвращается.
- Примечание
- Запись
в EEPROM занимает 3,3 мс. Память EEPROM обладает жизненным циклом 100
000 операций записи/стирания, поэтому данная функция, в отличие от
write()
, может сохранить время, если записываемые данные часто не меняются. - Пример
#include <EEPROM.h>
int address = 0;
void setup() {
}
void loop() {
int val = analogRead(0) / 4;
EEPROM.update(address, val);
address = address + 1;
if (address == EEPROM.length()) {
address = 0;
}
delay(100);
}
get()
- Описание
- Считывает любой тип данных или объект из EEPROM.
- Синтаксис
EEPROM.get(address, data)
- Параметры
address
: адрес для чтения, начинается с 0 (int
).
data
: данные для чтения, могут быть примитивным типом (например, float
) или пользовательской структурой struct
.- Возвращаемое значение
- Ссылка на переданные данные.
- Пример
#include <EEPROM.h>
void setup() {
float f = 0.00f;
int eeAddress = 0;
Serial.begin(9600);
while (!Serial) {
;
}
Serial.print("Read float from EEPROM: ");
EEPROM.get(eeAddress, f);
Serial.println(f, 3);
secondTest();
}
struct MyObject {
float field1;
byte field2;
char name[10];
};
void secondTest() {
int eeAddress = sizeof(float);
MyObject customVar;
EEPROM.get(eeAddress, customVar);
Serial.println("Read custom object from EEPROM: ");
Serial.println(customVar.field1);
Serial.println(customVar.field2);
Serial.println(customVar.name);
}
void loop() {
}
put()
- Описание
- Записывает любой тип данных или объект из EEPROM.
- Синтаксис
EEPROM.put(address, data)
- Параметры
address
: адрес для записи, начинается с 0 (int
).
data
: данные для записи, могут быть примитивным типом (например, float
) или пользовательской структурой struct
.- Возвращаемое значение
- Ссылка на переданные данные.
- Примечание
- Функция использует
EEPROM.update()
для реализации записи, поэтому она не перезаписывает значение, если оно не изменилось. - Пример
#include <EEPROM.h>
struct MyObject {
float field1;
byte field2;
char name[10];
};
void setup() {
Serial.begin(9600);
while (!Serial) {
;
}
float f = 123.456f;
int eeAddress = 0;
EEPROM.put(eeAddress, f);
Serial.println("Written float data type!");
MyObject customVar = {
3.14f,
65,
"Working!"
};
eeAddress += sizeof(float);
EEPROM.put(eeAddress, customVar);
Serial.print("Written custom data type! \n\nView the example sketch eeprom_get to see how you can retrieve the values!");
}
void loop() {
}
EEPROM[]
- Описание
- Данный оператор позволяет использовать идентификатор '
EEPROM
', как массив. Ячейки EEPROM могут быть прочитаны и записаны непосредственно с помощью этого оператора. - Синтаксис
EEPROM[address]
- Параметры
address
: адрес для чтения/записи, начинается с 0 (int
).- Возвращаемое значение
- Ссылка на ячейку EEPROM.
- Пример
#include <EEPROM.h>
void setup(){
unsigned char val;
val = EEPROM[ 0 ];
EEPROM[ 0 ] = val;
if( val == EEPROM[ 0 ] ){
}
}
void loop(){ }
Понравилась статья? Поделитесь ею с друзьями:
Комментарии
Войдите или Зарегистрируйтесь И Вы сможете общаться на форуме и оставлять комментарии без капчи.