Спасибо Вам большое. Но как мне сохранить строку навсегда, то есть после перезапуска получить сохранённую строку?Ну или...
Код:EEPROM.begin(Количество зарезирвированных байт); EEPROM.put(adress,String); //запись в буфер EEPROM.commit(); // физическая запись содержимого буфера
Данный код записывает в внешний флеш (энергонезависимый) (под eeprom там выделенно 512 байт) естественно должа быть подключена библиотека EEPROM.hСпасибо Вам большое. Но как мне сохранить строку навсегда, то есть после перезапуска получить сохранённую строку?
struct intcfg {
int val;
int addr;
};
struct stringcfg{
String val;
int addr;
};
struct boolcfg{
bool val;
int addr;
};
struct bytecfg{
byte val;
int addr;
};
boolcfg STAen={true,1}; //Подключаемся к роутеру (1) или делаем точку (0)
stringcfg ssid={defSsid,STAen.addr+sizeof(bool)}; //SSID роутера
stringcfg pass={defPasswd,ssid.addr+sizeof(String)}; //Пароль роутера
intcfg tries={15,pass.addr+sizeof(String)}; //Сколько ожидать подключения
stringcfg webuser={"admin",tries.addr+sizeof(int)};
stringcfg webpass={"admin",webuser.addr+sizeof(String)};
intcfg websessionperiod={300,webpass.addr+sizeof(String)};
bool saveAllConfig() {
EEPROM.begin(eepromsize);
delay(500);
EEPROM.put(STAen.addr, STAen.val);
EEPROM.put(ssid.addr, ssid.val);
EEPROM.put(pass.addr, pass.val);
EEPROM.put(tries.addr, tries.val);
EEPROM.put(webuser.addr, webuser.val);
EEPROM.put(webpass.addr, webpass.val);
EEPROM.put(websessionperiod.addr, websessionperiod.val);
EEPROM.put(mqttserver.addr, mqttserver.val);
EEPROM.put(mqttport.addr, mqttport.val);
EEPROM.put(mqttperiod.addr, mqttperiod.val);
EEPROM.commit();
EEPROM.end();
delay(500);
}
void loadConfig() {
EEPROM.begin(eepromsize);
delay(500);
EEPROM.get(STAen.addr, STAen.val);
EEPROM.get(ssid.addr, ssidtmp);
Serial.println("Int "+ssidtmp);
EEPROM.get(pass.addr, pass.val);
EEPROM.get(tries.addr, tries.val);
EEPROM.get(webuser.addr, webuser.val);
EEPROM.get(webpass.addr, webpass.val);
EEPROM.get(websessionperiod.addr, websessionperiod.val);
EEPROM.get(mqttserver.addr, mqttserver.val);
EEPROM.get(mqttport.addr, mqttport.val);
EEPROM.get(mqttperiod.addr, mqttperiod.val);
EEPROM.end();
}
void setup() {
EEPROM.begin(eepromsize);
delay(500);
#if (USE_SERIAL == 1)
Serial.begin(115200);
Serial.println();
#endif
byte cfgver=0;
EEPROM.get(0,cfgver);
EEPROM.end();
if (cfgver != 1) { // первый запуск
EEPROM.begin(eepromsize);
EEPROM.put(0, 1);
delay(100);
EEPROM.commit();
EEPROM.end();
saveAllConfig();
}
loadConfig();
}
Обычно недостаточно, наверное хватило бы - считать байт , инвертировать его, записать обратно ,сравнить его с инвертированным результатом.Каким образом определяется дырка в EEPROM? Достаточно ли записать - считать и сравнить?
int adress=0;
byte testbyte=EEPROM.read(adress);
testbyte=~testbyte;
EEPROM.write(adress,testbyte);
Serial.print ( adress);
if (EEPROM.read(adress)==testbyte) Serial.prinln ("-true") else Serial.prinln ("-false")
Дак странность то в том, что после считывания настроек длинна переменной (например SSID) становится равной длинне сохраненной в EEPROM переменной, а вот значение равняется инициализированному в коде.если addr+sizeof(int) , addr+sizeof(bool) размер занимаемый переменной понятен (он всегда один и тот же ( int зависит от разрядности процессора), то откуда известен размер addr+sizeof(String) ?
хотя я возможно чего то не понимаю.
как то так мне кажется -,но я не гуру могу и ошибатьсяУ меня sizeof для String всегда выдает 12
И почему бы им не хранится нормально они на своих местах своего размера, просто затирают предыдущую область( если там хранилась строка)- все ,что больше 12 байт.Опять же - все адреса рассчитываются на основе предыдущих sizeof, соответственно еще много данных типа int лежат за этими строками и загружаются нормально.
рекомендую читать учебники прежде чем думать.Ну вот Int занимает 4 байта без разницы это 1 или 2^16 (количество знакомест разное) а памяти жрет одинаково. Думаю у строки так же, берется максимальная длина строки и на основании этого выдается ее размер.
По поводу Char - не совсем удобно (по крайней мере мне так кажется) потому что при изменении длинны сохраняемого пароля или ssid придется переписывать все параметры конфигурации в EEPROM.
Но спасибо за идею - попробую.
Опять же - все адреса расчитываются на основе предыдущих sizeof, соответственно еще много данных типа int лежат за этими строками и загружаются нормально.