Сохранение в EEPROM ESP8266

tsv_33
Offline
Зарегистрирован: 11.04.2019

Уважаемые знатоки, делаю термостат, код описан в теме http://arduino.ru/forum/programmirovanie/termostat-opentherm-na-esp8266#comment-468395 Задался целью сохранения уставок. С EEPROM работаю впервые. За самоучитель взял тему http://arduino.ru/forum/programmirovanie/zapis-i-chtenie-eeprom-peremennykh-tipa-float-unsigned-long-long-unsigned-int Вроде всё работает. Но всё ли правильно, не будет ли затираться память. Гляньте пожалуйста.

Библиотека подключена:

#include <EEPROM.h>

Переменные для кода задекларированы:

float sp = 20;
int adrr = 0;
bool NeedCommit = false; //Флаг необходимости сохранения настроек в EEPROM

Функция Commit EEPROM, если это необходимо:

void EEPROM_commit() {
  if (NeedCommit) {
    EEPROM.commit();
    NeedCommit = false;
  }
}

В setup:

EEPROM.begin(512);
sp = EEPROM_float_read(0);

В loop:

if (EEPROM_float_read(0) != sp) {
      EEPROM_float_write(0, sp);
      NeedCommit = true;
      Serial.println(sp, 4); // Для контроля
    }

После loop:

// чтение float
float EEPROM_float_read(int addr) {
  byte raw[4];
  for (byte i = 0; i < 4; i++) raw[i] = EEPROM.read(addr + i);
  float &num = (float&)raw;
  return num;
}
// запись float
void EEPROM_float_write(int addr, float num) {
  if (EEPROM_float_read(addr) != num) { //если сохраняемое отличается
    byte raw[4];
    (float&)raw = num;
    for (byte i = 0; i < 4; i++) EEPROM.write(addr + i, raw[i]);
  }
  EEPROM.commit();
}

Спасибо!

IVAN222
Offline
Зарегистрирован: 19.04.2017

Если все работает то хорошо. А память EEPROM расчитана примерно на 100000 циклов записи и стирания. Вот и расчитуйте сколько времени у Вас будет работать это устройство.

sadman41
Offline
Зарегистрирован: 19.10.2016

В ESP нет внутренней EEPROM, поэтому она эмулируется с помощью чего-то типа AT24C256, у которой в даташите имеется:

Endurance:
- One Million Write Cycles;
– Data Retention: 40 Years

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

sadman41 пишет:

В ESP нет внутренней EEPROM, поэтому она эмулируется с помощью чего-то типа AT24C256

Неть.  Она эмулируется, отъедая пространство у программного FLASH. 

sadman41
Offline
Зарегистрирован: 19.10.2016

DetSimen пишет:

sadman41 пишет:

В ESP нет внутренней EEPROM, поэтому она эмулируется с помощью чего-то типа AT24C256

Неть.  Она эмулируется, отъедая пространство у программного FLASH. 

Вон сбоку винбонд стоит - внешний SPI-флеш. С ATxxx я подло обманул, конечно. 

https://static.chipdip.ru/lib/081/DOC001081512.pdf => More than 100,000 erase/program cycles. Так что таки сто тыщ, но флеш внешний. И, так как прошивка хранится в нём же, то отъедается от него, конечно. Я это, вроде, не  опровергал.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

sadman41 пишет:

Так что таки сто тыщ, но флеш внешний. И, так как прошивка хранится в нём же, то отъедается от него, конечно. Я это, вроде, не  опровергал.

Да. Не мне тебя учить, ты это и так лучше меня знаешь. Просю пардону.