Использование EEPROM для записи значения счетчика

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

Я написал этот код, но значение, похоже, не записывается в EEPROM. Увеличение счетчика работает нормально.

#include <EEPROM.h>
#include <Adafruit_RGBLCDShield.h>
#include <utility/Adafruit_MCP23017.h>
Adafruit_RGBLCDShield lcd = Adafruit_RGBLCDShield();

int addr = 0;
byte value;

void setup() {
  lcd.begin(16, 2);
  lcd.setCursor(0,0);
}

int a;  
void loop() {
  uint8_t buttons = lcd.readButtons();
  if (buttons) {

    lcd.clear();
    lcd.setCursor(0,0);

    if (buttons & BUTTON_UP) {
      a+= 1;
      EEPROM.write(addr, a);
      value = EEPROM.read(addr);
      lcd.print(value);
      delay(100);
    }
  }
}

Спасибо за помощь!

, 👍3

Обсуждение

Единственный раз, когда вы читаете EEPROM, это сразу после его записи, что бессмысленно. Вам нужно EEPROM.read () в setup (), если вы хотите, чтобы значение было восстановлено во время загрузки., @Edgar Bonet

Это сделало свое дело. Цени это, парень!, @Jon Goe

Кроме того, вам нужно только одно значение для хранения счетчика, а не два. Либо а, либо "ценность" - выбирайте сами., @Majenko

EEPROM.read и EEPROM.write считывают и записывают только один байт. Вы можете использовать EEPROM.put и EEPROM.get для чтения и записи (беззнакового) int или (беззнакового) long., @Jot

Я вижу, вы всегда используете адрес 0, поскольку EEPROM имеет ограниченное время записи (например, 10K или около того), возможно, лучше использовать разностные адреса. 10 тысяч нажатий - это много, но, вероятно, не нереально в течение длительного времени., @Michel Keijzers

@MichelKeijzers: EEPROM рассчитан на 100 тыс. циклов записи., @Edgar Bonet

Мой обычный метод EEPROM заключается в установке переменной желаемого значения вместе с переменной метки времени. Сбрасывайте переменную метки времени при каждом нажатии кнопки. Затем, когда с момента последнего нажатия пройдет определенное время, запишите значение в EEPROM. Таким образом, если вы нажмете кнопку 50 раз подряд, вы получите только одну запись в EEPROM. Задержка на пару секунд при записи работает хорошо., @Majenko


1 ответ


1

просто добавьте a = EEPROM.read(addr); в вашей настройке вы также можете удалить значение байта и использовать a, которое вы записали в память в предыдущей строке

,