Arduino: библиотека EEPROM |
![]() |
Добавил(а) microsin |
EEPROM это энергонезависимая память (nonvolatile memory), т. е. она может сохранить свое содержимое после выключения питания устройства. Микроконтроллер (MCU) на платах Arduino и Genuino, основанных на AVR, обладают встроенной памятью EEPROM. Она хранит свои значения, когда питание платы выключено (это работает наподобие маленького HDD). Библиотека EEPROM позволяет читать и записывать байты EEPROM. Поддерживаемые MCU на различных платах Arduino и Genuino имеют на борту разный объем памяти EEPROM: 1024 байт на ATmega328P, 512 байт на ATmega168 и ATmega8, 4 килобайта (4096 байт) на ATmega1280 и ATmega2560. Платы Arduino и Genuino 101 эмулируют EEPROM на основе FLASH на области размером 1024 байт. Для использования функций библиотеки нужно подключить заголовочный файл EEPROM.h в начале скетча: #include < EEPROM.h>
Примеры можно найти в документации [2]. Во врезках ниже приведено подробное описание функций библиотеки. Считывает байт из EEPROM. Ячейки, в которых ничего не было записано, имеют значение 255 (0xFF). В качестве параметра передается адрес ячейки. Синтаксис: EEPROM.read(address) Пример использования: #include < EEPROM.h>
int a = 0; int value;
void setup() { Serial.begin(9600); } void loop() { value = EEPROM.read(a); Serial.print(a); Serial.print("\t"); Serial.print(value); Serial.println(); a = a + 1; if (a == 512) a = 0; delay(500); } Запишет байт в EEPROM. В качестве параметров передается адрес ячейки и значение записываемого байта. Функция ничего не возвращает. Синтаксис: EEPROM.write(address, value) Замечание: запись в EEPROM занимает 3.3 мс. Память EEPROM имеет запас по устойчивости 100000 циклов запись/стирание, так что нужно быть осторожным при записи, не следует слишком часто записывать в EEPROM. Пример использования: #include < EEPROM.h>
void setup() { for (int i = 0; i < 255; i++) EEPROM.write(i, i); } void loop() { } Запишет байт в EEPROM. Значение будет записано только в том случае, если оно отличается от уже записанного по тому же адресу. Синтаксис такой же, как у функции write: EEPROM.update(address, value) Использование функции update вместо write позволяет экономить ресурс EEPROM, если записываемые данные меняются не часто. Пример использования: #include < EEPROM.h>
void setup() { for (int i = 0; i < 255; i++) { // Здесь будет выполняться запись точно так же, // как и при EEPROM.write(i, i). EEPROM.update(i, i); } for (int i = 0; i < 255; i++) { // Запись "12" в ячейку 3 произойдет только первый раз, // остальные 254 раза запись производиться не будет. EEPROM.update(3, 12); } } void loop() { } Прочитает из EEPROM объект любого типа. Параметром data может быть любой тип, например float, или даже пользовательская структура данных. Возвращаемое значение - указатель на данные переданного объекта. Синтаксис: EEPROM.get(address, data) Пример использования: #include < EEPROM.h>
struct MyObject { float field1; byte field2; char name[10]; }; void setup() { float f = 0.00f; // переменная для хранения данных, прочитанных из EEPROM. int eeAddress = 0; // адрес EEPROM, откуда начинается чтение Serial.begin( 9600 ); while (!Serial) { ; // ожидание соединения с портом. Это нужно только для плат Leonardo. } Serial.print( "Read float from EEPROM: " ); // Извлечение данных float из EEPROM в позиции eeAddress: EEPROM.get( eeAddress, f ); // Это может вывести на печать 'ovf, nan', если данные в EEPROM имеют // неправильный формат: Serial.println( f, 3 ); // get() также можно использовать для чтения в пользовательскую структуру. eeAddress = sizeof(float); // перемещение адреса за следующий байт // после float 'f' MyObject customVar; // Переменная для сохранения пользовательского объекта, // который считывается из EEPROM. 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(){ /* пустой цикл */ } Запишет в EEPROM данные любого типа. В параметрах передается адрес EEPROM и объект, содержащий записываемые данные. Функция возвратит указатель на данные записываемого объекта. Синтаксис: EEPROM.put(address, data) Примечание: функция put использует EEPROM.update() для выполнения записи, поэтому она не перезаписывает значение, если оно не поменялось. Пример использования: #include < EEPROM.h>
struct MyObject { float field1; byte field2; char name[10]; }; void setup() { Serial.begin(9600); while (!Serial) { ; // ожидание соединения с последовательным портом. Это нужно // только для плат со встроенным портом USB. } float f = 123.456f; // Переменная для сохранения в EEPROM. int eeAddress = 0; // Адрес ячейки, куда мы хотим сохранить данные. EEPROM.put(eeAddress, f);
Serial.println("Written float data type!");
/** Функция put была разработана так, чтобы можно было сохранять
и пользовательские структуры. **/
// Данные пользователя для сохранения: MyObject customVar = { 3.14f, 65, "Working!" }; eeAddress += sizeof(float); // перемещение адреса за следующий байт // после float 'f' EEPROM.put(eeAddress, customVar); Serial.print("Written custom data type!\n"); Serial.print("View the example sketch eeprom_get\n") Serial.print(" to see how you can retrieve the values!"); } void loop(){ /* пустой цикл */ } Этот оператор позволяет использовать идентификатор EEPROM наподобие массива. Этим методом можно напрямую читать и записывать ячейки EEPROM. EEPROM[address] возвратит ссылку на ячейку EEPROM с адресом address. Пример использования: #include < EEPROM.h>
void setup() { unsigned char val; // Чтение первой ячейки EEPROM: val = EEPROM[0]; // Запись первой ячейки EEPROM: EEPROM[0] = val; // Сравнение содержимого EEPROM с оригинальной переменной: if( val == EEPROM[0] ) { // Тут какие-нибудь действия... } } void loop(){ /* пустой цикл */ } [Ссылки] 1. EEPROM Library site:docs.arduino.cc. |