Как прочитать данные, хранящиеся в 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();
  }
}

, 👍2

Обсуждение

Да, это правда. Вот почему я нуждаюсь в руководстве. Спасибо, @Peterhan123


3 ответа


Лучший ответ:

7

увеличение является глобальной переменной и будет неявно инициализировано нулевым значением. Затем вы считываете данные EEPROM в переменную storagedata в setup(). А затем в loop() вы увеличиваете увеличение от нуля до единицы и записываете это в EEPROM. Затем это значение считывается обратно в storagedata. Так что теперь increase и storagedata имеют одно и то же значение: один. Таким образом, подсчет начинается при каждом сбросе в 1.

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

,

странно, что некоторые люди считают полезным ответом, @Juraj

@Juraj Я не совсем понимаю, что вы здесь критикуете. Не могли бы вы объяснить это немного подробнее? Разве мой ответ в чем-то нехорош? Или дело в том, что такой простой ответ получает больше голосов, чем более сложные? (Что меня тоже удивляет), @chrisl

Интересно чем же тогда этот ответ полезен для кого то еще ОП, @Juraj

@Juraj По этому поводу мы могли бы провести полноценную дискуссию. Здесь мы часто сталкиваемся с вопросом, от ответов на который другие, скорее всего, не выиграют. У нас есть возможность отклонить эти вопросы и закрыть их или ответить на них, чтобы помочь. Или - если у вас есть ответ на этот вопрос, который также поможет другим - вы можете добавить свой собственный ответ., @chrisl

Эй там, спасибо, что высветили мою ошибку, и я узнал так много из вашего ответа. Исправлена и отлично работает., @Peterhan123


5

Проблема в том, что вам не удается инициализировать увеличение во время установки(). Переменная не определена, когда код входит в функцию loop (), даже независимо от того, является ли это первой загрузкой или нет. Вы должны изменить storagedata на локальную переменную в loop() и использовать увеличение, чтобы сохранить значение (или наоборот).

,

0

Вы никогда не используете значение, которое вы читаете в 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
,