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

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

/*
* Запись в EEPROM
*
* Сохраняет значения, считанные с аналогового входа 0, в EEPROM.
* Эти значения останутся в EEPROM после выключения платы
* и могут быть извлечены позже другим скетчем.
*/
#include <EEPROM.h> // Подключаем библиотеку для работы с EEPROM
/** Текущий адрес в EEPROM (т. е. байт, в который будем записывать данные следующим) **/
int addr = 0;
void setup() {
/** Пустая функция setup — здесь ничего не делаем **/
}
void loop() {
/***
Нужно разделить на 4, потому что аналоговые входы возвращают значения
от 0 до 1023, а каждый байт EEPROM может хранить только значение
от 0 до 255.
***/
int val = analogRead(0) / 4; // Считываем значение с аналогового входа A0 и делим на 4
/***
Записываем значение в соответствующий байт EEPROM.
Эти значения останутся там после выключения платы.
***/
EEPROM.write(addr, val); // Записываем значение val по адресу addr
/***
Переходим к следующему адресу; когда достигнем конца — возвращаем
Оглавление

/*
* Запись в EEPROM
*
* Сохраняет значения, считанные с аналогового входа 0, в EEPROM.
* Эти значения останутся в EEPROM после выключения платы
* и могут быть извлечены позже другим скетчем.
*/

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


/** Текущий адрес в EEPROM (т. е. байт, в который будем записывать данные следующим) **/
int addr = 0;

void setup() {
/** Пустая функция setup — здесь ничего не делаем **/
}

void loop() {
/***
Нужно разделить на 4, потому что аналоговые входы возвращают значения
от 0 до 1023, а каждый байт EEPROM может хранить только значение
от 0 до 255.
***/
int val = analogRead(0) / 4; // Считываем значение с аналогового входа A0 и делим на 4


/***
Записываем значение в соответствующий байт EEPROM.
Эти значения останутся там после выключения платы.
***/
EEPROM.write(addr, val); // Записываем значение val по адресу addr


/***
Переходим к следующему адресу; когда достигнем конца — возвращаемся в начало.


Разные AVR‑процессоры имеют разный объём EEPROM, например:
- Arduino Duemilanove: 512 Б;
- Arduino Uno: 1024 Б (1 КБ);
- Arduino Mega: 4096 Б (4 КБ).

Вместо жёсткого задания размера используем встроенную функцию length(),
чтобы код работал на всех AVR‑процессорах.
***/
addr = addr + 1; // Увеличиваем адрес на 1
if (addr == EEPROM.length()) { // Если достигли конца EEPROM
addr = 0; // Возвращаемся к началу (адрес 0)
}

/***
Поскольку размеры EEPROM — степени двойки, перенос адреса (предотвращение переполнения)
можно сделать с помощью битовой операции «И» с длиной −1.

++addr &= EEPROM.length() - 1;
***/

delay(100); // Ждём 100 мс перед следующей итерацией
}

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

  1. #include <EEPROM.h>
    Подключает библиотеку EEPROM, необходимую для работы с энергонезависимой памятью микроконтроллера.
  2. int addr = 0;
    Глобальная переменная, хранящая текущий адрес в EEPROM, куда будут записываться данные (начинаем с 0).
  3. void setup()
    Пустая функция, выполняемая один раз при запуске программы. В данном скетче не требует инициализации.
  4. void loop()
    Функция, выполняющаяся непрерывно после setup():
    int val = analogRead(0) / 4;
    Считывает значение с аналогового входа A0 (диапазон 0–1023) и делит на 4, чтобы уместить в диапазон 0–255 (один байт EEPROM).
    EEPROM.write(addr, val);
    Записывает значение val в EEPROM по адресу addr. В отличие от EEPROM.update(), эта функция
    всегда перезаписывает ячейку, даже если значение не изменилось.
    addr = addr + 1;
    Увеличивает адрес на 1 для перехода к следующей ячейке.
    if (addr == EEPROM.length()) { addr = 0; }
    Если достигли конца EEPROM (адрес равен длине памяти), сбрасывает адрес в 0 (циклическая запись).
    delay(100);
    Ждёт 100 мс перед следующей итерацией, чтобы не перегружать EEPROM частыми записями.
  5. Комментарии о работе с EEPROM
    EEPROM.length()

    Возвращает размер EEPROM в байтах (зависит от модели платы). Использование этой функции делает код переносимым между разными AVR‑микроконтроллерами.
    EEPROM.write()
    Всегда перезаписывает ячейку, даже если значение не изменилось. Это
    сокращает ресурс EEPROM (обычно ~100 000 циклов записи). Для экономии ресурса лучше использовать EEPROM.update().
    Битовая операция ++addr &= EEPROM.length() - 1
    Альтернативный способ циклического увеличения адреса (работает только если размер EEPROM — степень двойки).

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

  • Аналоговый вход → EEPROM: значение с A0 масштабируется (/4) для соответствия диапазону байта.
  • Перезапись без проверки: EEPROM.write() перезаписывает ячейку всегда, что ускоряет износ памяти.
  • Циклическая запись: после последнего байта адрес возвращается в 0.
  • Переносимость кода: использование EEPROM.length() вместо жёстких чисел позволяет работать с разными платами.
  • Рекомендация: для продления срока службы EEPROM используйте EEPROM.update() вместо EEPROM.write(), если значение может не меняться.