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

Код

 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.

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