Библиотека EEPROM

Библиотека для arduino

Библиотека eeprom для arduino обеспечивает взаимодействие с внутренней энергонезависимой памятью микроконтроллера на базе AVR в платах arduino. Библиотека предоставляет глобальную переменную EEPROM, которую необходимо использовать для доступа к методам класса.

Библиотека EEPROM входит в состав Arduino IDE. На всякий случай архив с библиотекой тут.

#include <EEPROM.h>

Подключение библиотеки. Добавляется в верхнюю часть скетча.


uint8_t read(address)

Возвращает один байт данных, который хранится по адресу address.

uint8_t value = EEPROM.read(7);

void write(address, value)

Позволяет записать один байт данных value в энергонезависимую память по адресу address. Ничего не возвращает.

EEPROM.write(0, 111); 
EEPROM.write(1, 0x6F);

void update(address, value)

Похожа на функцию write, но данные будут записаны при условии, что значение, на которое указывает адрес address, отличается от значения value. Помогает предотвратить ненужный износ ячеек памяти EEPROM. Ничего не возвращает.

EEPROM.update(0, 234); 
EEPROM.update(1, 0xEA);

put(address, object)

Позволяет записать любой объект object по указанному адресу address в EEPROM память. Пример eeprom_put из библиотеки:

#include <EEPROM.h>             // Подключение заголовочного файла библиотеки EEPROM

struct MyObject {               // Описание структуры MyObject с 3-мя полями
  float field1;                 // Поле field1 тип с плавающей точкой float (4 байта)
  byte field2;                  // Поле field2 тип безнаковый символьный unsigned char (он же uint8_t, он же byte, 1 байт)
  char name[10];                // Поле name массив из 10 элементов типа char (символьный тип) (10 байт)
};

void setup() {
  Serial.begin(9600);           // Иницализация последовательного порта
  while (!Serial) {
    ;                           // Ожидание открытия порта 
  }

  float f = 123.456f;           // Инициализация переменной, которая будет помещена в EEPROM
  int eeAddress = 0;            // Адрес в памяти, где будет хранится вышеупомянутая переменная

  EEPROM.put(eeAddress, f);     // Вызов функции put для записи переменной f в eeprom память

  Serial.println("Записан тип данных с плавающей точкой!");

  MyObject customVar = {        // Инициализация структуры MyObject, описанной выше
    3.14f,                      // Полю field1 присваивается значение 3.14
    65,                         // Полю field2 присваивается значение 65
    "Working!"                  // Полю name присваиваются значения name[0] = "W"; name[1] = "o"; name[2] = "r"; name[3] = "k"; и т.д. name[8] = 0; name[9] = 0;
  };

  /*
   * В нашем случае, тип float занимает 4 байта. Одна ячейка памяти может хранить 1 байт информации.
   * То есть переменная f занимает ячейки 0, 1, 2 и 3. Для того, чтобы не затереть переменную f,
   * необходимо "отступить" 4 ячейки (4 байта). Функция sizeof(float)вычисляет размер типа float в байтах.
   * Т.е. в выражении ниже происходит прибавление к переменной eeAddress (в которой хранится 0) результат
   * выполнения функции sizeof(float) (которая вернет 4)
   */
  eeAddress += sizeof(float);   // В конкретном случае, эквивалентно eeAddress = 4;

  EEPROM.put(eeAddress, customVar); // Запись структуры customVar в память, начиная с адреса 4
  Serial.print("Записан пользовательский тип данных! \n\nПосмотрите пример eeprom_get, чтобы получить значения!");
}

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

get(address, object)

Позволяет получить любой объект object, записанный в EEPROM память по указанному адресу address. Пример eeprom_get из библиотеки:

#include <EEPROM.h>             // Подключение заголовочного файла библиотеки EEPROM

void setup() {
  float f = 0.00f;              // Инициализация переменной f для хранения значения, считанного из памяти
  int eeAddress = 0;            // Адрес памяти, с которого начинается чтение

  Serial.begin(9600);
  while (!Serial) {
    ;                           // Ожидание подключения последовательного порта 
  }
  Serial.print("Чтение значения типа float из EEPROM: ");
  
  EEPROM.get(eeAddress, f);     // Получение значение с плавающей точкой из памяти по адресу eeAddress = 0
  Serial.println(f, 3);         // Вывод значения переменной f в последовательный порт. Может выдать 'nan', если данные в памяти не являются значением с плавающей точкой.

  secondTest();                 // Вызов функции secondTest
}

struct MyObject {               // Описание структуры MyObject, также используется в примере eeprom_put для записи в память
  float field1;                 // Поле 1 - число с плавающей точкой
  byte field2;                  // Поле 2 - 1-байтная переменная
  char name[10];                // Поле 3 - массив из 10-ти элементов символьного типа
};

void secondTest() {
  int eeAddress = sizeof(float);    // Переместить адрес на следующий за числом с плавающей точкой (sizeof вычисляет количество байт, занимаемый тип float в памяти)

  MyObject customVar;               // Переменная для хранения пользовательской структуры MyObject
  EEPROM.get(eeAddress, customVar); // Читаем из памяти

  Serial.println("Чтение пользовательского объекта из EEPROM: ");
  Serial.println(customVar.field1); // Выводим 1-е поле структуры MyObject
  Serial.println(customVar.field2); // Выводим 2-е поле структуры MyObject
  Serial.println(customVar.name);   // Выводим 3-е поле структуры MyObject
}

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

unsigned int length()

Возвращает количество ячеек в EEPROM памяти.

#include "EEPROM.h"

void setup() {
  Serial.begin(9600);
  while(!Serial);
  Serial.println(EEPROM.length());
}

void loop() {}

EEPROM[address]

Этот оператор позволяет обращаться к памяти как к массиву. Ячейки eeprom можно считывать и записывать напрямую, указывая индекс как адрес address ячейки памяти.

#include <EEPROM.h>

uint8_t oldValue, newValue = 17;                            // Переменные для хранения переменных

void setup() {
  Serial.begin(9600);                                       // Инициализация последовательного порта
  while(!Serial);                                           // Ждем открытия порта
  oldValue = EEPROM[0];                                     // Получаем значение с ячейки EEPROM
  Serial.print("В ячейке 0 сейчас хранится значение: ");    
  Serial.println(oldValue);
  delay(500);
  Serial.println("Записываю новое значение в ячейку 0...");
  EEPROM[0] = newValue;                                     // Записываем новое значение
  delay(200);
  Serial.print("Теперь в ячейке 0 хранится значение: ");
  Serial.println(EEPROM[0]);
  delay(200);
  Serial.println("Возвращаю прежнее значение...");
  EEPROM[0] = oldValue;                                     // Возвращаем старое значение
  Serial.println("----------------------------");
}

void loop() {}
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии