У плат сімейства плат Arduino є кілька видів пам'яті. По-перше, це статичне ОЗУ (оперативне запам'ятовуючий пристрій), яка використовується для зберігання змінних в процесі виконання програми. По-друге, це флеш-пам'ять. в якій зберігаються написані вами скетчі. І по-третє, це EEPROM. яку можна використовувати для постійного зберігання інформації. Перший тип пам'яті - енергозалежності, він втрачає всю інформацію після перезавантаження Arduino. Другі два типи пам'яті зберігають інформацію поки вона не буде переписана нової, навіть після відключення живлення. Останній тип пам'яті - EEPROM - дозволяє записувати дані, зберігати їх і зчитувати при необхідності. Цю пам'ять ми і розглянемо зараз.
1 Опис пам'яті EEPROM
EEPROM означає Electrically Erasable Programmable Read-Only Memory. тобто електрично стирається перепрограммируемое постійний запам'ятовуючий пристрій. Дані в цій пам'яті можуть зберігатися десятки років після відключення живлення. Кількість циклів перезапису - порядку декількох мільйонів разів.
Кількість EEPROM пам'яті в Arduino досить обмежена:- для плат, заснованих на мікроконтролері ATmega328 (наприклад, Arduino UNO і Nano), кількість пам'яті становить 1 кБ,
- для плат на ATmega168 та ATmega8 - 512 байт,
- на ATmega2560 і ATmega1280 - 4 кБ.
2 Бібліотека EEPROM
Для роботи з EEPROM для Arduino написана спеціальна бібліотека, яка входить в Arduino IDE за замовчуванням. Бібліотека містить наступні можливості.
дозволяє використовувати ідентифікатор "EEPROM" як масив, щоб записувати дані в пам'ять і зчитувати їх з пам'яті.
Щоб задіяти бібліотеку в скетчі, підключаємо її директивою #include EEPROM.h.
3 Запис цілих чисел в EEPROM
Давайте запишемо в пам'ять EEPROM два цілих числа, а потім прочитаємо їх з EEPROM і виведемо в послідовний порт. З числами від 0 до 255 проблем немає, вони займають якраз 1 байт пам'яті і за допомогою функції EEPROM.write () записуються в потрібну комірку.
Якщо число більше, ніж 255, то за допомогою операторів highByte () і lowByte () його потрібно ділити на байти і записувати кожен байт в свій осередок. Максимальне число при цьому - 65536 (або 2 16).
Дивіться, монітор послідовного порту в клітинку 0 просто виводить число, менше, ніж 255. У осередках 1 і 2 зберігається велика кількість 789. При цьому осередок 1 зберігає множник переповнення 3, а осередок 2 - недостатня кількість 21 (тобто 789 = 3 × 256 + 21).
Запис цілих чисел в EEPROM ArduinoЩоб заново «зібрати» велике число, розібране на байти, є функція word (). int val = word (hi, low), де "hi" і "low" - це значення старшого і молодшого байтів числа "val".
У всіх інших осередках, що не були нами жодного разу записані, зберігаються числа 255.
4 Запис чисел з плаваючою комою і рядків в EEPROM
Для запису чисел з плаваючою комою і рядків потрібно використовувати метод EEPROM.put (). а для читання - EEPROM.get ().
У процедурі setup () спочатку запишемо число з плаваючою комою "f". Потім зрушимо на кількість осередків пам'яті, яке займає тип "float", і запишемо рядок символів "char" ємністю 20 осередків.
У процедурі loop () будемо зчитувати всі осередки пам'яті і намагатися розшифрувати їх спочатку як тип "float", а потім як тип "char", і виводити результат в послідовний порт.
Запис чисел з плаваючою комою в EEPROM ArduinoВидно, що значення в осередках з 0 по 3 правильно визначилося як число з плаваючою точкою, а починаючи з 4-ої - як рядок.
5 Робота з EEPROM як з масивом
Дуже зручна можливість - звернення до осередків пам'яті як до елементів масиву EEPROM. В даному скетчі в процедурі setup () ми спочатку запишемо дані в 4 перших байта, а в процедурі loop () щохвилини будемо зчитувати дані з усіх осередків і виводити їх в послідовний порт.
Робота з осередками пам'яті EEPROM Arduino як з елементами масиву