Вам понадобится
- - Arduino;
- - компьютер.
Инструкция
1
EEPROM означает Electrically Erasable Programmable Read-Only Memory, т.е. электрически стираемое перепрограммируемое постоянное запоминающее устройство. Данные в этой памяти могут храниться десятки лет после отключения питания. Количество циклов перезаписи - порядка нескольких миллионов раз.
Количество EEPROM памяти в Arduino довольно ограничено: для плат, основанных на микроконтроллере ATmega328 (например, Arduino UNO и Nano), количество памяти составляет 1 кБ, для плат на ATmega168 и ATmega8 - 512 байт, на ATmega2560 и ATmega1280 - 4 кБ.
Количество EEPROM памяти в Arduino довольно ограничено: для плат, основанных на микроконтроллере ATmega328 (например, Arduino UNO и Nano), количество памяти составляет 1 кБ, для плат на ATmega168 и ATmega8 - 512 байт, на ATmega2560 и ATmega1280 - 4 кБ.
2
Для работы с EEPROM для Arduino написана специальная библиотека, которая входит в Arduino IDE по умолчанию. Библиотека содержит следующие возможности.
read(address) - считывает 1 байт из EEPROM; address - адрес, откуда считываются данные (ячейка, начиная с 0);
write(address, value) - записывает в память значение value (1 байт, число от 0 до 255) по адресу address;
update(address, value) - заменяет значение value по адресу address, если её старое содержимое отличается от нового;
get(address, data) - считывает данные data указанного типа из памяти по адресу address;
put(address, data) - записывает данные data указанного типа в память по адресу address;
EEPROM[address] - позволяет использовать идентификатор "EEPROM" как массив, чтобы записывать данные в память и считывать их из памяти.
Чтобы задействовать библиотеку в скетче, подключаем её директивой #include EEPROM.h.
read(address) - считывает 1 байт из EEPROM; address - адрес, откуда считываются данные (ячейка, начиная с 0);
write(address, value) - записывает в память значение value (1 байт, число от 0 до 255) по адресу address;
update(address, value) - заменяет значение value по адресу address, если её старое содержимое отличается от нового;
get(address, data) - считывает данные data указанного типа из памяти по адресу address;
put(address, data) - записывает данные data указанного типа в память по адресу address;
EEPROM[address] - позволяет использовать идентификатор "EEPROM" как массив, чтобы записывать данные в память и считывать их из памяти.
Чтобы задействовать библиотеку в скетче, подключаем её директивой #include EEPROM.h.
3
Давайте запишем в память EEPROM два целых числа, а затем прочитаем их из EEPROM и выведем в последовательный порт.
С числами от 0 до 255 проблем нет, они занимают как раз 1 байт памяти и с помощью функции EEPROM.write() записываются в нужную ячейку.
Если число больше, чем 255, то с помощью операторов highByte() и lowByte() его нужно делить на байты и записывать каждый байт в свою ячейку. Максимальное число при этом - 65536 (или 2^16).
Смотрите, монитор последовательного порта в ячейку 0 просто выводит число, меньшее, чем 255. В ячейках 1 и 2 хранится большое число 789. При этом ячейка 1 хранит множитель переполнения 3, а ячейка 2 - недостающее число 21 (т.е. 789 = 3*256 + 21). Чтобы заново "собрать" большое число, разобранное на байты, есть функция word(): int val = word(hi, low), где hi и low - это значения старшего и младшего байтов.
Во всех остальных ячейках, которые не были нами ни разу записаны, хранятся числа 255.
С числами от 0 до 255 проблем нет, они занимают как раз 1 байт памяти и с помощью функции EEPROM.write() записываются в нужную ячейку.
Если число больше, чем 255, то с помощью операторов highByte() и lowByte() его нужно делить на байты и записывать каждый байт в свою ячейку. Максимальное число при этом - 65536 (или 2^16).
Смотрите, монитор последовательного порта в ячейку 0 просто выводит число, меньшее, чем 255. В ячейках 1 и 2 хранится большое число 789. При этом ячейка 1 хранит множитель переполнения 3, а ячейка 2 - недостающее число 21 (т.е. 789 = 3*256 + 21). Чтобы заново "собрать" большое число, разобранное на байты, есть функция word(): int val = word(hi, low), где hi и low - это значения старшего и младшего байтов.
Во всех остальных ячейках, которые не были нами ни разу записаны, хранятся числа 255.
4
Для записи чисел с плавающей запятой и строк нужно использовать метод EEPROM.put(), а для чтения - EEPROM.get().
В процедуре setup() сначала запишем число с плавающей запятой f. Затем сдвинемся на количество ячеек памяти, которое занимает тип float, и запишем строку символов char ёмкостью 20 ячеек.
В процедуре loop() будем считывать все ячейки памяти и пытаться расшифровать их сначала как тип "float", а затем как тип "char", и выводить результат в последовательный порт.
Видно, что значение в ячейках с 0 по 3 правильно определилось как число с плавающей точкой, а начиная с 4-ой - как строка.
Появляющиеся значения ovf (переполнение) и nan (не число) говорят о том, что число не может быть корректно преобразовано в число с плавающей точкой. Если вы точно знаете, какого типа данные какие ячейки памяти занимают, то у вас не будет возникать проблем.
В процедуре setup() сначала запишем число с плавающей запятой f. Затем сдвинемся на количество ячеек памяти, которое занимает тип float, и запишем строку символов char ёмкостью 20 ячеек.
В процедуре loop() будем считывать все ячейки памяти и пытаться расшифровать их сначала как тип "float", а затем как тип "char", и выводить результат в последовательный порт.
Видно, что значение в ячейках с 0 по 3 правильно определилось как число с плавающей точкой, а начиная с 4-ой - как строка.
Появляющиеся значения ovf (переполнение) и nan (не число) говорят о том, что число не может быть корректно преобразовано в число с плавающей точкой. Если вы точно знаете, какого типа данные какие ячейки памяти занимают, то у вас не будет возникать проблем.