Запомнить значение ардуино

Arduino.ru

Как сохранить значение после отключения питания мк?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Доброго времени суток.

Есть программка, она будет работать на роботе и питаться от usb. Во время ее работы будут меняться значения переменных. В какой-то момент робота выключают. Есть ли какие-то варианты как запомнить последнее измененное значение переменной? (чтобы когда робота опять включат он продолжил работать там где остановился).

Писать в файл не подходит, потому что программа не на компе. Может где-то в ардуино можно хранить?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Только после отключения питания не получится. Так что продумайте этот момент.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Как сохранить значение после отключения питания мк?

После отключения уже поздно пить боржом. Никак!

А вот непосредственно перед отключением, когда кнопку отключения уже нажали, но оно еще не обесточилось, тут есть варианты. Про EPPROM Вамужесказали. Если будете использовать с умом, то получится, если без ума, то сами себе злобный буратино.

Есть и другие варианты, но они скорее экзотические.

И да, чем файл-то плох? Присобачьте к ардуине sd-карту и пшите туда хоть всю память.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

После отключения уже поздно пить боржом. Никак!

И да, чем файл-то плох? Присобачьте к ардуине sd-карту и пшите туда хоть всю память.

Нужно хранить всего одно значение, тогда проще независимую память.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Я правильно понимаю, если я в программе запишу допустим EEPROM.write(0,value), залью в ардуино, а потом запишу новый скетч и залью, то в этом новом скетче можно будет вытащить старое значение по адресу 0 от предыдущей программы? (Мне это нужно, чтобы при самом первом запуске нужной программы на роботе значение value в EEPROM было уже не от балды)

EEPROM ограничивает количество перезаписи(100 тыс.), а читать же сколько угодно можно?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Неправильно, если в fuse-бите EESAVE не ноль (unprogrammed) то при всех прочих при заливке нового скетча EEPROM сотрётся (можно подкрутить ключи запуска AVRDUDE, но там ещё искать надо — где и что менять).

Читать — да, можно сколько влезет.

Сразу лезть к avrdude в консоль (или при незнании консоли — в gui-обертку avrdude которая называется SinaProg) не советую. В крайнем случае, можно тренироваться на кошках все операции выполнять в консоли, дописав туда ключ -n (do not write anything, отключить любую запись в микруху полностью)

Вообще с программой непонятка. Вы её так часто перепрошиваете? По хорошему так, ограничения EEPROM тут меркнут, ибо ресурс флеша не 100000 циклов а все 10000. В остальных случаях — правила записи в EEPROM таковы:

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

2. Перед записью — прочитать, если там то же самое что собирались записать — не писать.

Сохранение настройки при исчезновениии питания делается датчиком наличия питания: на ввод питания — диод последовательно + провод по которому отслеживается наличие питания (ADC или компаратор, чтобы отследить просадку ниже 4 В). После диода — большой конденсатор, и арда питается уже от конденсатора. В условии экстренного сохранения — блокировка, то есть флаг, который запрещает любые действия с EEPROM (и условия по штатной работе с EEPROM должны содержать этот флаг, чтобы информация не повредилась при исчезновении питания).

Когда питание отрубится, напряг на конденсаторе начинает падать. ИОН (стабилитрон либо TL431) задаёт образцовое напряжение компаратора или ADC (провод AREF). Как только конденсатор становится меньше образцового (допустим 4.000 В), считаем что надо экстренно сохранить, делаем следующие действия:

1. Прочитать то, куда будем писать.

2. Если совпадает не пишем.

4. Включаем флаг запрета работы с EEPROM.

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

После этого ничего не делаем или продолжаем работать. Потом конденсатор кончится и всё погаснет. Потом когда питание включат, кондёр снова нальётся, АЦП/компар будет видеть что входное напряжение больше чем напр. срабатывания (4.000) и всё работает штатно. Пропадёт снова — снова кондёр начинает сдуваться, и АЦП/компаратор сработает.

4.000 это не четыре тысячи, это четыре целых ноль десятых ноль сотых ноль тысячных.

Диод лучше Шоттки, ёмкость конденсатора без светодиодов достаточно 1500 мкФ, со светодиодами — не менее 4700 мкФ, со штатной ардой формфактора Uno/Duemilanove которая не переделывалась (микросхема сериал моста, светики, автовыбор питания) — не менее 10000 мкФ.

Источник

Как хранить данные в 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).

Запись целых чисел в 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

Как известно, сердцем Ардуино Уно является микроконтроллер фирмы Atmel — Atmega328. И как и любой микроконтроллер, Atmega328 имеет в своем составе несколько видов памяти. Каждый тип имеет свои особенности и свое предназначение.

Flash — энергонезависимая память, предназначенная для хранения программы. Эта память больше подходит для чтения данных, чем для их записи. Флэш-память в Atmega328 имеет 10 тысяч циклов перезаписи. Предполагается, что запись в эту память ведется редко, только во время создания устройства или при обновлении прошивки.

SRAM — оперативная энергозависимая память, которая нужна для хранения переменных во время работы устройства. Она очень быстрая, но полностью стирается при выключении питания.

EEPROM — энергонезависимая память, предназначенная для журналирования и хранения разного рода настроек. В отличие от Флэш памяти, она имеет 100 тысяч циклов перезаписи.

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

Сколько памяти у Ардуино?

Размер памяти у микроконтроллера Atmega328:

  • Flash: 32 кб;
  • SRAM: 2 кб;
  • EEPROM: 1 кб;
  • регистры: в сумме 256 байт.

Для сравнения, у Ардуино Мега памяти гораздо больше:

Как видим, EEPROM в Arduino Уно всего 1 килобайт. Что можно хранить в таком объеме? Предположим, мы собираемся хранить значение ручек регулировки, подключенных к аналоговым входам Ардуино. Каждая такая ручка дает число от 0 до 1024 и требует 2 байта для хранения (по факту 1 байт и 2 бита, но для простоты используем 2б ), получается в EEPROM мы можем хранить значения 512 ручек настройки!

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

Программа

Напишем программу, которая будет хранить значение счетчика нажатий кнопки. То есть каждый раз, когда мы нажимаем кнопку, переменная счетчика увеличивается на единицу и сохраняет свое значение в EEPROM. Чтобы проверить программу нам понадобится собрать стенд из урока про кнопки.

Для работы с EEPROM используется стандартная библиотека EEPROM.h. Запись и чтения в эту память ведется побайтово. Это значит, что за раз мы можем записать и считать число от 0 до 255. Запись одного байта осуществляется с помощью функции write:

Здесь адрес — индекс ячейки памяти, который может принимать значение от 0 до 1023. Максимальный адрес можно легко вычислить зная размер EEPROM у конкретного микроконтроллера: 1кб = 1024 байта, значит максимальный адрес 1024 — 1. Либо можно использовать функцию length — размер памяти, тогда максимальный адрес будет EEPROM.length() — 1.

Второй аргумент значение — это число, которое мы хотим сохранить в ячейке с индексом «адрес«.

Чтение байта осуществляется с помощью функции read:

Итак, пишем программу.

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

Теперь отключим плату Ардуино от питания, затем снова включим и откроем монитор.

Участок кода в конце функции setup считал байт из нулевой ячейки EEPROM памяти и вывел его в порт. Работает!

Запись и чтение int и float

Что делать, если нам нужно сохранить переменную типа integer, long или float? Для этих целей в библиотеке EEPROM есть две специальные функции: put и get. Первая позволяет записать в память переменную любого типа, вторая — считать из памяти.

В отличие от однобайтовых функций write и read, в случае использования put и get легко запутаться в адресации. Так, при записи целого типа (int) с помощью put мы займем два байта памяти. И чтобы по-очереди записать два числа нужно будет прибавить к адресу двойку:

Если решим сохранить переменную типа long, то уже потребуется 4 байта. В общем, нужно всегда знать размер переменной, которую хотим разместить в EEPROM, или уметь его вычислять функцией sizeof.

Хорошим примером работы функций put и get послужит сохранение в EEPROM показаний поворотного потенциометра, подключенного к аналоговому входу Ардуино. Предположим, у нас есть прибор с одним потенциометром, с помощью которого настраиваются три коэффициента какого-нибудь PID-регулятора. Как нам уже известно, плата Ардуино Уно имеет 10-разрядный АЦП. Для чтения АЦП мы используем функцию analogWrite, которая вернет целый тип int — а это два байта.

Данная программа постоянно считывает значение с контакта A0 и при нажатии кнопки сохраняет его в EEPROM. После первого нажатия, значение сохраняется в ячейки с адресами 0,1. После второго — 2,3. После третьего — 4,5.

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

Настроив таким образом все три числа, отключим Ардуино от компьютера, а затем снова включим и откроем монитор последовательного порта.

Готово! Теперь можно не настраивать устройства каждый раз после подачи питания, а использовать EEPROM.

Надо заметить, что put и get умеют работать не только с естественными типами int, float, long, char, byte, но и со структурами. Для оценки их размера лучше использовать упомянутую функцию sizeof.

Источник

Adblock
detector