Arduino EEPROM работа с памятью

Работа с EEPROM Arduino

EEPROM Arduino ➜ позволяет сохранять данные во время работы программы. Рассмотрим, как работать с EEPROM памятью Ардуино - запись и чтение различных типов данных.

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

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

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

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

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

Команды библиотеки 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 как с массивом. Байты можно считывать и записывать.

Arduino EEPROM запись, чтение данных

Для занятия нам понадобятся следующие детали:

  • плата Arduino Uno / Arduino Nano / Arduino Mega;

Все необходимое для изучения Ардуино можно недорого купить здесь

Скетч. Чтение Arduino EEPROM (read)

#include <EEPROM.h>  // импортируем библиотеку
int address;                     // переменная для хранения адреса
byte value;                      // переменная для хранения значения

void setup() {
   Serial.begin(9600);  // запускаем монитор порта
   Serial.println(EEPROM.length());  // выводим общее количество ячеек в памяти
   delay(3000);

   // перебираем в цикле все адреса в EEPROM памяти, пока все не переберем
   while (address < EEPROM.length()) {
      value = EEPROM.read(address);  // считываем значение байта
      Serial.print("Address: ");               // выводим полученные данные на монитор порта
      Serial.print(String(address));
      Serial.print(", value: ");
      Serial.println(String(value));
      address++;                                       // наращиваем адрес и повторяем операции
      delay(100);
   }
}
void loop() {
}

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

  1. функция EEPROM.length() позволяет узнать общее число ячеек в памяти. Если вы работаете с Nano ATmega168, то цикл закончится на 512 ячейке;
  2. если память не использовалась, то все значения в ячейках будут равны 255.

Скетч. Запись Arduino EEPROM (write)

#include <EEPROM.h>  // импортируем библиотеку
int address;                     // переменная для хранения адреса
byte value;                      // переменная для хранения значения

void setup() {
   Serial.begin(9600);  // запускаем монитор порта
   Serial.println(EEPROM.length());  // выводим общее количество ячеек в памяти
   EEPROM.write(0,100);                    // записываем значение 100 в ячейку с адресом 0
   delay(3000);

   // перебираем в цикле все адреса в EEPROM памяти, пока все не переберем
   while (address < EEPROM.length()) {
      value = EEPROM.read(address);  // считываем значение байта
      Serial.print("Address: ");               // выводим полученные данные на монитор порта
      Serial.print(String(address));
      Serial.print(", value: ");
      Serial.println(String(value));
      address++;                                       // наращиваем адрес и повторяем операции
      delay(100);
   }
}
void loop() {
}

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

  1. функция EEPROM.write() каждый раз перезаписывает данные в ячейке с адресом 0, что снижает жизненный цикл памяти, лучше использовать EEPROM.update();
  2. в следующих примерах не будем перебирать все ячейки в памяти, а запишем и прочитаем только несколько байт в энергонезависимой памяти Ардуино.
Пример работы предыдущей программы с EEPROM Arduino
Пример работы предыдущей программы

Скетч. Перезапись в Arduino EEPROM (update)

#include <EEPROM.h>  // импортируем библиотеку

void setup() {
   Serial.begin(9600);  // запускаем монитор порта

   EEPROM.update(0,100);               // записываем значение 100 в ячейку с адресом 0
   delay(2000);

   Serial.println(EEPROM.read(0));  // выведет на монитор порта 100
   Serial.println(EEPROM[0]);          // выведет на монитор порта 100
   }
}
void loop() {
}

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

  1. вывод данных из ячейки с адресом 0 выполняется с помощью разных функций;
  2. функции write/read/update позволяют работать только с типами данных byte и использовать эти функции для данных типа float или int уже нельзя. Для этого следует использовать put/get, которые мы рассмотрим далее.

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

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

Скетч. Запись в память EEPROM int, float

#include <EEPROM.h>  // импортируем библиотеку

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

void setup() {
  Serial.begin(9600);    // запускаем монитор порта

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

  delay(1000);

  byte val1 = EEPROM.read(1);  // считываем 1 байт по адресу ячейки
  byte val2 = EEPROM.read(2);  // считываем 1 байт по адресу ячейки

  Serial.println("highByte - "+String(val1));  // выводим старший байт на монитор
  Serial.println("lowByte  - "+String(val2));  // выводим младший байт на монитор

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

void loop() {
}

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

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

Скетч. Запись строк в EEPROM (String)

#include <EEPROM.h>  // импортируем библиотеку

int address = 10;  // адрес первой ячейки для записи

long cod = 8904; // разбиваем телефонный номер на две части
long tel = 2768282;
String email = "ROBOTEHNIKA18@GMAIL.COM"; // сохраняем в строке адрес почты

long COD; // создаём новые переменные для чистоты эксперимента
long TEL;
String EMAIL;

void setup() {
  Serial.begin(9600);  // запускаем монитор порта

  EEPROM.put(address, cod);      // сохраняем код телефона в памяти Ардуино
  address += sizeof(cod);              // узнаем адрес следующей свободной ячейки
  EEPROM.put(address, tel);       // сохраняем номер телефона в памяти Ардуино
  address += sizeof(tel);                // узнаем адрес следующей свободной ячейки
  EEPROM.put(address, email);  // сохраняем электронную почту в памяти

  address = 10;  // адрес первой ячейки для чтения

  Serial.print("Phone: ");  // выводим телефонный номер на монитор
  Serial.print(EEPROM.get(address, COD));
  address += sizeof(COD);
  Serial.println(EEPROM.get(address, TEL));
  address += sizeof(TEL);

  Serial.print("Email: ");  // выводим электронную почту на монитор
  Serial.println(EEPROM.get(address, EMAIL));
}

void loop() {
}

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

  1. перед сохранением новых данных в памяти, следует узнать размер данных, которые были сохранены, чтобы начать запись в новой ячейке;
  2. удалив из кода строчки для записи данных, вы можете каждый раз при запуске программы считывать все сохраненные данные из ПЗУ Ардуино.

Скетч. Очистка EEPROM Arduino

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

#include <EEPROM.h>  // импортируем библиотеку
int address;                     // переменная для хранения адреса

void setup() {
   // перезаписываем в цикле все адреса в ЕЕПРОМ памяти
   while (address < EEPROM.length()) {
      EEPROM.update(address, 255);
      address++;
   }
}
void loop() {
}

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

  1. все ячейки, если они отличаются от 255, автоматически перезапишутся;
  2. функция EEPROM.put(), как и EEPROM.update() перезаписывает ячейку лишь когда данные отличаются, экономя ресурс памяти еепром Ардуино.
1 Star2 Stars3 Stars4 Stars5 Stars (4 votes, average: 5,00 out of 5)
Загрузка...

Один комментарий для “Пример: Arduino EEPROM работа с памятью”

  1. Здравствуйте. Подскажите, как производится запись больших чисел в eeprom. Спасибо

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

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