Энергонезависимая память Arduino
Понятия
EEPROM или энергонезависимая память - память, которая может стираться и записываться большое количество раз, при этом данные в такой памяти хранятся независимо от питания контроллера.
Размер памяти EEPROM различается в зависимости от типа контроллера. Размер памяти у популярных контроллеров обозначен в таблице ниже.
Наименование платы | Наименование контроллера | Объём памяти |
---|---|---|
Arduino UNO | ATmega328 | 1 Кб |
Smart UNO | ATmega328 | 1 Кб |
Arduino Mega | ATmega2560 | 4 Кб |
Smart Mega | ATmega2560 | 4 Кб |
Arduino Leonardo | ATmega32u4 | 1 Кб |
Smart Leonardo | ATmega32u4 | 1 Кб |
Arduino Due | AT91SAM3X8E | нет EEPROM |
Nano, Pro Mini | ATmega328 | 1 Кб |
Pro Micro | ATmega32u4 | 1 Кб |
Обратите внимание, что на контроллерах Arduino Due EEPROM-память отсутствует. Запись возможна только во Flash-память.
Внимание! Производитель заявляет, что память EEPROM имеет жизненный цикл в 100000 раз записи/стирания, хранение информации возможно до 100 лет при температуре 25°С. Чтение данных ограничений не имеет. В связи с этим, старайтесь осторожнее относиться к операциям записи и стирания в своих скетчах. Минимальное время, требуемое для процесса записи в память составляет 3,3 мс. При использовании библиотеки EEPROM в среде Arduino эта особенность уже учтена в коде библиотеки, поэтому дополнительно закладывать время на запись не требуется.
В Arduino IDE уже встроена библиотека для работы с энергонезависимой памятью - EEPROM.
Примеры работы
Запись байта данных. write()
Для того чтобы записать байт данных в требуемую ячейку памяти, необходимо вызвать метод write()
#include <EEPROM.h> //подключение библиотеки для работы с энергонезависимой памятью int address = 0; //адрес ячейки памяти для записи данных byte value = 111; //значение для записи в ячейку void setup() { EEPROM.write(address, value); //запись данных value в ячейку по адресу address } void loop() { }
Обновление данных. update()
Так как память имеет ограниченное число циклов записи, лучше пользоваться методом update() для записи данных. В отличии от write() он записывает данные, только в случае, если они отличаются от уже сохранённых.
#include <EEPROM.h> //подключение библиотеки для работы с энергонезависимой памятью int address = 0; //адрес ячейки памяти для записи данных byte value = 111; //значение для записи в ячейку void setup() { EEPROM.update(address, value); //обновление данных value в ячейке по адресу address } void loop() { }
Запись произвольного типа данных. put()
В отличии от метода write(), который позволяет сохранить байт данных, существует метод put(), который расширяет возможности до записи произвольных значений: примитивных типов (например, int или float) или пользовательских структур. Однако, следует внимательнее работать с данным методом, потому как с помощью него запись происходит не в одну конкретную ячейку, а в ряд ячеек.
#include <EEPROM.h> //подключение библиотеки для работы с энергонезависимой памятью int address = 10; //адрес ячейки памяти для записи данных float value = 36.6; //значение для записи в ячейку void setup() { EEPROM.put(address, value); //запись данных value типа float в ячейки, начиная с address } void loop() { }
Чтение произвольного типа данных. get()
Для того чтобы получить данные, записанные методом put() (прочитать информацию из ряда ячеек), нужно воспользоваться методом get().
#include <EEPROM.h> //подключение библиотеки для работы с энергонезависимой памятью int address = 10; //адрес ячейки памяти для записи данных float value = 0.0; //значение для чтения из ячейки void setup() { Serial.begin(9600); //инициализация монитора Serial-потра EEPROM.get(address, value); //получение данных value типа float из ячейки, начиная с address Serial.println(value, 1); //вывести число с одним знаком после запятой } void loop() { }
Чтение из ячейки памяти. read()
Для чтения данных из определенной ячейки памяти нужно воспользоваться методом read().
#include <EEPROM.h> //подключение библиотеки для работы с энергонезависимой памятью int address = 0; //адрес ячейки памяти для чтения данных byte value = 0; //значение для чтения из ячейки void setup() { Serial.begin(9600); //инициализация монитора Serial-порта value = EEPROM.read(address); //чтение данных в value из ячейки по адресу address Serial.println(value); //вывести данные } void loop() { }
Чтение всех данных из памяти. Определение размера памяти. length()
Так как в разных контроллерах различное количество встроенной памяти, можно прочитать данные всех ячеек, перед этим определив размер данных. Для этого следует воспользоваться методом length().
#include <EEPROM.h> //подключение библиотеки для работы с энергонезависимой памятью int address = 0; //адрес ячейки памяти для чтения данных byte value = 0; //значение для чтения из ячейки void setup() { Serial.begin(9600); //инициализация монитора Serial-потра int memory_size = EEPROM.length(); //вычисление объёма памяти while (address < memory_size) { //цикл по ячейкам памяти value = EEPROM.read(address); //запись данных value в ячейку по адресу address Serial.println(value); //вывести значение address++; //увеличение адреса читаемой ячейки } } void loop() { }
Обратите внимание, что ячейки памяти, которые изначально не содержали данных, имеют значение 255