Освой Arduino играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Библиотека EEPROM

Микроконтроллеры ATmega имеют на борту энергонезависимую память EEPROM, не теряющую записанные в неё данные даже после отключения питания.

512 байтов такой памяти несут ATmega8 и ATmega168, 1024 байта — ATmega328, 4096 байтов — Arduino Mega.

Память типа EEPROM допускает несколько десятков тысяч циклов записи и стирания данных. Она может пригодиться для сохранения изменяющихся настроек при отключении питания от устройств Arduino. Для работы с этой памятью в составе Arduino IDE имеется библиотека EEPROM.

Функции EEPROM

read(address) считывает байт из EEPROM. Ячейки, которые никогда не были записаны, содержат значение 255. В параметре указывается порядковый номер ячейки памяти для чтения от 0 до 512 (или 1024) (int). Возвращается байт - значение, записанное в ячейку (byte).

write(address, value) записывает байт в энергонезависимую память. В параметрах указываются порядковый номер адреса ячейки для записи (address) с 0 до 511 (int) и значение для записи (value) от 0 до 255 (byte). Ничего не возвращается. Запись в EEPROM занимает 3,3 мс. Внимание, память EEPROM обладает жизненным циклом 100 000 операций записи/стирания, поэтому, следует быть осторожными с тем, как часто записываете её. Данные значения останутся в памяти и после отключения питания от платы и в будущем могут быть доступны для другого скетча.

update(address, value) записывает байт в EEPROM. Значение записывается, только если оно отличается от значения уже записанного по этому адресу. В параметрах указываются адрес ячейки для записи (address), начинается с 0 (int) и значение для записи (value), от 0 до 255 (byte). Ничего не возвращается. Запись в EEPROM занимает 3,3 мс. Внимание, память EEPROM обладает жизненным циклом 100 000 операций записи/стирания, поэтому данная функция, в отличие от write(), может сохранить время, если записываемые данные часто не меняются.

get(address, data) считывает любой тип данных или объект из EEPROM. В параметрах используются адрес для чтения (address), начинается с 0 (int) и данные для чтения (data), которые могут быть примитивным типом (например, float) или пользовательской структурой struct. Возвращается ссылка на переданные данные.

put(address, data) записывает любой тип данных или объект из EEPROM. В параметрах используются адрес для записи (address), начинается с 0 (int) и данные для записи (data), которые могут быть примитивным типом (например, float) или пользовательской структурой struct. Возвращается ссылка переданные данные. Функция использует EEPROM.update() для реализации записи, поэтому она не перезаписывает значение, если оно не изменилось.

EEPROM[address] позволяет использовать идентификатор 'EEPROM', как массив. Ячейки EEPROM могут быть прочитаны и записаны непосредственно с помощью этого оператора. В параметре используется адрес для чтения/записи (address), который начинается с 0 (int). Возвращается ссылка на ячейку EEPROM.

В составе Android IDE входит несколько примеров с применением библиотеки.

Чтение


#include <EEPROM.h>

// начальный адрес памяти EEPROM
int address = 0;
byte value;

void setup()
{
    Serial.begin(9600);
}

void loop()
{
    // считываем значение по текущему адресу EEPROM
    value = EEPROM.read(address);
    Serial.print(address);
    Serial.print("\t");
    Serial.print(value, DEC);
    Serial.println();
    // устанавливаем следующую ячейку памяти
    address = address + 1;
    // EEPROM содержит всего 512(1024) байт
    // если адрес достиг 512(1024), то снова переходим на 0
    if (address == 512)
    address = 0;
    delay(500);
}

Запись


#include <EEPROM.h>
// текущее значение адреса EEPROM
int addr = 0;

void setup()
{;}

void loop()
{
    if (addr < 512)
    {
        // EEPROM может хранить только значения от 0 до 255.
        int val = map(analogRead(0), 0, 1024, 0, 256);
        // записываем значение в энергонезависимую память
        EEPROM.write(addr, val);
        // устанавливаем следующую ячейку памяти.
        addr = addr + 1;
    }
}

Область применения - запись шифра для кодового замка, который можно менять при необходимости.

Реклама