Найти в Дзене
IOT ENTERPRISE ©

EEPROM запись данных в память ARDUINO

/***
Пример использования EEPROM.put()
Показывает, как применять метод EEPROM.put().
Также этот скетч заранее задаёт данные в EEPROM для примера eeprom_get.
Обратите внимание: в отличие от однобайтовой версии EEPROM.write(),
метод put использует семантику обновления. То есть байт будет записан
в EEPROM только если данные фактически изменились.
Автор: Кристофер Эндрюс (Christopher Andrews), 2015
Лицензия: MIT
***/
#include <EEPROM.h> // Подключаем библиотеку для работы с EEPROM
// Определяем пользовательскую структуру
struct MyObject {
float field1; // Поле типа float
byte field2; // Поле типа byte
char name[10]; // Массив символов (строка) длиной 10
};
void setup() {
Serial.begin(9600); // Инициализируем последовательный порт (скорость 9600 бод)
while (!Serial) { // Ждём подключения последовательного порта (актуально для встроенных USB‑портов)
; // Пустой цикл — ждём, пока порт станет доступен
}
fl
Оглавление

/***
Пример использования EEPROM.put()


Показывает, как применять метод EEPROM.put().
Также этот скетч заранее задаёт данные в EEPROM для примера eeprom_get.


Обратите внимание: в отличие от однобайтовой версии EEPROM.write(),
метод put использует семантику обновления. То есть байт будет записан
в EEPROM только если данные фактически изменились.


Автор: Кристофер Эндрюс (Christopher Andrews), 2015
Лицензия: MIT
***/

#include <EEPROM.h> // Подключаем библиотеку для работы с EEPROM


// Определяем пользовательскую структуру
struct MyObject {
float field1; // Поле типа float
byte field2; // Поле типа byte
char name[10]; // Массив символов (строка) длиной 10
};

void setup() {
Serial.begin(9600); // Инициализируем последовательный порт (скорость 9600 бод)

while (!Serial) { // Ждём подключения последовательного порта (актуально для встроенных USB‑портов)
; // Пустой цикл — ждём, пока порт станет доступен
}

float f = 123.456f; // Переменная с данными, которые будем сохранять в EEPROM
int eeAddress = 0; // Адрес в EEPROM, куда будем записывать данные


// Один простой вызов: сначала адрес, потом объект
EEPROM.put(eeAddress, f);

Serial.println("Записано значение типа float!"); // Сообщаем о записи


/** Метод put также предназначен для работы с пользовательскими структурами. **/


// Данные для сохранения (заполняем структуру)
MyObject customVar = {
3.14f, // Значение для field1
65, // Значение для field2
"Working!" // Строка для name
};

eeAddress += sizeof(float); // Сдвигаем адрес на размер типа float (чтобы не перекрывать предыдущие данные)


EEPROM.put(eeAddress, customVar); // Записываем структуру в EEPROM

// Выводим сообщение о записи и подсказку посмотреть пример eeprom_get
Serial.print("Записан пользовательский тип данных! \n\nПосмотрите пример eeprom_get, чтобы увидеть, как извлечь сохранённые значения!");
}


void loop() {
/* Пустой цикл — после setup() программа ничего не делает */
}

Пояснение к коду

  1. #include <EEPROM.h>
    Подключает библиотеку EEPROM, необходимую для работы с энергонезависимой памятью микроконтроллера.
  2. struct MyObject
    Определяет пользовательскую структуру с тремя полями:
    float field1 — число с плавающей точкой;
    byte field2 — однобайтовое целое число;
    char name[10] — массив из 10 символов (строка).
  3. void setup()
    Функция, выполняемая один раз при запуске программы.
    Serial.begin(9600); — инициализирует последовательный порт со скоростью 9600 бод для вывода данных.
    while (!Serial) — ждёт подключения последовательного порта (важно для плат с встроенным USB).
    float f = 123.456f; — создаёт переменную с значением типа float, которое будет записано в EEPROM.
    int eeAddress = 0; — задаёт начальный адрес в EEPROM для записи данных.
    EEPROM.put(eeAddress, f); — записывает значение f в EEPROM по адресу eeAddress. Метод put автоматически определяет размер данных и записывает их только если они отличаются от текущих (экономит ресурс памяти).
    Serial.println("Записано значение типа float!"); — выводит сообщение о успешной записи float.
    MyObject customVar = { ... }; — создаёт и заполняет структуру MyObject тестовыми данными.
    eeAddress += sizeof(float); — сдвигает адрес записи на размер типа float (чтобы следующая запись не перекрыла предыдущую).
    EEPROM.put(eeAddress, customVar); — записывает структуру customVar в EEPROM по новому адресу.
    Serial.print(...) — выводит сообщение о записи структуры и подсказку посмотреть пример eeprom_get для чтения данных.
  4. void loop()
    Пустой цикл, так как после setup() программа не выполняет дополнительных действий.

Ключевые моменты

  • EEPROM.put(address, data) — записывает данные любого типа в EEPROM по указанному адресу. Автоматически вычисляет размер данных и использует семантику обновления (записывает только если данные изменились).
  • sizeof(тип) — возвращает размер типа данных в байтах (используется для корректного смещения адреса при записи нескольких объектов).
  • EEPROM.length() — возвращает общий размер EEPROM в байтах (зависит от модели платы).
  • Метод put предпочтительнее EEPROM.write() при работе с многобайтными типами (float, структуры), так как экономит ресурс памяти за счёт проверки изменений.