Перейти к содержанию

EEPROM Ардуино: что это, пример использования

Arduino EEPROM работа с памятью: запись, чтение, очистка

Энергонезависимая память EEPROM Arduino может использоваться для хранения важных данных во время выполнения программы. Например, в ней можно сохранить настройки и системные параметры. Тогда даже при отключении питания, данные из еепром не потеряются, поскольку это энергонезависимая память. Рассмотрим работу с EEPROM на примерах записи и чтения данных с помощью команд библиотеки EEPROM.h.

Необходимые компоненты:

  • Arduino Uno / Arduino Nano / Arduino Mega

Дополнительные материалы на эту тему:

  1. Перезагрузка Ардуино программно, командой
  2. Прерывания в Ардуино для начинающих
  3. Обзор микроконтроллеров семейства Arduino

EEPROM — это тип полупроводниковой памяти, который позволяет осуществлять чтение, запись и стирание данных с помощью электрических сигналов. Сохраняет данные даже при отсутствии питания. EEPROM память используется в различных устройствах, таких как цифровые камеры, игровые консоли, мобильные телефоны и компьютеры, для хранения информации о настройках, конфигурации и другой служебной информации.

Память EEPROM Arduino что это такое?

Arduino EEPROM работа с памятью: запись, чтение, очистка

Память EEPROM (Electrically Erasable Programmable Read-Only Memory) в Arduino — это энергонезависимая память, которая может сохранять информацию в течение десятилетий после отключения питания. Ячейки в памяти EEPROM могут быть перезаписаны несколько сотен тысяч раз при температуре не ниже 24°C и могут быть прочитаны в любой момент. Емкость памяти EEPROM в самых популярных платах Arduino следующая:

ATmega168 (Arduino Nano) — 512 байт;
ATmega328 (Arduino Uno или Arduino Nano) — 1 Кбайт;
ATmega1280, ATmega2560 (Arduino Mega) — 4 Кбайт.

Запись одного байта в EEPROM занимает примерно 3,3 микросекунды, а чтение байта — примерно 0,4 мкс. Каждый байт (ячейка) в ЕЕПРОМ Ардуино по умолчанию имеет значение 255 (т.е. в ячейку еще не записывали данные). Заметим, что если данные занимают более одного байта пространства (например, число больше 255), то они разбиваются на несколько ячеек. Это важно учитывать при записи больших чисел или строк.

Команды библиотеки EEPROM.h Arduino с описанием

Функция

Краткое описание

read()
EEPROM.read(address)
Считывает один байт из EEPROM Arduino по адресу address
write()
EEPROM.write(address, value)
Записывает один байт со значением value в EEPROM по адресу address
update()
EEPROM.update(address, value)
Аналог функции write(), но новые данные в ячейку записываются только тогда, когда они отличаются от уже записанного. Использование данной функции позволяет продлить жизнь памяти EEPROM.
get()
EEPROM.get(address, data)
Считывает из EEPROM Arduino любой тип данных по адресу address. При этом данные (data) могут быть любого типа, например, int или float.
put()
EEPROM.put(address, data)
Записывает в EEPROM Arduino любой тип данных по адресу address. Функция записывает в ячейку только отличающиеся данные.
EEPROM[]
EEPROM[address]
Позволяет обращаться с байтами EEPROM Arduino как с массивом. Байты можно считывать и записывать.

Запись, чтение и очистка памяти EEPROM Arduino

Arduino Uno r3 распиновка, характеристики, схема

Подключите к компьютеру любую плату Arduino и загрузите следующий скетч. После открытия монитора порта Arduino IDE вы узнаете информацию о размере памяти ЕЕПРОМ в байтах, а также вывод информации о содержимом каждой ячейки. Если память eeprom еще не использовалась, то значение каждой ячейки будет равным 255. Если вы работаете с микроконтроллером на базе ATmega168, то цикл while закончится на 512 ячейке.

Скетч для чтения из памяти EEPROM.read() Arduino


#include "EEPROM.h"
int address;
byte value;

void setup() {
  Serial.begin(9600);
 
  // узнаем размер энергонезависимой памяти в байтах
  Serial.println(EEPROM.length());
  delay(1000);
 
  // выводим на монитор порта значение из каждой ячейки
  while (address < EEPROM.length()) {
    value = EEPROM.read(address);
    Serial.print("Address: " + String(address));
    Serial.println(", value: " + String(value));
    address++;
    delay(100);
  }
}

void loop() {

}

Следующая программа при каждой перезагрузке микроконтроллера будет записывать в 10 ячейку значение 100 — команда EEPROM.write(10, 100); В отличии от этой команды, следующая функция — EEPROM.update(20, 100); запишет информацию в 20 ячейку только один раз. Так как ресурс памяти все же ограничен, то лучше использовать команду EEPROM.update(). Подключите к компьютеру Ардуино и загрузите следующий скетч.

Скетч для записи EEPROM.write() и EEPROM.update()

#include "EEPROM.h"
int address;
byte value;

void setup() {
  Serial.begin(9600);
 
  // узнаем размер энергонезависимой памяти в байтах
  Serial.println(EEPROM.length());
  delay(1000);
 
  // записываем в 10 ячейку значение "100"
  EEPROM.write(10, 100);
 
  // перезаписываем 20 ячейку со значением "100"
  EEPROM.update(20, 100);
  delay(1000);
 
  // выводим на монитор порта значение из каждой ячейки
  while (address < EEPROM.length()) {
    value = EEPROM.read(address);
    Serial.print("Address: " + String(address));
    Serial.println(", value: " + String(value));
    address++;
    delay(100);
  }
}

void loop() {

}

Чтобы очистить энергонезависимую память EEPROM Arduino (вернуть EEPROM к заводским настройкам), необходимо переписать все ячейки в памяти со значением 255. Для этого можно использовать в программе цикл for или while. Простой пример программы для стирания EEPROM в плате Arduino показан ниже. Это довольно простой скетч для стирания всей информации из энергонезависимой памяти микроконтроллера Ардуино.

Скетч для очистки памяти EEPROM в плате Arduino

#include "EEPROM.h"
int address;

void setup() {
   // перезаписываем все ячейки в памяти еепром
   while (address < EEPROM.length()) {
      EEPROM.update(address, 255);
      address++;
   }
}
 
void loop() {
 
}

Пример использования памяти EEPROM Arduino

Рассмотрим пример программы, когда в EEPROM Arduino требуется сохранить число больше, чем 255. Например, число 999 для записи в EEPROM следует разделить на множитель (старший байт) и недостающее число (младший байт). Таким образом, число 999 займет в памяти две ячейки т.е. 999 = 3×256 + 231. Для вывода числа на монитор порта, его необходимо будет предварительно «собрать» с помощью функции word().

#include "EEPROM.h"

// число которое требуется сохранить в еепром
int num = 999;

void setup() {
  Serial.begin(9600);

  // раскладываем число 999 на старший и младший байт
  byte hi  = highByte(num);
  byte low = lowByte(num);

  // сохраняем старший байт в 1 ячейке, младший байт во 2 ячейке
  EEPROM.update(1, hi);
  EEPROM.update(2, low);

  delay(1000);

  // читаем информацию с 1 и 2 ячейки еепром
  byte val1 = EEPROM.read(1);
  byte val2 = EEPROM.read(2);

  Serial.println("highByte - "+String(val1));
  Serial.println("lowByte  - "+String(val2));

  // собираем число 999 и выводим на монитор порта
  int NUM = word(hi, low);
  Serial.println("int num  - "+String(NUM));
}

void loop() {
 
}

Как сохранить в EEPROM float, long, unsigned long

При работе с этими переменными следует учитывать, что они занимают четыре ячейки памяти в EEPROM. Про этот факт не надо забывать, если вы решите сохранить в энергонезависимой памяти другие данные. Например, если вы хотите сохранить переменную float, long или unsigned long в ячейке «0» ЕЕПРОМ, то нельзя будет использовать 1, 2 и 3 ячейки памяти. Загрузите следующий пример в микроконтроллер.

Скетч для записи float, long, unsigned long в EEPROM

#include "EEPROM.h"

float data1 = 231.50; // переменная которую сохраним в ЕЕПРОМ
float data2;

void setup() {
  Serial.begin(9600);

  // сохраняем переменную в ЕЕПРОМ, начиная с ячейки "0"
  float_write(0, data1);
  delay(1000);

  // читаем переменную, начиная с ячейки "0" и выводим на монитор
  data2 = float_read(0);
  Serial.println("data2 = " + String(data2));
}

void loop() {
}

// функция для записи float в ЕЕПРОМ
void float_write(int addr, float val) {
  byte *x = (byte *)&val;
  for (byte i = 0; i < 4; i++) EEPROM.write(i + addr, x[i]);
}

// функция для чтения float из ЕЕПРОМ
float float_read(int addr) {
  byte x[4];
  for (byte i = 0; i < 4; i++) x[i] = EEPROM.read(i + addr);
  float *y = (float *)&x;
  return y[0];
}

Функцию записи void float_write() и чтения float float_read() можно вызывать из любого места программы. Если вам необходимо сохранить в ЕЕПРОМ переменную long или unsigned long, то следует изменить во всем скетче тип данных float на нужный тип.

Заключение. Основная проблема при хранении больших чисел (int, float) в энергонезависимой памяти заключается в том, чтобы случайно не перезаписать нужную ячейку новой информацией. Для этого необходимо учитывать размер хранимой информации с помощью функций EEPROM.put() и EEPROM.get(). Если у вас возникли вопросы по работе с EEPROM Arduino, оставляйте их в комментариях к этой статье.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

newzaym
➜