Использование eeprom на arduino

Содержание

Настраиваем Arduino IDE

Выбрать модель платы/микроконтроллера (загрузчика) Инструменты\Процессор\”Ваша модель”.

ВНИМАНИЕ! У используемой в моих проектах Arduino NANO может быть прошит “новый” или “старый” загрузчик, в продаже есть и те и те. Начиная с Arduino IDE версии выше 1.8.4 можно выбрать ATmega328P и ATmega328P (Old Bootloader), попробуйте оба, потому что это определяется методом тыка

Выбрать порт: инструменты\порт\”COM отличный от COM1, например COM3, COM5…” См. второй скриншот. Какой именно порт вы могли видеть при первом подключении Ардуино к компьютеру. Примечание: если у вас только СОМ1 – значит либо не встали драйвера, либо сдохла плата.

Готовые прошивки просто открываются двойным кликом. Чтобы загрузить прошивку, жмите кнопку ЗАГРУЗИТЬ на верхней панели инструментов, она в виде стрелочки.

ВНИМАНИЕ! В пути к папке со скачанными скетчами не должно быть русских букв! Создайте в корне диска папку Arduino и работайте в ней!

ВНИМАНИЕ! Как только достанете Arduino из пакетика, сразу прошейте в неё скетч с миганием светодиода (blink.ino) Таким образом вы узнаете, что Ардуина рабочая (на тот случай, когда после сборки/пайки она перестанет работать и прошиваться), то есть вы сами её сломали, а не она была изначально бракованная

Как это выглядит физически

Для контроля открытия на калитку, двери дома и вход кладовки устанавливаются герконовые датчики. Питание системы отопления осуществляется через силовое реле-повторитель, которое в свою очередь запускается от платы автоматического включения, управляемого Ардуино.

Вся электрика дома, за исключением согревающего жилье оборудования и холодильника контролируется отдельным силовым модулем отключения. Определение наличия напряжения в общей приходящей сети питания 220 В выполняется однофазным реле тока, работающим в «обратную сторону». То есть, включение его обеспечивается 220 В в розетке, а коммутирует оно низковольтное соединение, указывающее микроконтроллеру о наличии электричества в доме.

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

Умный дом на основе Ардуино будет управлять всем перечисленным в двух режимах — когда никого нет или люди присутствуют. Кроме того, для включения внешнего освещения микроконтроллер будет руководствоваться показаниями фоторезистора, установленного снаружи. Подсветка станет активна только когда темно.

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

Вторая кнопка, установленная в доме и связанная с микроконтроллером, применяется для включения состояния охраны и снятия с него. О текущем статусе информируют светодиоды. Два зеленых, на активность каждой из функций и пара красных указывающих пассивный режим.

Текущая установка сохраняется в энергонезависимой памяти Ардуино, и читается в момент рестарта микроконтроллера. Информация о форс-мажорных обстоятельствах отправляется на телефон владельца.

Питание Ардуино выполнено от батареи и сети. В тот момент, когда с последнее прекращается — реле не только включает информатор об отсутствии тока, но и соединяет Ардуино с резервом.

Итак, что потребуется:

Наименование Количество
Ардуино-реле 220 В на 4 контакта 1
Реле-повторитель для высокой нагрузки 2
GSM модуль SIM900 1
Arduino UNO R3 1
Реле-повторитель для коммутации 5 В работающее от сети переменного тока 220 В 1
Диоды зеленые 2
Кнопки 2
Резисторы 10 kОм 5
Резисторы 220 Ом 5
Диоды красные 2
Фоторезистор 1
Терморезистор 1
Резистор 2.2 кОм 1
Конденсатор 0.1 мкФ 1
Электролитный конденсатор 470 мкФ, 6.3 В 1

Также потребуется необходимое количество провода для соединения датчиков и выполнения силовых линий.

Define Documentation

#define __EEGET (   var,
  addr 
)    (var) = eeprom_read_byte ((const *)(addr))

Read a byte from EEPROM. Compatibility define for IAR C.

#define __EEPUT (   addr,
  val 
)    eeprom_write_byte (( *)(addr), ()(val))

Write a byte to EEPROM. Compatibility define for IAR C.

#define _EEGET (   var,
  addr 
)    (var) = eeprom_read_byte ((const *)(addr))

Read a byte from EEPROM. Compatibility define for IAR C.

#define _EEPUT (   addr,
  val 
)    eeprom_write_byte (( *)(addr), ()(val))

Write a byte to EEPROM. Compatibility define for IAR C.

#define EEMEM   __attribute__((section(«.eeprom»)))

Attribute expression causing a variable to be allocated within the .eeprom section.

#define eeprom_busy_wait ( )    do {} while (!eeprom_is_ready())

Loops until the eeprom is no longer busy.

Returns:
Nothing.
#define eeprom_is_ready ( )
Returns:
1 if EEPROM is ready for a new read/write operation, 0 if not.

Элементы платы

Микроконтроллер ATSAMD21G18

Мозгом платформы Arduino MKR Wi-Fi 1010 является 32-разрядный микроконтроллер фирмы Microchip (Atmel) — ATSAMD21G18 с вычислительном ядром ARM Cortex M0.

Благодаря использованию 32-разрядного ядра ARM, Arduino Nano IoT во многом превосходит типичные платы на базе 8-разрядных микроконтроллеров. Наиболее существенные отличия заключаются в следующем:

  • 32-битное ядро позволяет обрабатывать четырёх-байтовые данные всего за один такт.
  • Тактовая частота – 48 МГц.
  • Объем памяти программ Flash – 256 КБ.
  • Объем оперативной памяти SRAM – 32 КБ.
  • Наличие DMA-контроллера позволяет разгрузить центральный процессор, выполняя ресурсоёмкие операции с памятью.

Беспроводной модуль NINA-W102

За беспроводную связь отвечает модуль U-blox NINA-W102 со встроенным чипом ESP32 для обмена данными по воздуху в диапазоне 2,4 ГГц по Wi-Fi и Bluetooth. Регулировка выходной мощности обеспечивает оптимальное соотношение между дальностью связи, скоростью передачи данных и энергопотреблением.

IMU-сенсор

IMU-сенсор на 6 степеней свободы включает в себя акселерометр и компас. Сборка выполнена на чипе LSM6DS3 по технологии (англ. System-in-Package — система в корпусе), где акселерометр и гироскоп лежат методом бутерброда в пластиковом корпусе.

Крипто-чип ATECC608A

Криптографический сопроцессор Microchip ATECC608A интегрирует протокол безопасности ECDH (Elliptic Curve Diffie Hellman) в сверхзащищенный метод, обеспечивающий согласование ключей для шифрования / дешифрования, наряду с ECDSA (алгоритм цифровой подписи эллиптической кривой) для проверки подлинности с подписью для Интернета вещей (IoT), включая домашнюю автоматизацию, промышленные сети, медицинские услуги, аутентификацию аксессуаров и расходных материалов.

Светодиодная индикация

Имя светодиода Назначение
ON Информационный индикатор питания
L Пользовательский светодиод на пине микроконтроллера. Используйте определение для работы со светодиодом. При задании значения высокого уровня светодиод включается, при низком – выключается.

Понижающий регулятор 3V3

Импульсный понижающий регулятор напряжения MPM3610 обеспечивает питание микроконтроллера и другой логики платформы при подключении платформы через пин . Диапазон входного напряжения от 5 до 18 вольт. Выходное напряжение 3,3 В с максимальным выходным током 1,2 А.

Кнопка RESET

Пользовательская кнопка с двумя полезными функциями:

  • Один клик (Single Сlick): служит для сброса микроконтроллера.
  • Двойной клик (Double Click): переводит микроконтролер в BOOT-режим, который пригодиться при зависании платы или дургих сбоев в программе.

Код

 1 /***
 2     Пример eeprom_put
 3 
 4     Этот пример показывает, как использовать функцию EEPROM.put(). 
 5     Также он подготавливает EEPROM-данные для примера eeprom_get. 
 6 
 7     В отличие от функции EEPROM.write(), EEPROM.put() может
 8     оперировать не одним, а несколькими байтами. Кроме того, она
 9     работает по принципу EEPROM.update() и делает перезапись только
10     в том случае, если новые данные отличаются от предыдущих. 
11 
12     Автор – Кристофер Эндрюс (Christopher Andrews), 2015 год.
13     Выпущено под лицензией MIT.
14 ***/
15 
16 #include <EEPROM.h>
17 
18 struct MyObject {
19   float field1;
20   byte field2;
21   char name10];
22 };
23 
24 void setup() {
25 
26   Serial.begin(9600);
27   while (!Serial) {
28     ; // ждем подключения последовательного порта (нужно только для Arduino со штатным USB-портом)
29   }
30 
31   float f = 123.456f;  // переменная для записи в EEPROM-память
32   int eeAddress = ;   // участок EEPROM-памяти, куда будет выполнена запись
33 
34 
35   // далее – один простой вызов функции EEPROM.put();
36   // первый аргумент – адрес, второй – объект:
37   EEPROM.put(eeAddress, f);
38 
39   Serial.println("Written float data type!"); // "float-данные, записанные в EEPROM-память: "
40 
41   /** функцию EEPROM.put() можно использовать и для пользовательских объектов **/
42 
43   // данные, которые будем записывать:
44   MyObject customVar = {
45     3.14f,
46     65,
47     "Working!" 
48   }; // "Работает!"
49 
50   eeAddress += sizeof(float);  // перемещаемся к участку EEPROM-памяти, находящемуся вслед за тем, где хранится переменная «f»
51 
52   EEPROM.put(eeAddress, customVar);
53   Serial.print("Written custom data type! \n\nView the example sketch eeprom_get to see how you can retrieve the values!"); // "Данные пользовательского типа записаны! \n\nО том, как извлечь эти данные, смотрите в скетче-примере eeprom_get"
54 }
55 
56 void loop() {
57   /* пустой цикл */
58 }

См.также

  1. EEPROM library reference
  2. EEPROM Clear — Fills the content of the EEPROM memory with “0”.
  3. EEPROM Read – Reads values stored into EEPROM and prints them on Serial.
  4. EEPROM Write – Stores values read from A0 into EEPROM.
  5. EEPROM Crc – Calculates the CRC of EEPROM contents as if it was an array.
  6. EEPROM Iteration – Programming examples on how to go through the EEPROM memory locations.
  7. EEPROM Get – Get values from EEPROM and prints as float on serial.
  8. EEPROM Update – Stores values read from A0 into EEPROM, writing the value only if different, to increase EEPROM life.

Описание обеспечения

Arduino Nano может получать питание через подключение Mini-B USB, или от нерегулируемого 6 – 20 В (вывод 30), или регулируемого 5 В (вывод 27), внешнего источника питания. Автоматически выбирается источник с самым высоким напряжением.

Микросхема FTDI FT232RL получает питание, только если сама платформа запитана от USB. Таким образом при работе от внешнего источника (не USB), будет отсутствовать напряжение 3.3 В, генерируемое микросхемой FTDI, при этом светодиоды RX и TX мигают только при наличие сигнала высокого уровня на выводах 0 и 1.

На Arduino Nano доступны следующие контакты для доступа к питанию:

  • Vin : Напряжение от внешнего источника питания (не связано с 5 В от USB или другим стабилизированным напряжением). Через этот вывод можно как подавать внешнее питание, так и потреблять ток, если к устройству подключён внешний адаптер.
  • 5V : На вывод поступает напряжение 5 В от стабилизатора платы. Данный стабилизатор обеспечивает питание микроконтроллера ATmega328. Запитывать устройство через вывод 5V не рекомендуется — в этом случае не используется стабилизатор напряжения, что может привести к выходу платы из строя.
  • 3.3V : 3,3 В от стабилизатора микросхемы FT232RL. Максимальный ток вывода — 50 мА.
  • GND : земля.
  • IOREF : Вывод предоставляет платам расширения информацию о рабочем напряжении микроконтроллера. В зависимости от напряжения, плата расширения может переключиться на соответствующий источник питания либо задействовать преобразователи уровней, что позволит ей работать как с 5 В, так и с 3,3 В устройствами.

Распиновка и схема платы arduino nano.

Память

Микроконтроллер ATmega328 имеет 32 КБ флеш-памяти для хранения кода программы, 2 КБ используется для хранения загрузчика. ATmega328 имеет 2 КБ ОЗУ и 1 КБ EEPROM.

Ввод / вывод

Каждый из 14 цифровых выводов Nano, используя функции pinMode(), digitalWrite(), и digitalRead(), может настраиваться как вход или выход. Выводы работают при напряжении 5 В. Каждый вывод имеет нагрузочный резистор (стандартно отключен) 20-50 кОм и может пропускать до 40 мА. Некоторые выводы имеют особые функции:

  • Последовательная шина: 0 (RX) и 1 (TX) – Выводы используются для получения (RX) и передачи (TX) данных TTL. Данные выводы подключены к соответствующим выводам микросхемы последовательной шины FTDI USB-to-TTL.
  • Внешнее прерывание: 2 и 3 – Данные выводы могут быть сконфигурированы на вызов прерывания либо на младшем значении, либо на переднем или заднем фронте, или при изменении значения. Подробная информация находится в описании функции attachInterrupt().
  • ШИМ: 3, 5, 6, 9, 10, и 11 – Любой из выводов обеспечивает ШИМ с разрешением 8 бит при помощи функции analogWrite().
  • SPI: 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK) – Посредством данных выводов осуществляется связь SPI, которая, хотя и поддерживается аппаратной частью, не включена в язык Arduino.
  • LED: 13 – Встроенный светодиод, подключенный к цифровому выводу 13. Если значение на выводе имеет высокий потенциал, то светодиод горит. На платформе Nano установлены 8 аналоговых входов, каждый разрешением 10 бит (т.е. может принимать 1024 различных значения). Стандартно выводы имеют диапазон измерения до 5 В относительно земли, тем не менее имеется возможность изменить верхний предел посредством функции analogReference().
  • I2C: 4 (SDA) и 5 (SCL) – Посредством выводов осуществляется связь I2C (TWI).
  • AREF – Опорное напряжение для аналоговых входов. Используется с функцией analogReference().
  • Reset – Низкий уровень сигнала на выводе перезагружает микроконтроллер. Обычно применяется для подключения кнопки перезагрузки на плате расширения, закрывающей доступ к кнопке на самой плате Arduino.

API

The library inherits form the Arduino Core for ESP8266 EEPROM library, and it shares the same API. You can just replace one with the other. The same public methods with the same signature. By default it will use the same sector as with the EEPROM library (sector 1019 for 4Mb boards, sector 251 for 1Mb boards), or you can specify another sector in the constructor. It can behave like a drop-in replacement.

If you define a sector pool size different that one (using the method). The other sectors are the ones counting from the base one downwards. This means that if we set up a sector pool size of 4 for a 4Mb board using default base sector, the used sectors will be 1019, 1018, 1017 and 1016.

The library exposes a set of new methods to configure the sector rotating and performing other special actions:

bool backup(uint32_t sector) | bool backup()

Backups the current data to the given sector. If no sector is specified the base sector will be used. See also the method.

uint8_t base()

Returns the base sector. Note that sectors in use are those N sectors before the base sector, including the base sector. If base sector is 1019 and sector pool size is 4, these sectors will be 1019, 1018, 1017 and 1016.

void dump(Stream & debug, uint32_t sector) | void dump(Stream & debug)

Dumps the EEPROM data to the given stream in a human-friendly way. If no sector is specified it will dump the data for the current sector.

uint8_t last()

Returns the number of the last available sector for EEPROM. This is also the sector that the default EEPROM library uses. You can use this value to choose a sensible pool size:

void offset(uint8_t offset)

Define the offset in the sector where the special auto-increment and CRC values will be stored. The default value is 0. This special data uses 3 bytes of space in the emulated EEPROM memory buffer.

bool rotate(uint32_t value)

Enables or disables sector rotation (it is enabled by default). If disabled, it will always write to the last sector. This is useful if you are doing something that might use the other sectors (like an OTA upgrade) and you don’t want the library to mess with them. Disabling rotation also sets the flag to True, so it forces next commit to persist the data to the last sector.

It is recommended to backup the data to the last sector before doing an OTA upgrade and disable sector rotation to prevent any EEPROM call to overwrite the OTA image. The suggested way to do it is to call this code in the OTA start callback:

In case the upgrade fails, you might want to reenable sector rotation by calling:

See the OTA example for this library.

void size(uint8_t size)

Set the sector pool size the library will use. The default value is 1. The valid range is from 1 to 10. It must be called before the method.

Описание памяти EEPROM

Arduino – это целое семейство различных устройств для создания электронных проектов. Микроконтроллеры очень удобны для использования, доступны к освоению даже новичку. Каждый микроконтроллер состоит из платы, программ для обеспечения работы, памяти. В этой статье будет рассмотрена энергонезависимая память, используемая в Arduino.

Ардуино предоставляет своим пользователям три типа встроенной памяти устройств: стационарное ОЗУ (оперативно-запоминающее устройство или SRAM — static random access memory) – необходимо для записи и хранения данных в процессе использования; флеш-карты – для сохранения уже записанных схем; EEPROM – для хранения и последующего использования данных.

По теме: Скачать библиотеку EEPROM

На ОЗУ все данные стираются, как только происходит перезагрузка устройства либо отключается питание. Вторые две сохраняют всю информацию до перезаписи и позволяют извлекать ее при необходимости. Флеш-накопители достаточно распространены в настоящее время. Подробнее стоит рассмотреть память EEPROM.

Аббревиатура расшифровывается, как Electrically Erasable Programmable Read-Only Memory и в переводе на русский дословно означает – электрически стираемая программируемая память только для чтения. Производитель гарантирует сохранность информации на несколько десятилетий вперед после последнего отключения питания (обычно приводят срок в 20 лет, зависит от скорости снижения заряда устройства).

При этом нужно знать, что возможность перезаписи на устройство ограничена и составляет не более 100 000 раз. Поэтому рекомендуют аккуратно и внимательно относиться к вносимым данным и не допускать перезаписи лишний раз.

Объем памяти, в сравнении с современными носителями, очень небольшой и разный для различных микроконтроллеров. Например, для:

  • ATmega328 – 1кБ
  • ATmega168 и ATmega8 – 512 байт,
  • ATmega2560 и ATmega1280 – 4 кБ.

Так устроено потому, что каждый микроконтроллер предназначен для определенного объема задач, имеет разное количество выводов для подключения, соответственно, необходим разный объем памяти. При этом такого количества достаточно для обычно создаваемых проектов.

Для записи на EEPROM требуется значительное количество времени – около 3 мс. Если в момент записи отключается питание, данные не сохраняются вовсе либо могут быть записаны ошибочно. Требуется всегда дополнительно проверять внесенную информацию, чтобы избежать сбоев во время работы. Считывание данных происходит гораздо быстрее, ресурс памяти от этого не снижается.

Функции, реализованные в проекте

  • Комплексное управление городской квартирой
  • Управление системой из веб-интерфейса
  • Адаптивный дизайн для использования на планшетах и смартфонах
  • Отсылка тревожных и информационных SMS сообщений
  • Сохранение настроек в энергонезависимой памяти системы

Режимы присутствия людей в доме

  • Режимы «присутствие» и «отсутствие» людей в доме
  • Смена режима в веб-интерфейсе
  • Возможность отложенной смены режима с регулируемой задержкой срабатывания

Отопление

  • Управление отоплением 5-и помещений и зон в квартире
  • Управление работой тёплых полов в 5-и помещениях
  • Автоматическое поддержание заданной температуры
  • Установка параметров отопления в веб-интерфейсе
  • Регулировка температуры в зависимости от режима присутствия людей
  • Дополнительное разбиение режимов на 2 поддиапазона «высокий» и «низкий»
  • Задание матрицы целевых температур в веб-интерфейсе
  • Задание матрицы «высоких» и «низких» режимов для каждого времени суток
  • Регулировка температуры с учётом матрицы высоких и низких подрежимов
  • Контроль текущей и целевой температуры в реальном времени на веб-странице
  • Задание допустимых лимитов отклонения температуры в веб-интерфейсе
  • Индикация текущих нарушений температурных лимитов на веб-странице
  • Отсылка тревожных SMS при нарушении лимитов отклонения температур

nRF24 сеть

  • Поддержка работы nRF24 сети
  • Использование нативного AMS nRF24 беспроводного стека и протокола
  • Использование беспроводных батарейных AMS nRF24 датчиков
  • Удалённый контроль «здоровья» беспроводных датчиков
  • Отслеживание активности и ошибок беспроводных датчиков
  • Использование беспроводных AMS nRF24 контроллеров

Управление двумя санузлами

  • Защита от протечек
  • Автоматическое перекрытие клапана при протечках воды
  • SMS оповещение при аварийных ситуациях с протечками воды
  • Управление вентиляцией санузлов
  • Автоматический и ручной режимы вентиляции
  • Задание задержки отключения вентиляции в веб-интерфейсе
  • Задание критической влажности для включения вентиляции в веб-интерфейсе
  • Управление освещением санузлов
  • Автоматический и ручной режимы работы освещения
  • Задание задержки отключения освещения в веб-интерфейсе

Управление зимним садом на балконе

  • Определение температуры и влажности на улице
  • Поддержание заданной температуры на балконе
  • Алгоритм обогрева, учитывающий множество параметров

Работа со временем

  • Получение и синхронизация времени через интернет
  • Отслеживание временных интервалов
  • Отслеживание времени суток
  • Отслеживание времени восхода и захода солнца
  • Задание часов и минут наступления каждого времени суток в веб-интерфейсе

СМС сообщения и команды

  • Интеграция с AMS СМС сервером
  • Отсылка информационных и тревожных СМС на мобильный телефон
  • Приём управляющих команд от СМС сервера

Сетевая работа

  • Интеграция с другими контроллерами сети
  • Приём управляющих команд по сети от других контроллеров
  • Отсылка управляющих команд другим контроллерам сети

Constructor

###extEEPROM(eeprom_size_t devCap, byte nDev, unsigned int pgSize, byte busAddr)
#####Description
Instantiates an external EEPROM object.
#####Syntax

#####Parameters
devCap (eeprom_size_t): The size of one EEPROM device in k-bits. Choose a value from the eeprom_size_t enumeration above.nDev (byte): The number of EEPROM devices on the bus. Note that if there are multiple EEPROM devices on the bus, they must be identical and each must have its address pins strapped properly.pgSize (unsigned int): The EEPROM page size in bytes. Consult the datasheet if you are unsure of the page size.busAddr (byte): The base I2C bus address for the EEPROM(s). 0x50 is a common value and this parameter can be omitted, in which case 0x50 will be used as the default.
#####Example

extEEPROM myEEPROM(kbits_256, 2, 64);			//two 24LC256 EEPROMS on the bus
extEEPROM oddEEPROM(kbits_8, 1, 16, 0x42);		//an EEPROM with a non-standard I2C address

How does it work?

Instead of using a single sector to persist the data from the emulated EEPROM, this library uses a number of sectors to do so: a sector pool.

The library overwrites two methods of the original one: and .

The method will load the data from all the sectors in the sector pool one after the other trying to figure out which one has the latest valid information. To do
this it checks two values:

  • A 2-bytes CRC
  • A 1-byte auto-increment number

These values are stored in a certain position in the sector (at the very beginning by default but the user can choose another position with the method).

The CRC is calculated based on the contents of the sector (except for those special 3 bytes). If the calculated CRC matches that stored in the sector then the library checks the auto-increment and selects the sector with the most recent number (taking overflows into account, of course).

Those special values are stored by the overwritten method prior to the actual commit.

With every commit, the library will hop to the next sector. This way, in case of a power failure in the middle of a commit, the CRC for that sector will fail and the library will use the data in the latest known-good sector.

Host software

The host software is in the hostutil directory. It seems to work, although more testing is needed. Currently, it has only been tested on Linux, but might work on other Unix-like systems (such as MacOS and FreeBSD.)

To build the host software, run the command in the directory. Copy the resulting executable () to a directory that is on your executable path.

The command will print the following usage information:

Here are some basic usage examples.

Write a binary file called to a 32K EEPROM, disabling write protection before writing (necessary if the device is currently write-protected), enabling write protection after writing, and verifying that the data was written correctly:

This command should produce something like the following output:

Note that you should change as appropriate depending on the serial port device assigned to the Arduino.

Reading 32K of data from an EEPROM and saving the data in the output file :

This command should produce something like the following output:

Again, change as appropriate.

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

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

Firmware protocol

The firmware listens for commands on the UART (57600 bps, 8N1). You can interact with it using the Arduino serial monitor or a terminal program.

The firmware prints the prompt (greater than followed by space) when it is ready to receive a command.

The commands are as follows. All data and numeric parameters are specified using hexadecimal. aaaa is an address. cc is a count. dd is a data byte. Each command must be terminated by a line ending (either CRLF or just LF). If a command has output, it will be on a single line. All commands output either an «OK» line or an «Error: …» line depending on whether the command succeeded or failed. The «OK» output is generated after the command’s output (if any).

All read and write commands increment the current address by the number of bytes read or written.

Command Meaning Example Output
? show version and current address Firmware version and current address
Aaaaa set current address None
Wdd write one byte at current address None
Rcc read cc bytes of data at current address Data values read
Pccdddd… write cc bytes of data at current address None
D disable write protection None
N enable write protection None
E perform software chip erase None

Note that the command can write up to 64 bytes (one «page»), and the data written should not cross a page address boundary. I.e., if writing 64 bytes, the current address should be a multiple of 64.

The software chip erase may not work on non-Atmel EEPROM chips.

Single Type Method Sketch1

The Idea here is to store a set of simple type variables sequentially in the EEPROM at a specific EEPROM address.

Just attach a push button connected to ground and pin 5 of the
Arduino. On start up the EEPROM values are retrieved from the EEPROM and
sent to serial Monitor.

When you push the button random values are saved to the EEPROM. To
retrieve the values simply press the reset button on the Arduino and
these same numbers are displayed (having been read from the EEPROM).

When you hit the button you can also see write execution time.

Copy Sketch

Here’s an example of the output from the serial monitor:

Press button to write to EEPROM
EEPROM Written
MIN x 58478
MAX x 58479
MIN y 58480
MAX y 58481
EEPROM Write time  (us) 23300
EEPROM Write time per byte (us) 2912
Press button to write to EEPROM
Press button to write to EEPROM
Press button to write to EEPROM
Press button to write to EEPROM
EEPROM variable read and write.
MIN x 58478
MAX x 58479
MIN y 58480
MAX y 58481
Press button to write to EEPROM

Implementation Notes

Control Bytes

EEPROMWearLevel uses single bits to store the current index. Single bits of an EEPROM byte can only be programmed from 1 to 0. If a bit needs to change from 0 to 1, the whole byte must be cleared.
EEPROMWearLevel uses control bytes to store the location of the current index of the data. Every bit stands for one byte of data. A bit as 0 stands for data is in use, 1 for not yet used.

An empty control byte looks like this:

Writing data of 2 bytes length changes it to (2 bits are programmed to 0 without clearing the whole byte):

The control byte above states, that the first two indexes are used for data, the rest if free.
If you use larger partitions, the same is done with multiple control bytes. When all of them are marked as used (all bits 0), all bits in all control bytes of the partition are cleared what sets them back to 1.

EEPROM layout

EEPROMWearLevel first uses one byte to store the version. After that, the first partition starts. For every idx you use, one partition is allocated.
Assuming a configuration with a single partition of 18 bytes, it will be represented in EEPROM as follows:

In this example, two of the 18 bytes in the partition are used as control bytes while the other 16 is used to store the data.

The ‘layoutVersion’ is used to clear control bytes when their position on the EEPROM is changed by using other arguments on the method ‘begin()’. It is therefore important to change the ‘layoutVersion’ whenever a change is made of the arguments of the ‘begin()’ method. A change of ‘layoutVersion’ causes EEPROMWearLevel to reset the required control bytes so that it can use them to store the indexes.