Arduino:Примеры/EEPROMUpdate

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

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Запись данных в 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

Код

/***
   Функция EEPROM.update()

   Этот скетч считывает данные с 0-ого входного аналогового контакта
   и записывает их в EEPROM-память. Эти данные сохранятся на плате,
   даже если она будет выключена, и позже могут быть извлечены
   при помощи другого скетча.

   Если новые данные ничем не отличаются от старых, то запись сделана
   не будет – это позволит снизить ненужный износ EEPOM-памяти. 

   Выпущено под лицензией MIT.
 ***/

#include <EEPROM.h>

/** текущий адрес в EEPROM-памяти (т.е. ячейка, куда будет выполнена следующая запись) **/
int address = 0;

void setup() {
  /** блок setup() оставим пустым **/
}

void loop() {
  /***
    Полученное значение делим на 4, т.к. диапазон данных,
    считанных с аналогового контакта, составляет «0-1023», а 
    EEPROM-память может хранить лишь байты в диапазоне от «0» до «255»
  ***/
  int val = analogRead(0) / 4;

  /***
    Обновляем данные в заданной EEPROM-ячейке.
    Они останутся там, даже если плата будет выключена. 
  ***/
  EEPROM.update(address, val);

  /***
    Функция EEPROM.update(address, val) эквивалента следующему:

    if( EEPROM.read(address) != val ){
      EEPROM.write(address, val);
    }
  ***/


  /***
    В конце цикла переходим к следующему адресу.

    У больших AVR-процессоров объем EEPROM-памяти тоже больше:
    - Arduino Duemilanove: 512 байт EEPROM-памяти.
    - Arduino Uno:        1 килобайт EEPROM-памяти.
    - Arduino Mega:       4 килобайта EEPROM-памяти.

    Вместо того чтоб указывать фиксированный объем EEPROM-памяти, 
    лучше использовать уже готовую функцию EEPROM.lenght(). Это более 
    гибкое решение, благодаря которому ваш код можно будет   
    использовать на всех AVR-процессорах, а не только на том, который
    стоит на вашей плате.
  ***/
  address = address + 1;
  if (address == EEPROM.length()) {
    address = 0;
  }

  /***
    Поскольку объем EEPROM-памяти кратен двум, предотвратить выход за
    пределы EEPROM-памяти можно и другим способом – при помощи 
    оператора «&=» и объема EEPROM-памяти, из которого вычтена 
    единица. 

    ++address &= EEPROM.length() - 1;
  ***/

  delay(100);
}

См.также

  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.

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