Как использовать EEPROM Arduino для сохранения данных между циклами питания
СДЕЛАЙ САМ

Как использовать EEPROM Arduino для сохранения данных между циклами питания

Знаете ли вы, что Arduino может сохранять данные, когда он выключен? Я говорю о EEPROM, так что присоединяйтесь ко мне, и я покажу вам, как читать и записывать в нее данные

Знаете ли вы, что Arduino может хранить данные, когда он выключен? Не скетч, хранящийся во флэш-памяти. Я говорю о переменных данных в EEPROM. Присоединяйтесь ко мне, и я покажу вам, как читать и писать в него, и что он может сделать для ваших проектов

Если вы новичок в Arduino, обязательно ознакомьтесь с нашим руководством для начинающих

Что такое EEPROM?

EEPROM расшифровывается как электрически стираемая программируемая память только для чтения. Это тип энергонезависимой памяти. Не волнуйтесь, если вы не понимаете, что все это значит. Она просто сохраняет данные даже при отключенном питании (в отличие от оперативной памяти, которой для сохранения данных требуется электричество)

EEPROM встроена в огромное количество процессоров, таких как полевая программируемая матрица (FPGA), используемая в Matrix Creator Pi HAT. Во всех Arduinos имеется EEPROM, но емкость варьируется в зависимости от модели. Обязательно ознакомьтесь с нашим руководством по покупке для получения более подробной информации о каждой плате

Как это работает?

EEPROM электрически стирается и программируется с помощью туннелирования Фаулера-Нордгейма. Вам не нужно знать технические детали, чтобы уметь пользоваться этим методом. Основная предпосылка заключается в том, что электричество используется для изменения двоичных данных (что такое двоичные данные). Они могут быть прочитаны, стерты и перезаписаны электронным способом

К счастью, язык Arduino позволяет легко изменять данные, причем для этого не требуется степень в области компьютерных наук

Продолжительность жизни

Хотя использовать EEPROM в Arduino очень просто, его срок службы ограничен.EEPROM рассчитана на 100 000 циклов чтения/стирания. Это означает, что вы можете записать, а затем стереть/перезаписать данные 100 000 раз, прежде чем EEPROM станет нестабильным. В действительности полупроводники Atmel (производители ‘чипа’ Arduino) могут обрабатывать большее или меньшее количество циклов, в зависимости от допусков каждого процессора

Если местоположение было записано и стерто слишком много раз, оно может стать ненадежным. Оно может не возвращать правильные данные или возвращать значение из соседнего бита

Это может показаться большим количеством записей, но при программном чтении и записи (например, в цикле ) можно легко достичь этого предела. Чтение данных не ухудшает работу кремния, только запись. Вы можете читать данные из EEPROM сколько угодно без опасений!

Важно отметить, что это ограничение относится к каждой ячейке памяти. В вашей Arduino может быть 1000 или более ячеек памяти, доступных в EEPROM, поэтому если вы записываете слишком много раз в одну ячейку, это влияет только на нее, а не на все остальные. Позже я буду обсуждать выравнивание износа , которое может уменьшить износ EEPROM путем равномерного распределения данных – то, что используется в SSD

Для чего это полезно?

EEPROM невероятно полезна для ваших проектов Arduino. Поскольку она запоминает данные даже при отключении питания, вы можете хранить состояние Arduino. Возможно, вы сможете построить лазерную турель, которая запоминает свое положение или количество оставшихся ‘патронов’. Вы могли бы использовать его для управления вашими приборами и регистрировать, сколько раз ваш прибор был активирован

EEPROM лучше всего подходит для таких вещей, как настройки или высокие баллы. Если вы хотите регулярно записывать сложные данные, возможно, стоит рассмотреть вариант ethernet shield (со встроенным слотом SD) или Raspberry Pi

Чтение и запись

Теперь, когда с теорией покончено, давайте посмотрим, как читать и записывать некоторые данные! Сначала включите библиотеку (она поставляется с Arduino IDE):

#include <EEPROM.h>

Теперь запишите некоторые данные:

EEPROM.write(0, 12);

Это записывает число 12 в ячейку 0 EEPROM. Каждая запись занимает 3,3 миллисекунды ( ms , 1000ms = 1 секунда). Обратите внимание, что вы не можете записывать буквы ( char ), разрешены только числа от нуля до 255. Вот почему EEPROM идеально подходит для настроек или высоких результатов, но не так хорош для имен игроков или слов. С помощью этого метода можно хранить текст (можно сопоставить каждую букву алфавита с числом), однако для этого потребуется несколько областей памяти – по одной области для каждой буквы

Вот как можно прочитать эти данные:

EEPROM.read(0);

Ноль – это адрес, по которому вы писали ранее. Если вы не писали по адресу ранее, то будет возвращено максимальное значение ( 255 )

Есть несколько более полезных методов. Допустим, вы хотите сохранить десятичную дробь или строку:

EEPROM.put(2,'12. 67');

Это записывает данные в несколько мест – то, что было бы легко написать самому, но не менее удобно. Вам все равно придется следить за тем, сколько мест было записано, чтобы случайно не перезаписать данные! Чтобы получить эти данные снова, нужно использовать метод get :

float f = 0. 00f;EEPROM.get(2, f);

Значение из get сохраняется в переменной float f. Обратите внимание, что она инициализируется значением 0. 00f. f дает компилятору понять, что вы, возможно, захотите сохранить большое число в этой переменной, поэтому он устанавливает некоторые дополнительные настройки во время компиляции

В документации по EEPROM на сайте Arduino есть еще много примеров

Выравнивание износа

Выравнивание износа – это техника, используемая для уменьшения износа и увеличения срока службы EEPROM. Если вы работаете только над небольшим проектом, возможно, вам не нужно беспокоиться об этом

Самое простое, что вы можете сделать для сохранения срока службы EEPROM – это ограничить запись в определенное место. Вы можете сделать это, сначала прочитав адрес, и если значение, которое вы хотите записать, уже присутствует, нет необходимости записывать его снова (помните, чтение данных не приносит вреда). Вот как это можно сделать:

int safeWrite(int data, address) { if(EEPROM.read(address) != data) { EEPROM.write(address, data); }}

Это довольно простой код, однако он работает только для целых чисел! Вместо того, чтобы изобретать колесо, используйте функцию, встроенную в библиотеку Arduino EEPROM:

EEPROM.update(address, val);

Этот метод имеет точно такую же сигнатуру, как и метод write , хотя он может значительно уменьшить количество необходимых записей!

Если вам нужно записывать много данных и вы беспокоитесь об износе кремния, вы можете отслеживать количество записей, хотя при этом используется больше данных. Вот примерная реализация в псевдокоде:

var address = 0var writeCount = 0if(writeCount > 75,000) writeCount = 0 address += 1EEPROM.write(address, data)

Вам нужно будет хранить адрес и writeCount в EEPROM (причем writeCount нужно будет разделить по адресам). В большинстве случаев такой уровень защиты не потребуется. Кроме того, Arduinos очень дешевы, поэтому вам может показаться проще приобрести запасной вариант!

Теперь вы должны знать достаточно, чтобы сделать несколько потрясающих проектов. Дайте нам знать, если у вас получится что-то крутое! Можете ли вы узнать все устройства на картинках? Оставьте нам комментарий ниже!

Об авторе

Алексей Белоусов

Привет, меня зовут Филипп. Я фрилансер энтузиаст . В свободное время занимаюсь переводом статей и пишу о потребительских технологиях для широкого круга изданий , не переставая питать большую страсть ко всему мобильному =)

Комментировать

Оставить комментарий