EEPROM означає Electrically Erasable Programmable Read-Only Memory, тобто електрично стирається перепрограммируемое постійний запам'ятовуючий пристрій. Дані в цій пам'яті можуть зберігатися десятки років після відключення живлення. Кількість циклів перезапису - порядку декількох мільйонів разів.
Кількість EEPROM пам'яті в Arduino досить обмежена: для плат, заснованих на мікроконтролері ATmega328 (наприклад, Arduino UNO і Nano), кількість пам'яті становить 1 кБ, для плат на ATmega168 та ATmega8 - 512 байт, на ATmega2560 і ATmega1280 - 4 кБ.
Давайте запишемо в пам'ять 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). Щоб заново "зібрати" велике число, розібране на байти, є функція word (). int val = word (hi, low), де hi і low - це значення старшого і молодшого байтів.
У всіх інших осередках, що не були нами жодного разу записані, зберігаються числа 255.
Для запису чисел з плаваючою комою і рядків потрібно використовувати метод EEPROM.put (). а для читання - EEPROM.get ().
У процедурі setup () спочатку запишемо число з плаваючою комою f. Потім зрушимо на кількість осередків пам'яті, яке займає тип float, і запишемо рядок символів char ємністю 20 осередків.
У процедурі loop () будемо зчитувати всі осередки пам'яті і намагатися розшифрувати їх спочатку як тип "float", а потім як тип "char", і виводити результат в послідовний порт.
Видно, що значення в осередках з 0 по 3 правильно визначилося як число з плаваючою точкою, а починаючи з 4-ої - як рядок.
З'являються значення ovf (переповнення) і nan (не числом) говорять про те, що число не може бути коректно перетворено в число з плаваючою крапкою. Якщо ви точно знаєте, якого типу дані які клітинки пам'яті займають, то у вас не буде виникати проблем.
Дуже зручна можливість - звернення до осередків пам'яті як до елементів масиву EEPROM. В даному скетчі в процедурі setup () ми спочатку запишемо дані в 4 перших байта, а в процедурі loop () щохвилини будемо зчитувати дані з усіх осередків і виводити їх в послідовний порт.