ESP8266 использует EEPROM для хранения значения 100 000

Я использую Wemos mini в своем проекте. Я хочу сохранить логическое значение в ячейке #0, которое меняется при каждой загрузке.

Поскольку запись в EEPROM ограничена примерно 100 000 циклов, я хочу сохранить в ячейке № 1 количество циклов записи, выполненных до сих пор, поэтому при достижении 100 000 значение будет сохранено в ячейке № 2, а циклы записи будут сохранены. в ячейке №3 и т. д.

Чтение и запись с использованием #include <EEPROM.h> выполняется по мере необходимости, но, поскольку каждая ячейка может хранить байт, она может достигать только 255.

Мой вопрос заключается в том, как сохранить значение 10 ^ 6 (кроме преобразования его в a * 2 ^ 0 + b * 2 ^ 1 + c * 2 ^ 2 + d * 2 ^ 3....).

Парень

ИЗМЕНИТЬ1

Часть или соответствующий код:

void setup() {
        Serial.begin(9600);
        Serial.println("BEGIN:");
        if (HARD_REBOOT) {
                EEPROM.begin(1024);
        }
        if (HARD_REBOOT) {
                EEPROM.write(0,100000);
                EEPROM.commit();
                delay(50);
                Serial.print("value in flash: ");
                Serial.println(EEPROM.read(0));
        }
}

и его вывод:

Ȥl⸮⸮BGS[⸮<b8ɗ⸮BEGIN:
22:40:58.732 -> value in flash: 160

, 👍0

Обсуждение

Комментарии не для расширенного обсуждения; этот разговор был [перемещен в чат](https://chat.stackexchange.com/rooms/98432/discussion-on-question-by-guy-d-esp8266-using-eeprom-to-store-a-value- из-100-0)., @VE7JRO


2 ответа


2

У esp нет EEPROM, но он эмулирует его во флэш-памяти. Поэтому 100 000 циклов не применяются, это больше похоже на 10 000 циклов для флэш-памяти.

Самый простой способ подготовить тип данных для хранения в виде байтов — использовать union следующим образом:

union Converter{
  uint32_t ui32;
  byte eeprom_bytes[4];
}convert;

void convert_for_eeprom (uint32_t your_number) {
  convert.ui32=your_number;
  // convert.eeprom_bytes содержит 4-байтовое представление вашего номера, запишите их в eeprom
}

uint32_t convert_from_eeprom () {
  // прочитать четыре байта из eeprom и присвоить их convert.eeprom_bytes
  return convert.ui32;
}

Обратите внимание, что это не преобразование типов, и значение convert.eeprom_bytes не предназначено для обработки, так как они просто интерпретируются так, как если бы они были массивом из четырех байтов, на самом деле эти байты содержат «тупые» значения. Таким образом, вы можете "преобразовать" любой тип данных для побайтового хранения и обратного чтения соответственно.

Еще один способ преобразования 32-битного целого числа в 4 байта — использование побитовых операций:

uint32_t your_number=100000;
byte b1=your_number;
byte b2=your_number>>8;
byte b3=your_number>>16;
byte b4=your_number>>24;

Но это имеет смысл только для целых чисел, и я предлагаю обратить внимание на union.

,

EEPROM.put() может записывать любой тип. это самый простой способ, @Juraj


2

для сохранения любой переменной в EEPROM используйте EEPROM.put(), чтобы прочитайте его, используя EEPROM.get(). пример

EEPROM.put(EEPROM_COUNT_ADDR, количество);

EEPROM.get(EEPROM_COUNT_ADDR, количество);

На esp8266 EEPROM эмулируется во flash и там вся страница стирается. Библиотека EEPROM для esp8266 делает то, что можно сделать для защиты флэш-страниц, используемых для EEPROM. эмуляция.

,

Но все еще можно использовать «положить» и «получить»?, @Guy . D

да. библиотека EEPROM esp8266 также имеет функции put() и get()., @Juraj

подставить write в put, было нормально, но при использовании get получилось: ошибка: нет подходящей функции для вызова 'EEPROMClass::get(int)' Serial.println(EEPROM.get(0));, @Guy . D

EEPROM.get(EEPROM_COUNT_ADDR, количество); ! Используйте второй параметр для переменной, которая будет заполнена., @Juraj

@Guy.D, это работает?, @Juraj