
Библиотека eeprom для arduino обеспечивает взаимодействие с внутренней энергонезависимой памятью микроконтроллера на базе AVR в платах arduino. Библиотека предоставляет глобальную переменную EEPROM, которую необходимо использовать для доступа к методам класса.
Библиотека EEPROM входит в состав Arduino IDE. На всякий случай архив с библиотекой тут.
#include <EEPROM.h>
Подключение библиотеки. Добавляется в верхнюю часть скетча.
uint8_t read(address)
Возвращает один байт данных, который хранится по адресу address
.
uint8_t value = EEPROM.read(7);
void write(address, value)
Позволяет записать один байт данных value
в энергонезависимую память по адресу address
. Ничего не возвращает.
EEPROM.write(0, 111); EEPROM.write(1, 0x6F);
void update(address, value)
Похожа на функцию write
, но данные будут записаны при условии, что значение, на которое указывает адрес address
, отличается от значения value
. Помогает предотвратить ненужный износ ячеек памяти EEPROM. Ничего не возвращает.
EEPROM.update(0, 234); EEPROM.update(1, 0xEA);
put(address, object)
Позволяет записать любой объект object
по указанному адресу address
в EEPROM память. Пример eeprom_put
из библиотеки:
#include <EEPROM.h> // Подключение заголовочного файла библиотеки EEPROM struct MyObject { // Описание структуры MyObject с 3-мя полями float field1; // Поле field1 тип с плавающей точкой float (4 байта) byte field2; // Поле field2 тип безнаковый символьный unsigned char (он же uint8_t, он же byte, 1 байт) char name[10]; // Поле name массив из 10 элементов типа char (символьный тип) (10 байт) }; void setup() { Serial.begin(9600); // Иницализация последовательного порта while (!Serial) { ; // Ожидание открытия порта } float f = 123.456f; // Инициализация переменной, которая будет помещена в EEPROM int eeAddress = 0; // Адрес в памяти, где будет хранится вышеупомянутая переменная EEPROM.put(eeAddress, f); // Вызов функции put для записи переменной f в eeprom память Serial.println("Записан тип данных с плавающей точкой!"); MyObject customVar = { // Инициализация структуры MyObject, описанной выше 3.14f, // Полю field1 присваивается значение 3.14 65, // Полю field2 присваивается значение 65 "Working!" // Полю name присваиваются значения name[0] = "W"; name[1] = "o"; name[2] = "r"; name[3] = "k"; и т.д. name[8] = 0; name[9] = 0; }; /* * В нашем случае, тип float занимает 4 байта. Одна ячейка памяти может хранить 1 байт информации. * То есть переменная f занимает ячейки 0, 1, 2 и 3. Для того, чтобы не затереть переменную f, * необходимо "отступить" 4 ячейки (4 байта). Функция sizeof(float)вычисляет размер типа float в байтах. * Т.е. в выражении ниже происходит прибавление к переменной eeAddress (в которой хранится 0) результат * выполнения функции sizeof(float) (которая вернет 4) */ eeAddress += sizeof(float); // В конкретном случае, эквивалентно eeAddress = 4; EEPROM.put(eeAddress, customVar); // Запись структуры customVar в память, начиная с адреса 4 Serial.print("Записан пользовательский тип данных! \n\nПосмотрите пример eeprom_get, чтобы получить значения!"); } void loop() { /* Пустой цикл */ }
get(address, object)
Позволяет получить любой объект object
, записанный в EEPROM память по указанному адресу address
. Пример eeprom_get
из библиотеки:
#include <EEPROM.h> // Подключение заголовочного файла библиотеки EEPROM void setup() { float f = 0.00f; // Инициализация переменной f для хранения значения, считанного из памяти int eeAddress = 0; // Адрес памяти, с которого начинается чтение Serial.begin(9600); while (!Serial) { ; // Ожидание подключения последовательного порта } Serial.print("Чтение значения типа float из EEPROM: "); EEPROM.get(eeAddress, f); // Получение значение с плавающей точкой из памяти по адресу eeAddress = 0 Serial.println(f, 3); // Вывод значения переменной f в последовательный порт. Может выдать 'nan', если данные в памяти не являются значением с плавающей точкой. secondTest(); // Вызов функции secondTest } struct MyObject { // Описание структуры MyObject, также используется в примере eeprom_put для записи в память float field1; // Поле 1 - число с плавающей точкой byte field2; // Поле 2 - 1-байтная переменная char name[10]; // Поле 3 - массив из 10-ти элементов символьного типа }; void secondTest() { int eeAddress = sizeof(float); // Переместить адрес на следующий за числом с плавающей точкой (sizeof вычисляет количество байт, занимаемый тип float в памяти) MyObject customVar; // Переменная для хранения пользовательской структуры MyObject EEPROM.get(eeAddress, customVar); // Читаем из памяти Serial.println("Чтение пользовательского объекта из EEPROM: "); Serial.println(customVar.field1); // Выводим 1-е поле структуры MyObject Serial.println(customVar.field2); // Выводим 2-е поле структуры MyObject Serial.println(customVar.name); // Выводим 3-е поле структуры MyObject } void loop() { /* Пустой цикл */ }
unsigned int length()
Возвращает количество ячеек в EEPROM памяти.
#include "EEPROM.h" void setup() { Serial.begin(9600); while(!Serial); Serial.println(EEPROM.length()); } void loop() {}
EEPROM[address]
Этот оператор позволяет обращаться к памяти как к массиву. Ячейки eeprom можно считывать и записывать напрямую, указывая индекс как адрес address
ячейки памяти.
#include <EEPROM.h> uint8_t oldValue, newValue = 17; // Переменные для хранения переменных void setup() { Serial.begin(9600); // Инициализация последовательного порта while(!Serial); // Ждем открытия порта oldValue = EEPROM[0]; // Получаем значение с ячейки EEPROM Serial.print("В ячейке 0 сейчас хранится значение: "); Serial.println(oldValue); delay(500); Serial.println("Записываю новое значение в ячейку 0..."); EEPROM[0] = newValue; // Записываем новое значение delay(200); Serial.print("Теперь в ячейке 0 хранится значение: "); Serial.println(EEPROM[0]); delay(200); Serial.println("Возвращаю прежнее значение..."); EEPROM[0] = oldValue; // Возвращаем старое значение Serial.println("----------------------------"); } void loop() {}