Как прочитать данные, хранящиеся в EEPROM, хотя он выключен на основе простого кода, который я написал?
Мне нужна помощь в отношении библиотеки EEPROM. Основываясь на приведенном ниже коде, на каждые 2 секунды я хочу хранить int для увеличения
, где он будет продолжать увеличиваться на 1. Затем я загружаю данные на Arduino Nano и открываю последовательный монитор, чтобы он работал около 20 секунд. Последовательный монитор показывает, что Количество увеличений:10
.
Затем я отключаю Arduino Nano, закрываю последовательный монитор, жду 5 секунд, затем подключаю обратно к компьютеру и включаю последовательный монитор, затем последовательный монитор начинает показывать увеличение количества:1
, что указывает на то, что он снова начинает пересчет с 1,2,3,4.....
Я думал, что EEPROM будет хранить последнее число, которое он посчитал, которое составляет 10, а затем, когда я отключаю и подключаю обратно, он должен продолжать считать от 10, 11, 12, .......
Поэтому я хотел бы спросить сообщество, является ли мой код выполнения и метод правильными или нет. Если нет, вы можете посоветовать мне, как я могу выполнить его правильно. Заранее благодарю вас!
#include <EEPROM.h>
int addr=5;
int storagedata;
int increase;
void setup()
{
storagedata=EEPROM.read(addr);
Serial.begin(9600);
timevalue=millis();
}
void loop()
{
if (millis()-timevalue>=2000)
{
increase=increase+1;
EEPROM.update(addr,increase);
storagedata=EEPROM.read(addr);
Serial.print("Increase Count:");
Serial.println(storagedata);
timevalue=millis();
}
}
@Peterhan123, 👍2
Обсуждение3 ответа
Лучший ответ:
увеличение
является глобальной переменной и будет неявно инициализировано нулевым значением. Затем вы считываете данные EEPROM в переменную storagedata
в setup()
. А затем в loop()
вы увеличиваете увеличение
от нуля до единицы и записываете это в EEPROM. Затем это значение считывается обратно в storagedata
. Так что теперь increase
и storagedata
имеют одно и то же значение: один. Таким образом, подсчет начинается при каждом сбросе в 1.
Непонятно, почему у вас даже есть 2 переменные для этого. Одного было бы достаточно (если только вы по какой-то причине не хотите протестировать EEPROM). В setup()
считайте данные в increase
, а затем подсчет начинается с числа в EEPROM.
странно, что некоторые люди считают полезным ответом, @Juraj
@Juraj Я не совсем понимаю, что вы здесь критикуете. Не могли бы вы объяснить это немного подробнее? Разве мой ответ в чем-то нехорош? Или дело в том, что такой простой ответ получает больше голосов, чем более сложные? (Что меня тоже удивляет), @chrisl
Интересно чем же тогда этот ответ полезен для кого то еще ОП, @Juraj
@Juraj По этому поводу мы могли бы провести полноценную дискуссию. Здесь мы часто сталкиваемся с вопросом, от ответов на который другие, скорее всего, не выиграют. У нас есть возможность отклонить эти вопросы и закрыть их или ответить на них, чтобы помочь. Или - если у вас есть ответ на этот вопрос, который также поможет другим - вы можете добавить свой собственный ответ., @chrisl
Эй там, спасибо, что высветили мою ошибку, и я узнал так много из вашего ответа. Исправлена и отлично работает., @Peterhan123
Проблема в том, что вам не удается инициализировать увеличение
во время установки()
. Переменная не определена, когда код входит в функцию loop ()
, даже независимо от того, является ли это первой загрузкой или нет. Вы должны изменить storagedata
на локальную переменную в loop() и использовать увеличение
, чтобы сохранить значение (или наоборот).
Вы никогда не используете значение, которое вы читаете в setup()
. Пройдите через свою функцию loop()
по одной строке за раз:
// при этом не используется значение, считанное в setup, переменные инициализируются до 0
// таким образом, первый раз через этот цикл он установит "увеличение" на 1
increase=increase+1;
// вы обновляете EEPROM со значением 'увеличить', которое составляет 1 первый
// время выполнения
EEPROM.update(addr,increase);
// вы читаете '1', который только что был записан в 'storagedata', у вас есть
// никогда не использовал значение, которое вы прочитали в 'setup()' и теперь перезаписали его
storagedata=EEPROM.read(addr);
Я не уверен, почему у вас есть две отдельные переменные, но в setup()
вам просто нужно
инициализировать увеличение
как значение, считанное из EEPROM:
storagedata=EEPROM.read(addr);
increase=storagedata; // start with stored value instead of default 0
- Arduino EEPROM сохраняет старые данные после прошивки новой программой
- Как увеличить срок службы EEPROM?
- Использование EEPROM в цикле ()
- Запустить код один раз после программирования
- Сохранение EEPROM после программирования на Arduino uno
- Не получается читать из / писать в EEPROM
- Сохранить данные перед выключением
- Чтение и сравнение данных из Arduino Uno EEPROM
Да, это правда. Вот почему я нуждаюсь в руководстве. Спасибо, @Peterhan123