Меню

arduino где хранить настройки

Как постоянно хранить данные на вашем Arduino

Узнайте, как использовать внутреннюю EEPROM вашего Arduino и как добавить дополнительную память для постоянного хранения данных.

Комплектующие

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

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

Поддерживаемые платы Arduino

В следующей таблице указано, сколько данных может хранить каждый MCU (Microcontroller Unit — микроконтроллер):

Микроконтроллер Размер EEPROM
ATmega328P 1 Кб
ATmega168 и ATmega8 512 байт
ATmega1280 и ATmega2560 4 Кб
Arduino / Genuino 101 1 Кб (эмулируется)

Взаимодействие со встроенной EEPROM

EEPROM расшифровывается как электронно стираемое программируемое постоянное запоминающее устройство (англ. Electrically Erasable Programmable Read-Only Memory). Хотя вы можете перезаписать данные на чипе, вы сможете сделать это только ограниченное количество раз, прежде чем он начнет работать со сбоями. Тем не менее, вы можете читать с него столько раз, сколько захотите.

Метод записи write()

В следующем примере показано, как можно сохранить байт.

Используйте метод write() вместе с адресом и значением, которое вы хотите сохранить. Адрес должен быть значением от нуля до EEPROM.length()-1 , и он сообщает MCU, где хранить значение.

Метод read()

Следующий пример читает байт из EEPROM:

Метод read() также примет адрес в качестве параметра и вернет значение в виде байта.

Очистка памяти

Чтобы очистить память, сохраняйте ноль в каждой позиции EEPROM:

Пример «Hello World»

Следующий код очистит EEPROM и сохранит в нем «Hello World!» перед записью строки в консоль:

Использование внешнего EEPROM

Если вы не используете Arduino или хотите иметь дополнительное место для хранения, вы можете использовать внешнюю EEPROM IC для хранения байтов. В этом примере мы будем использовать 4LC16B (PDF), который является 162 КБ EEPROM I2C.

Схема соединения проста и вам нужно всего лишь добавить нагрузочный резистор 100 кОм и подключить микросхему к Arduino (или любому другому MCU, который вы хотите использовать):

Седьмой вывод этой микросхемы — индикатор защиты от записи. Подключите этот вывод к GND, если вы хотите записать в память. Если он высокий, чип не сохранит никаких данных. Чтение возможно независимо от состояния пина.

Связь с внешней памятью

Настраивая связь между Arduino и внешней памятью, все становится сложнее по сравнению со встроенной памятью.

Спецификация IC 4LC16B точно описывает, как связаться с ней для хранения данных. Используйте скетч ниже для связи с внешней EEPROM. Я протестировал его с вариантом 16 КБ, но он должен работать с любым другим размером (от этого производителя), если связь работает одинаково:

Память состоит из восьми блоков по 256 байт, и каждый блок может быть адресован напрямую. DEVICE_BASE_ADDRESS (0x50) представляет первый, а 0x57 — последний блок.

Разные чипы тоже имеют разные базовые адреса. Обратитесь к таблице данных вашей EEPROM и обновите код, если это необходимо.

Читайте также:  настройка вебасто ленд ровер

Еще один пример «Hello World»

Эта программа сохранит «Hello World» на первой странице первого блока на внешней EEPROM, а затем прочитает весь первый блок и выведет его на консоль:

Выполнение этого примера даст вам следующий результат (или что-то похожее в зависимости от содержимого вашей EEPROM):

Понимание EEPROM важно для начинающих

Этот очень простой проект идеально подходит для начинающих, которые хотят узнать о памяти и коммуникациях I2C (и всех, кто хочет повысить свое мастерство), потому что он позволяет вам постоянно хранить информацию на вашем Arduino (или другом MCU) даже без питания.

Знание того, как хранить информацию, делает ваши проекты мобильными, а также дает вам уверенность в том, что самые важные части вашего проекта хранятся независимо от того, подключена ли ваша плата к питанию или нет.

источник

Как хранить данные в Arduino

У плат семейства плат Arduino есть несколько видов памяти. Во-первых, это статическое ОЗУ (оперативное запоминающее устройство), которая используется для хранения переменных в процессе выполнения программы. Во-вторых, это флеш-память, в которой хранятся написанные вами скетчи. И в-третьих, это EEPROM, которую можно использовать для постоянного хранения информации. Первый тип памяти – энергозависимый, он теряет всю информацию после перезагрузки Arduino. Вторые два типа памяти хранят информацию пока она не будет перезаписана новой, даже после отключения питания. Последний тип памяти – EEPROM – позволяет записывать данные, хранить их и считывать при необходимости. Эту память мы и рассмотрим сейчас.

Инструкция по использованию EEPROM в Arduino

1 Описание памяти EEPROM

EEPROM означает Electrically Erasable Programmable Read-Only Memory, т.е. электрически стираемое перепрограммируемое постоянное запоминающее устройство. Данные в этой памяти могут храниться десятки лет после отключения питания. Количество циклов перезаписи – порядка нескольких миллионов раз.

2 Библиотека EEPROM

Функция Назначение
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

Если число больше, чем 255, то с помощью операторов highByte() и lowByte() его нужно делить на байты и записывать каждый байт в свою ячейку. Максимальное число при этом – 65536 (или 2 16 ).

Смотрите, монитор последовательного порта в ячейку 0 просто выводит число, меньшее, чем 255. В ячейках 1 и 2 хранится большое число 789. При этом ячейка 1 хранит множитель переполнения 3, а ячейка 2 – недостающее число 21 (т.е. 789 = 3×256 + 21).

Читайте также:  настройка часов q50 дата и время

Запись целых чисел в EEPROM Arduino

Чтобы заново «собрать» большое число, разобранное на байты, есть функция word(): int val = word(hi, low), где «hi» и «low» – это значения старшего и младшего байтов числа «val».

Во всех остальных ячейках, которые не были нами ни разу записаны, хранятся числа 255.

4 Запись чисел с плавающей запятой и строк в EEPROM

Для записи чисел с плавающей запятой и строк нужно использовать метод EEPROM.put(), а для чтения – EEPROM.get().

В процедуре setup() сначала запишем число с плавающей запятой «f». Затем сдвинемся на количество ячеек памяти, которое занимает тип «float», и запишем строку символов «char» ёмкостью 20 ячеек.

В процедуре loop() будем считывать все ячейки памяти и пытаться расшифровать их сначала как тип «float», а затем как тип «char», и выводить результат в последовательный порт.

Запись чисел с плавающей запятой в EEPROM Arduino

Видно, что значение в ячейках с 0 по 3 правильно определилось как число с плавающей точкой, а начиная с 4-ой – как строка.

Появляющиеся значения ovf (переполнение) и nan (не число) говорят о том, что значение в ячейке памяти по этому адресу не может быть корректно преобразовано в число с плавающей точкой. Если вы точно знаете, какого типа данные какие ячейки памяти занимают, то у вас не будет возникать проблем.

5 Работа с EEPROM как с массивом

Очень удобная возможность – обращение к ячейкам памяти как к элементам массива EEPROM. В данном скетче в процедуре setup() мы сначала запишем данные в 4 первых байта, а в процедуре loop() ежеминутно будем считывать данные из всех ячеек и выводить их в последовательный порт.

Работа с ячейками памяти EEPROM Arduino как с элементами массива

источник

Пример использования EEPROM. Хранение настроек в arduino

Не всегда есть возможность полностью отладить устройство и прошить с нужными настройками. Это может быть связано с разными факторами: иногда подстройка производится только после установки девайса, иногда просто со временем нужно внести корректировки в работу и т.д. Для таких случаев можно использовать подстроечные резисторы, но это не всегда удобно, например, если придется менять сразу десяток конфигураций. В таких случаях можно воспользоваться, встроенной в arduino, энергонезависимой памятью – EEPROM. Ей не страшно отсутствие питания или перезагрузки устройства, данные останутся в памяти.
Я как-то писал статью про подстроечный резистор и обещал продолжение. Пришло время сдержать обещание и немного расширить функционал из старой статьи.

Энергонезависимая память EEPROM и arduino

EEPROM – это запоминающее устройство, которое позволяет хранить данные десятки лет с отключенным питанием. Перезаписывать данные можно довольно много раз, но не бесконечно. В одних источниках пишут, что EEPROM позволяет осуществлять до нескольких миллионов циклов перезаписи, а где-то пишут, что не больше ста тысяч. В любом случае, этого количества с лихвой должно хватить, если использовать с умом.
Arduino уже имеет встроенную EEPROM и управлять ею очень просто. В зависимости от версии arduino, объем памяти отличается:
— Платы с микроконтроллерами ATmega8 и ATmega168 используют EEPROM с объемом памяти в 512 байт.
— Платы с ATmega328 используют EEPROM с объемом 1 кб
— Платы на ATmega1280 и ATmega2560 имеют EEPROM с объемом в 4 кб
Для хранения настроек и других не больших массивов данных, даже 512 байт будет достаточно. Но если вы решите хранить какие-то огромные значения, не помещающиеся даже в 4 кб, то всегда можно купить дополнительную микросхему EEPROM и подключить ее к arduino. Такие микросхемы способны хранить, куда больший объем, чем встроенные. Главное при выборе обращать внимание на совместимость с arduino и способность работать с 8-битным микроконтроллером. Например, можно использовать 24LC256.

Читайте также:  настройка mark 3 что такое all i

Подстроечный резистор и EEPROM

Чтобы было понятней, как работает EEPROM и как ее использовать, попробуем реализовать небольшой пример. Подключим к ардуино подстроечный резистор, кнопку и пять светодиодов(не забыв про резисторы, чтобы не сжечь светодиоды). И напишем небольшой скетч: по нажатию на кнопку будем считывать значения с подстроечного резистора и конвертировать их в число от 0 до 4х. По повторному нажатию на кнопку, будем сохранять полученное значение в EEPROM. И уже в зависимости от записанного значения, зажжем соответствующее количество светодиодов. Если после перезагрузки или после отключения питания arduino, будет гореть нужное количество огоньков, значит все работает и эксперимент можно считать успешным.
Чтобы было понятней, ниже приведена схема подключения всех элементов.

Скетч записи и чтения данных из EEPROM

Для работы EEPROM в arduino IDE уже есть встроенная библиотека EEPROM.h, ее и будем использовать. Вся память разбита на ячейки по 1 байту, соответственно в каждую ячейку можно записать не больше одного байта, если хранить целые числа, то можно записывать значения от 0 до 255 без сложностей. Этим мы и займемся в скетче – используем одну ячейку памяти и сначала сохраним в нее число от 0 до 4, а потом прочитаем содержимое.
Если вам необходимо хранить значения, превышающие размер в 1 байт, то их придется разбивать по байтам и записывать в разные ячейки по частям.
Обратите внимание: по умолчанию в пустой EEPROM в каждой ячейке хранятся значения 255. Но делать проверку на пустоту с помощью сравнения с числом 255 не стоит. Поскольку не всегда можно полагаться на заводские настройки. И перед использованием лучше прогнать все ячейки в цикле и записать в них свои значения для обнуления, чтобы быть полностью уверенным в содержимом.
Далее остается только привести скетч с подробными комментариями:

Послесловие

Я заказал себе в стране Великого Дракона десяток 24LC256, чтобы можно было поэкспериментировать с внешней EEPROM. Как посылка приедет и я «наиграюсь» с микросхемой, то постараюсь написать статью и поделиться опытом.

источник

Добавить комментарий

Adblock
detector