ESP-01 (Esp8266) и запись в EEPROM

Atom

Member
Всем привет.

Что то я стал тупить и не получается записать данных в EEPROM.

В функции сохрвнения конфигурации делаю
EEPROM.begin(512);
EEPROM.writeByte( 0, cfg.ip[0] );
EEPROM.writeByte( 1, cfg.ip[1] );
....
EEPROPM.commit();


там же вызываю функцию чтения данных
EEPROM.begin(512);
cfg.ip[0] = EEPROM.readByte(0);
cfg.ip[1] = EEPROM.readByte(1);
....

сразу же после чтения делаю вывод в Serial значений.
Сразу после записи все данные в порядке - все на месте. Но нажимаю ресет и перегружаю микроконтроллер, вызываю функцию чтения данных - все нули, ничего не сохранилось.
Что я делаю не так?

Сразу после коммита пытался вызывать EEPROM.end(), но микроконтроллер перегружается сразу, без физического нажатия на кнопку (то есть в коде не предусмотрено).
Грешу, что настройки прошивки нустановил не верно.
В новой Ардуино ИДЕ по умолчанию стоит
CPU freq 80
Crystal freq 26
Flash size 1Mb (64kb)
Flash mode DOut (compatible)
Flash freq 40

смена Flash mode на DIO ничего не дает.
При смене Flash size на 512 (none FS) после прошивки читает все данные как 0xFF, выбрасывает исключение и уходит в перезагрузку. При указанных выше параметров все остальное работает превосходно, окромя записи-чтения прома. Что нужно установить для ESP-01?
 

nikolz

Well-known member
сохранять полученный адрес надо в RAM RTC, иначе дырку во флеш протрете.
 

Atom

Member
разве это не одно и тоже? Есл можно какую нить ссылку про объяснение этого механизма.

Настройка конфигураии, операция которая осуществляется раз в пятилетке. То есть на заведомо новом чипе дырка протрется в у пра-пра-пра-правнуков.
До этого делал с использованием ESP.rtcUserMemoryRead() и иже сним. Работает замечательно при подключенном программаторе. Как только модуль переносился на физическое устройство с питанием от аккумулятора - постоянно терял часть настроек: либо адрес либо маска неверна, но при этом отлично читал имя SSID и пароль к нему (подлючался не по заданному в конфигурации адресу, а получал по dhcp). Добавив всевозможные фильтры по питанию в устройство добился того, что девайс около десятка раз работал без прериканий, но потом адрес напроч забывался и при подключении к программатору данные выводились нереальные.
 

nikolz

Well-known member
разве это не одно и тоже? Есл можно какую нить ссылку про объяснение этого механизма.

Настройка конфигураии, операция которая осуществляется раз в пятилетке. То есть на заведомо новом чипе дырка протрется в у пра-пра-пра-правнуков.
До этого делал с использованием ESP.rtcUserMemoryRead() и иже сним. Работает замечательно при подключенном программаторе. Как только модуль переносился на физическое устройство с питанием от аккумулятора - постоянно терял часть настроек: либо адрес либо маска неверна, но при этом отлично читал имя SSID и пароль к нему (подлючался не по заданному в конфигурации адресу, а получал по dhcp). Добавив всевозможные фильтры по питанию в устройство добился того, что девайс около десятка раз работал без прериканий, но потом адрес напроч забывался и при подключении к программатору данные выводились нереальные.
Writes data to the RTC memory.
During Deep-sleep mode, the RTC is still operational and can store user data in the defined
user-data area.
|<------system data (256 bytes)------->|<-----------------user data (512 bytes)--------------->|
----------------------
у меня все работает даже от солнечной панельки а также при пониженном напряжении до 2.6 вольт
 

Atom

Member
@nikolz
недолгое гугление показало что rtcmem удобно использовать в датчиках, при переключении на deep sleep. У меня в препарации esp-01, паять что либо ни gpio16 без мелкоскопа сложно. Да и сама железка имеет переключатель питания, что в принципе подразумевает длительное отключение устройства. Чтоб не наводить тумана - гирлянда на ws2812.

За PDF спасибо. БУду грызть гранит expressif.

@CodeNameHawk

в аттачменте прикреплены файлы.

IP:0.0.0.0
NM:0.0.0.0
GW:0.0.0.0
Color R:88 G:0 B:23; PIN: 0, Length:150
ip0 111
check of data 1
w2. ip=111.122.121.22
nm=222.222.222.0
gw=11.222.33.11
iot=0.0.0.0 P:0
color=88.0.23 sl=150 pin=0
aaaaaaa
bbbbbb
r2.crc=0 ip=111.122.121.22
nm=222.222.222.0
gw=11.222.33.11
iot=0.0.0.0 P:0
color=88.0.23 sl=150 pin=0
ssid:aaaaaaa pw:bbbbbb
len=0

После w2. ip=111.122.121.22 идет перечень того, что записывалось. r2.crc=0 ip=111.122.121.22 - начало чтения конфигурации из флэш.

Нажимаем кнопу ресет и
ll⸮⸮|⸮d⸮|⸮d⸮b<⸮⸮⸮⸮s⸮c⸮#⸮⸮og⸮lgo⸮⸮⸮cxp⸮${$s$sdlܟ<⸮l⸮|⸮l⸮#|⸮⸮⸮⸮s⸮#⸮c⸮⸮'o⸮do'⸮⸮⸮cp⸮⸮dsdrdp⸮g⸮⸮l⸮⸮cn⸮|⸮l⸮⸮c⸮⸮g'⸮l⸮⸮d`⸮ogl n{⸮⸮⸮gcl`s⸮⸮n#d`⸮#⸮⸮l{⸮ ⸮⸮g⸮ r2.crc=0 ip=0.0.0.0
nm=0.0.0.0
gw=0.0.0.0
iot=0.0.0.0 P:0
color=0.0.0 sl=0 pin=0
ssid: pw:
len=0
ssid:< len=0
PW:< len=0
(IP unset)
(IP unset)

RGB:88 0 23 Striplength: 150
Started
 

Вложения

CodeNameHawk

Moderator
Команда форума
Где у вас скетч?
Отладку делают на минимальной длине скетча.

Чем не нравиться стандартная библиотека для работы с еепром?
 

Atom

Member
в атачменте полный проект.

библиотека используется стандартная. дополнительный класс реализует только последовательное запись/чтение используемых типов и строк. и ничего более. следуя логике это убирает необходимость использовать структуры для чтения и записи данных. правда структура еще осталась, но она исчезнет как только чтение запись будут в порядке.
 

Вложения

nikolz

Well-known member
@nikolz
недолгое гугление показало что rtcmem удобно использовать в датчиках, при переключении на deep sleep. У меня в препарации esp-01, паять что либо ни gpio16 без мелкоскопа сложно. Да и сама железка имеет переключатель питания, что в принципе подразумевает длительное отключение устройства. Чтоб не наводить тумана - гирлянда на ws2812.

За PDF спасибо. БУду грызть гранит expressif.

@CodeNameHawk

в аттачменте прикреплены файлы.

IP:0.0.0.0
NM:0.0.0.0
GW:0.0.0.0
Color R:88 G:0 B:23; PIN: 0, Length:150
ip0 111
check of data 1
w2. ip=111.122.121.22
nm=222.222.222.0
gw=11.222.33.11
iot=0.0.0.0 P:0
color=88.0.23 sl=150 pin=0
aaaaaaa
bbbbbb
r2.crc=0 ip=111.122.121.22
nm=222.222.222.0
gw=11.222.33.11
iot=0.0.0.0 P:0
color=88.0.23 sl=150 pin=0
ssid:aaaaaaa pw:bbbbbb
len=0

После w2. ip=111.122.121.22 идет перечень того, что записывалось. r2.crc=0 ip=111.122.121.22 - начало чтения конфигурации из флэш.

Нажимаем кнопу ресет и
ll⸮⸮|⸮d⸮|⸮d⸮b<⸮⸮⸮⸮s⸮c⸮#⸮⸮og⸮lgo⸮⸮⸮cxp⸮${$s$sdlܟ<⸮l⸮|⸮l⸮#|⸮⸮⸮⸮s⸮#⸮c⸮⸮'o⸮do'⸮⸮⸮cp⸮⸮dsdrdp⸮g⸮⸮l⸮⸮cn⸮|⸮l⸮⸮c⸮⸮g'⸮l⸮⸮d`⸮ogl n{⸮⸮⸮gcl`s⸮⸮n#d`⸮#⸮⸮l{⸮ ⸮⸮g⸮ r2.crc=0 ip=0.0.0.0
nm=0.0.0.0
gw=0.0.0.0
iot=0.0.0.0 P:0
color=0.0.0 sl=0 pin=0
ssid: pw:
len=0
ssid:< len=0
PW:< len=0
(IP unset)
(IP unset)

RGB:88 0 23 Striplength: 150
Started
сохранять параметры надо лишь для быстрого соединения при выходе из deepsleep

если вы это не делаете то ничего сохранять не надо. все что надо для WiFi ESP сохраняет по умолчанию.
 

nikolz

Well-known member
более того, если вы сохраните ip а потом отключитесь, то за время вашего отсутствия роутер может отдать этот ip другому устройству.
В результате когда подключитесь то ip сохраненный будет занят и ESP вообще не подключится.
 

Atom

Member
сохранять параметры надо лишь для быстрого соединения при выходе из deepsleep

если вы это не делаете то ничего сохранять не надо. все что надо для WiFi ESP сохраняет по умолчанию.
Можно где либо посмотреть реализацию "вариант 2" и "вариант 1"? да и "вариант 3" тоже нахожу интересным.
Соноф решение красивое, но требует реализации специфичским железом с соотвествующим софтом.
 
Сверху Снизу