/***
Пример использования EEPROM.get()
Показывает, как применять метод EEPROM.get().
Чтобы заранее задать данные в EEPROM, запустите пример eeprom_put.
Этот скетч будет работать и без него, но тогда будут показаны данные,
которые уже есть в EEPROM.
Это может привести к выводу «мусора» в последовательный порт,
если в одной из загруженных строк нет нулевого символа.
Автор: Кристофер Эндрюс (Christopher Andrews), 2015
Лицензия: MIT
***/
#include <EEPROM.h> // Подключаем библиотеку для работы с EEPROM
void setup() {
float f = 0.00f; // Переменная для хранения данных, считанных из EEPROM
int eeAddress = 0; // Адрес в EEPROM, с которого начинаем чтение
Serial.begin(9600); // Инициализируем последовательный порт (скорость 9600 бод)
while (!Serial) { // Ждём подключения последовательного порта (актуально для встроенных USB‑портов)
; // Пустой цикл — ждём, пока порт станет доступен
}
Serial.print("Чтение float из EEPROM: "); // Выводим подсказку в монитор порта
// Считываем данные типа float из EEPROM по адресу eeAddress
EEPROM.get(eeAddress, f);
// Выводим считанное значение с точностью до 3 знаков после запятой
// Если данные в EEPROM не являются корректным float, может вывестись «ovf» или «nan»
Serial.println(f, 3);
/***
Поскольку EEPROM.get() возвращает ссылку на переменную f,
можно использовать его напрямую в Serial.print(), например:
Serial.print( EEPROM.get( eeAddress, f ) );
***/
/***
Метод get() можно использовать и с пользовательскими структурами.
Этот фрагмент вынесен в отдельную функцию.
***/
secondTest(); // Запускаем следующий тест
}
// Определяем пользовательскую структуру
struct MyObject {
float field1; // Поле типа float
byte field2; // Поле типа byte
char name[10]; // Массив символов (строка) длиной 10
};
// Функция для чтения пользовательской структуры из EEPROM
void secondTest() {
// Перемещаем адрес на следующий байт после float 'f'
int eeAddress = sizeof(float);
MyObject customVar; // Переменная для хранения считанной структуры
// Считываем структуру из EEPROM по адресу eeAddress
EEPROM.get(eeAddress, customVar);
// Выводим сообщение о чтении структуры
Serial.println("Чтение пользовательской структуры из EEPROM: ");
// Последовательно выводим поля структуры
Serial.println(customVar.field1); // Значение поля field1
Serial.println(customVar.field2); // Значение поля field2
Serial.println(customVar.name); // Строка name
}
void loop() {
/* Пустой цикл — после setup() программа ничего не делает */
}
Пояснение к коду
- #include <EEPROM.h>
Подключает библиотеку для работы с энергонезависимой памятью EEPROM микроконтроллера. - void setup()
Функция, выполняемая один раз при запуске программы:
float f = 0.00f; — создаёт переменную для хранения значения типа float, считанного из EEPROM.
int eeAddress = 0; — задаёт начальный адрес в EEPROM для чтения данных.
Serial.begin(9600); — инициализирует последовательный порт со скоростью 9600 бод для вывода данных.
while (!Serial) — ждёт подключения последовательного порта (важно для плат с встроенным USB).
Serial.print("Чтение float из EEPROM: ") — выводит подсказку в монитор порта.
EEPROM.get(eeAddress, f) — считывает значение типа float из EEPROM по указанному адресу и сохраняет в переменную f.
Serial.println(f, 3) — выводит считанное значение f с точностью до трёх знаков после запятой. Если данные в EEPROM некорректны, могут появиться значения ovf (переполнение) или nan (не число).
secondTest(); — вызывает функцию secondTest() для выполнения следующего теста. - struct MyObject
Определяет пользовательскую структуру с тремя полями:
float field1 — число с плавающей точкой;
byte field2 — однобайтовое целое число;
char name[10] — массив из 10 символов (строка). - void secondTest()
Функция для чтения пользовательской структуры из EEPROM:
int eeAddress = sizeof(float); — устанавливает адрес для чтения, смещая его на размер типа float (чтобы не перекрывать ранее считанные данные).
MyObject customVar; — создаёт переменную для хранения структуры, считанной из EEPROM.
EEPROM.get(eeAddress, customVar); — считывает структуру из EEPROM по указанному адресу.
Serial.println(...) — последовательно выводит значения полей структуры (field1, field2, name) в монитор порта. - void loop()
Пустой цикл, так как после setup() программа не выполняет дополнительных действий.