Arduino:Примеры/EEPROMGet

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

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


Извлечение данных из EEPROM с помощью функции EEPROM.get()[1]

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

Цель этого урока – на практике продемонстрировать, чем функции EEPROM.get() и EEPROM.put() отличаются от EEPROM.read() и EEPROM.write(). Последние две могут оперировать не одним, а несколькими байтами, и их количество зависит от типа данных, которые хранятся в обрабатываемой переменной.

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

  • Плата Arduino или Genuino

Цепь

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

Схема

Код

/***
    Пример eeprom_get 

    Этот пример показывает, как использовать функцию EEPROM.get().

    Чтобы подготовить EEPROM-память к этому скетчу, сначала запустите 
    скетч-пример eeprom_put. 

    Впрочем, eeprom_get можно запустить и без eeprom_put, но будьте 
    готовы к тому, что в мониторе порта будут отображены не очень
    смотрибельные данные (это «сырые» данные, которые уже хранятся 
    в EEPROM-памяти).

    К примеру, EEPROM.get() может вернуть очень длинную строку 
    мусорных данных (если в этих строках нет нуля).

    Автор – Кристофер Эндрюс (Christopher Andrews), 2015 год.
    Выпущено под лицензией MIT.
***/

#include <EEPROM.h>

void setup() {

  float f = 0.00f;   // переменная для хранения данных, считанных из EEPROM-памяти
  int eeAddress = 0; // участок EEPROM-памяти, с которого будет начато считывание

  Serial.begin(9600);
  while (!Serial) {
    ; // ждем подключения последовательного порта (нужно только для Arduino со штатным USB-портом)
  }
  Serial.print("Read float from EEPROM: "); // "float-данные, извлеченные из EEPROM-памяти: "

  // Извлекаем из EEPROM-памяти float-данные, находящиеся по адресу «eeAddress»:
  EEPROM.get(eeAddress, f);
  Serial.println(f, 3);    // если извлеченные данные не будут соответствовать типу float, эта функция может вернуть фразу «ovf, nan» 

  /***
    Поскольку EEPROM.get() также возвращает отсылку к «f», всю эту конструкцию можно уместить в одной строке:
    E.g: Serial.print( EEPROM.get( eeAddress, f ) );
  ***/

  /***
    Эту функцию можно использовать и с пользовательскими объектами. 
    Я решил продемонстрировать это в отдельной функции.
  ***/

  secondTest(); // запускаем следующий тест
}

struct MyObject {
  float field1;
  byte field2;
  char name[10];
};

void secondTest() {
  int eeAddress = sizeof(float); // перемещаемся к участку EEPROM-памяти, находящемуся вслед за тем, где хранится переменная «f»

  MyObject customVar; // переменная для хранения данных пользовательского объекта, извлеченных из EEPROM-памяти
  EEPROM.get(eeAddress, customVar);

  Serial.println("Read custom object from EEPROM: "); // "Данные пользовательского объекта, извлеченные из EEPROM-памяти: "
  Serial.println(customVar.field1);
  Serial.println(customVar.field2);
  Serial.println(customVar.name);
}

void loop() {
  /* пустой цикл */
}

См.также

  1. EEPROM.get()
  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 Update – Stores values read from A0 into EEPROM, writing the value only if different, to increase EEPROM life.


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