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

EEPROM чтение из памяти ARDUINO

/*
* Чтение из EEPROM
*
* Считывает значение каждого байта из EEPROM и выводит его
* на компьютер.
* Этот пример кода находится в общественном достоянии.
*/
#include <EEPROM.h> // Подключаем библиотеку для работы с EEPROM
// Начинаем чтение с первого байта (адрес 0) EEPROM
int address = 0; // Переменная для хранения текущего адреса в EEPROM
byte value; // Переменная для хранения считанного значения
void setup() {
// Инициализируем последовательный порт и ждём его открытия
Serial.begin(9600); // Запускаем Serial со скоростью 9600 бод
while (!Serial) { // Ждём подключения последовательного порта (актуально для встроенных USB‑портов)
; // Пустой цикл — ждём, пока порт станет доступен
}
}
void loop() {
// Считываем байт из текущего адреса EEPROM
value = EEPROM.read(address);
// Выводим адрес и значение в монитор порта
Serial.print(address); // Печатаем текущий адрес
Serial.print("\t"); // Печатаем табуляцию (разделитель)
Ser
Оглавление

/*
* Чтение из EEPROM
*
* Считывает значение каждого байта из EEPROM и выводит его
* на компьютер.
* Этот пример кода находится в общественном достоянии.
*/

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

// Начинаем чтение с первого байта (адрес 0) EEPROM
int address = 0; // Переменная для хранения текущего адреса в EEPROM
byte value; // Переменная для хранения считанного значения

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

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

void loop() {
// Считываем байт из текущего адреса EEPROM
value = EEPROM.read(address);

// Выводим адрес и значение в монитор порта
Serial.print(address); // Печатаем текущий адрес
Serial.print("\t"); // Печатаем табуляцию (разделитель)
Serial.print(value, DEC); // Печатаем значение в десятичном формате
Serial.println(); // Переводим строку

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

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

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

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

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

delay(500); // Ждём 500 мс перед следующим чтением (чтобы не перегружать монитор порта)
}

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

  1. #include <EEPROM.h>
    Подключает библиотеку EEPROM, необходимую для работы с энергонезависимой памятью микроконтроллера.
  2. Глобальные переменные
    int address = 0; — хранит текущий адрес в EEPROM, с которого будет производиться чтение (начинаем с 0).
    byte value; — переменная для хранения считанного байта из EEPROM.
  3. void setup()
    Функция, выполняемая один раз при запуске программы:
    Serial.begin(9600); — инициализирует последовательный порт со скоростью 9600 бод для вывода данных.
    while (!Serial) — ждёт подключения последовательного порта (важно для плат с встроенным USB).
  4. void loop()
    Функция, выполняющаяся непрерывно после setup():
    value = EEPROM.read(address); — считывает байт из EEPROM по текущему адресу address и сохраняет в переменную value.
    Serial.print(address); — выводит текущий адрес в монитор порта.
    Serial.print("\t"); — выводит табуляцию для разделения столбцов (адрес и значение).
    Serial.print(value, DEC); — выводит значение байта в десятичном формате.
    Serial.println(); — переводит строку (готовит вывод для следующей итерации).
    address = address + 1; — увеличивает адрес на 1 для перехода к следующей ячейке.
    if (address == EEPROM.length()) { address = 0; } — если достигли конца EEPROM (адрес равен длине памяти), возвращаемся к началу (адрес 0).
    delay(500); — задержка 500 мс между итерациями, чтобы вывод в монитор порта был читаемым.
  5. Комментарии о переносимости кода
    EEPROM.length() — возвращает размер EEPROM в байтах (зависит от модели платы). Использование этой функции делает код переносимым между разными AVR‑микроконтроллерами.
    Битовая операция ++address &= EEPROM.length() - 1 — альтернативный способ «зацикливания» адреса (работает только если размер EEPROM — степень двойки).

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

  • EEPROM.read(адрес) — считывает один байт из указанного адреса памяти.
  • Serial-вывод — данные выводятся в формате «адрес → значение» (например, 0 255).
  • Циклическое чтение — после последнего байта адрес сбрасывается в 0, и чтение продолжается заново.
  • Задержка delay(500) — делает вывод в монитор порта удобным для восприятия.