Бывают случаи, когда микроконтроллер должен хранить определенные данные, например, показания датчиков или настроечные параметры, довольно продолжительный период времени. Но после отключения питания память данных микроконтроллера стирается, что не подходит для данной задачи. Поэтому зачастую для такой цели долговременного хранения используют энергонезависимую память EEPROM.

В Arduino также есть EEPROM, поскольку в основе Arduino лежит микроконтроллер ATmega. Это позволяет хранить данные без риска потерять их после выключения питания или перезагрузки платы. В этом материале на примере сохранения текстовой информации будет показано как работать с EEPROM в Arduino.
Сначала нужно упомянуть об ограничениях, присущих EEPROM. Во-первых, размер этой энергонезависимой памяти сильно лимитирован. Он меньше памяти данных и памяти программ, и, как правило, составляет всего несколько килобайт. Но этого должно хватить для не слишком ресурсоемких приложений. Во-вторых, количество циклов чтения/записи у EEPROM также заметно ограниченно и, как правило, не превышает 10000 циклов, поэтому работать с этой памятью нужно аккуратно и рационально и не записывать в нее слишком часто.
Для работы с функциями энергонезависимой памяти в среде Arduino IDE имеется библиотека EEPROM.h. С помощью этой библиотеки работать с EEPROM в Arduino очень просто. Для записи в память служит функция EEPROM.write(address, data). В аргумент address записывается адрес ячейки памяти, в которую будут записаны данные, представляемые вторым аргументом data. Для чтения данных из энергонезависимой памяти служит функция EEPROM.read(address), имеющая всего лишь один аргумент address, указывающий на адрес ячейки памяти, из которой нужно прочитать данные.
Для того, чтобы попрактиковаться с EEPROM в Arduino можно сделать небольшой проект. В этом примере мы сначала считаем все ячейки энергонезависимой памяти. Если в них что-то есть, то это будет выведено в последовательный порт. Далее вся ячейки будут заполнены пробелами. Также будет возможность ввести текст через монитор последовательного порта. Этот текст тоже будет записан в EEPROM, и при последующем включении его можно будет считать. Все эти процедуры выполняются не в основном (бесконечном) цикле программы loop, а в процедуре setup(), чтобы не тратить лишний раз ресурс памяти. В основном цикле только каждую секунду мигает светодиод, подключенный к выводу 6 через токоограничивающий резистор 1 КОм. Код программы Arduino для работы с EEPROM приведен ниже.
#include <EEPROM.h>
int address = 0; // адрес eeprom
int read_value = 0; // считываемые с eeprom данные
char serial_in_data; // данные последовательного порта
int led = 6; // линия 6 для светодиода
int i;
void setup()
{
pinMode(led, OUTPUT); // линия 6 настраивается на выход
Serial.begin(9600); // скорость передачи по последовательному порту 9600
Serial.println();
Serial.println("PREVIOUS TEXT IN EEPROM :-");
for(address = 0; address < 1024; address ++) // считываем всю память EEPROM
{
read_value = EEPROM.read(address);
Serial.write(read_value);
}
Serial.println();
Serial.println("WRITE THE NEW TEXT : ");
for(address = 0; address < 1024; address ++) // заполняем всю память EEPROM пробелами
EEPROM.write(address, ' ');
for(address = 0; address < 1024; ) // записываем пришедшие с последовательного порта данные в память EEPROM
{
if(Serial.available())
{
serial_in_data = Serial.read();
Serial.write(serial_in_data);
EEPROM.write(address, serial_in_data);
address ++;
digitalWrite(led, HIGH);
delay(100);
digitalWrite(led, LOW);
}
}
}
void loop()
{
//---- мигаем светодиодом каждую секунду -----//
digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, LOW);
delay(1000);
}
© digitrode.ru