Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/EEPROMUpdate

Материал из Онлайн справочника
Перейти к: навигация, поиск

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

Проверка/Оформление/Редактирование: Мякишев Е.А.


Запись данных в EEPROM при помощи функции EEPROM.update()[1]

Микроконтроллер на плате Arduino/Genuino имеет, как правило, 512 байт EEPROM-памяти (у моделей Uno и Mega ее объем составляет 1 Кб и 4 Кб соответственно) – она хранит информацию, даже если плата находится в выключенном состоянии. Другими словами, это что-то вроде крошечного жесткого диска.

Цель этого примера – показать, что функция EEPROM.update() делает запись лишь в том случае, если новые данные отличаются от старых. Использование этой функции сокращает время выполнения скетча, поскольку каждая операция записи требует 3,3 миллисекунды. Кроме того, она позволяет увеличить срок службы EEPROM-памяти, поскольку каждый ее участок рассчитан только на 100 тысяч циклов записи.

Необходимое оборудование

  • Плата Arduino или Genuino

Цепь

Для этого примера никакой цепи строить не нужно.

ArduinoUNO bb.png

Схема

ArduinoUNO sch.png

Код

  1. /***
  2.    Функция EEPROM.update()
  3.  
  4.    Этот скетч считывает данные с 0-ого входного аналогового контакта
  5.    и записывает их в EEPROM-память. Эти данные сохранятся на плате,
  6.    даже если она будет выключена, и позже могут быть извлечены
  7.    при помощи другого скетча.
  8.  
  9.    Если новые данные ничем не отличаются от старых, то запись сделана
  10.    не будет – это позволит снизить ненужный износ EEPOM-памяти.
  11.  
  12.    Выпущено под лицензией MIT.
  13.  ***/
  14.  
  15. #include <EEPROM.h>
  16.  
  17. /** текущий адрес в EEPROM-памяти (т.е. ячейка, куда будет выполнена следующая запись) **/
  18. int address = 0;
  19.  
  20. void setup() {
  21.   /** блок setup() оставим пустым **/
  22. }
  23.  
  24. void loop() {
  25.   /***
  26.     Полученное значение делим на 4, т.к. диапазон данных,
  27.     считанных с аналогового контакта, составляет «0-1023», а
  28.     EEPROM-память может хранить лишь байты в диапазоне от «0» до «255»
  29.   ***/
  30.   int val = analogRead(0) / 4;
  31.  
  32.   /***
  33.     Обновляем данные в заданной EEPROM-ячейке.
  34.     Они останутся там, даже если плата будет выключена.
  35.   ***/
  36.   EEPROM.update(address, val);
  37.  
  38.   /***
  39.     Функция EEPROM.update(address, val) эквивалента следующему:
  40.  
  41.     if( EEPROM.read(address) != val ){
  42.       EEPROM.write(address, val);
  43.     }
  44.   ***/
  45.  
  46.  
  47.   /***
  48.     В конце цикла переходим к следующему адресу.
  49.  
  50.     У больших AVR-процессоров объем EEPROM-памяти тоже больше:
  51.     - Arduino Duemilanove: 512 байт EEPROM-памяти.
  52.     - Arduino Uno:        1 килобайт EEPROM-памяти.
  53.     - Arduino Mega:       4 килобайта EEPROM-памяти.
  54.  
  55.     Вместо того чтоб указывать фиксированный объем EEPROM-памяти,
  56.     лучше использовать уже готовую функцию EEPROM.lenght(). Это более
  57.     гибкое решение, благодаря которому ваш код можно будет  
  58.     использовать на всех AVR-процессорах, а не только на том, который
  59.     стоит на вашей плате.
  60.   ***/
  61.   address = address + 1;
  62.   if (address == EEPROM.length()) {
  63.     address = 0;
  64.   }
  65.  
  66.   /***
  67.     Поскольку объем EEPROM-памяти кратен двум, предотвратить выход за
  68.     пределы EEPROM-памяти можно и другим способом – при помощи
  69.     оператора «&=» и объема EEPROM-памяти, из которого вычтена
  70.     единица.
  71.  
  72.     ++address &= EEPROM.length() - 1;
  73.   ***/
  74.  
  75.   delay(100);
  76. }

См.также

  1. EEPROM.update()
  2. EEPROM library reference
  3. EEPROM Clear - Fills the content of the EEPROM memory with “0”.
  4. EEPROM Read – Reads values stored into EEPROM and prints them on Serial.
  5. EEPROM Write – Stores values read from A0 into EEPROM.
  6. EEPROM Crc – Calculates the CRC of EEPROM contents as if it was an array.
  7. EEPROM Iteration – Programming examples on how to go through the EEPROM memory locations.
  8. EEPROM Put – Put values in EEPROM using variable semantics (differs from EEPROM.write() ).
  9. EEPROM Get – Get values from EEPROM and prints as float on serial.

Внешние ссылки

  1. Arduino - EEPROM Update