Zapis zmiennej float do eprom, preferences ESP32 Problem

Zibi
Posts: 639
Joined: Wed Jul 31, 2019 9:20 am
Location: Białogard

Post

Cześć
Próbuje zapisać zmienna którą sobie odbieram po serialu i po kanale czujnika dystansu wartość leci do Supli. Chcę zapisywać tą zmienną, żeby po resecie była zapamiętana, ale kiedy strzelam reset cały czas się zeruje.
Próbowałem eproma put, get i preferences i to samo. Bez Supli działa bez problemu a z Suplą lipton. Płytka ESP32.

--------- EDIT ------------

Temat opanowałem używając preferences.
User avatar
klew
Posts: 10405
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

Dodam tylko, że tutaj problem był taki, że suplowa klasa "eeprom" była ustawiona na domyślny zerowy offset, więc Supla pisała do eeprom na adresach zacyznając od 0 w górę.
Zmienne u Zibi'ego też były zapisywane na niskich adresach i jedno z drugim się nadpisywało.

Metoda przechowywania danych "Preferences" to "NVS storage" z ESP-IDF. Używa on innego obszaru na flashu i można zapisywać dane w postaci klucz-wartość. Dlatego zmiana na preferences tutaj pomogła. Alternatywnie można było ustawić inny offset w suplowej klasie eeprom, albo zapisywać zmienne bezpośrednio do eeprom na adresach nieużywanych przez Suplę.
petione
Posts: 110
Joined: Sat Jul 21, 2018 4:26 pm

Post

Zibi wrote: Sun Jan 29, 2023 12:15 pm Cześć
Próbuje zapisać zmienna którą sobie odbieram po serialu i po kanale czujnika dystansu wartość leci do Supli. Chcę zapisywać tą zmienną, żeby po resecie była zapamiętana, ale kiedy strzelam reset cały czas się zeruje.
Próbowałem eproma put, get i preferences i to samo. Bez Supli działa bez problemu a z Suplą lipton. Płytka ESP32.

--------- EDIT ------------

Temat opanowałem używając preferences.
Zibi podpowiesz, też korzystam z preferences i tak samo bez Supli działa a Suplą już nie. Wiesz może w czym tkwi problem?
Zibi
Posts: 639
Joined: Wed Jul 31, 2019 9:20 am
Location: Białogard

Post

Hej
Ja koniec końców zastosowałem to co Krzysztof napisał. Zastosowałem się do zapisów do flashu na adresach nieużywanych przez Suplę.
petione
Posts: 110
Joined: Sat Jul 21, 2018 4:26 pm

Post

Szkoda, bo Preferences jest bardzo wygodne w stosowaniu i nie trzeba myśleć o offsetach dla kolejnych danych. No nic przechodzę również na standardowe EEPROM.put() i EEPROM.get() bo kilkudniowa walka nie pozwoliła mi na znalezienie przyczyny braku współpracy z SD choć Supla jak i Preferences używają LittleFS wiec niby nie powinny z sobą kolidować.
Dzięki za info.
vajera
Posts: 724
Joined: Wed Oct 31, 2018 7:58 am

Post

petione wrote: Wed Jan 29, 2025 7:16 am Szkoda, bo Preferences jest bardzo wygodne w stosowaniu i nie trzeba myśleć o offsetach dla kolejnych danych. No nic przechodzę również na standardowe EEPROM.put() i EEPROM.get() bo kilkudniowa walka nie pozwoliła mi na znalezienie przyczyny braku współpracy z SD choć Supla jak i Preferences używają LittleFS wiec niby nie powinny z sobą kolidować.
Dzięki za info.
A dlaczego nie skorzystasz z możliwości jakie daje SuplaConfig? Pozwala na zapisywanie różnych zmiennych przy pomocy kluczy, ma nawet opcję zapisywania blobów, z której korzystam przy przechowywaniu 4 kB tablicy danych.
petione
Posts: 110
Joined: Sat Jul 21, 2018 4:26 pm

Post

vajera wrote: Wed Jan 29, 2025 10:07 am
petione wrote: Wed Jan 29, 2025 7:16 am Szkoda, bo Preferences jest bardzo wygodne w stosowaniu i nie trzeba myśleć o offsetach dla kolejnych danych. No nic przechodzę również na standardowe EEPROM.put() i EEPROM.get() bo kilkudniowa walka nie pozwoliła mi na znalezienie przyczyny braku współpracy z SD choć Supla jak i Preferences używają LittleFS wiec niby nie powinny z sobą kolidować.
Dzięki za info.
A dlaczego nie skorzystasz z możliwości jakie daje SuplaConfig? Pozwala na zapisywanie różnych zmiennych przy pomocy kluczy, ma nawet opcję zapisywania blobów, z której korzystam przy przechowywaniu 4 kB tablicy danych.

Masz na myśli własne dane? Mam do zapisu kilka tablic typu int po 100 elementów ( int tab[100] ).

Jeśli tak to podpowiedz coś proszę bo nigdy nie zapisywałem swoich danych z wykorzystaniem Supli ( jakiś przykład).

P.S. Prefereneces działa właśnie w oparciu o klucze.
User avatar
klew
Posts: 10405
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

Supla::Config też działa w oparciu o klucze i to takie same.

Ogólnie historia jest taka, że esp-idf dodał kiedyś coś co się nazywa NVS (non-volatile storage), który polega na zapisywaniu wartości różnych typów przy pomocy 16 B kluczy.

SuplaDevice dla esp-idf na esp32 polega na NVS i udostępnia swój interfejs Supla::Config, który opakowuje NVS.

Dla Arduino IDE i esp8266 nie było kiedyś dostępnego NVS, więc w SD napisałem coś co się nazywa Supla::KeyValue, który potem został opakowany w LittleFsConfig (oparty o KeyValue, używający LittleFs do przechowywania danych).

Natomaist od strony Arduino historia wyglądała tak:
NVS w esp32 był fajny, więc w boardach pojawiły się Preferences dla esp32.
W esp8266 chcieli użyć tego samego, ale tam nie ma NVS, więc ludzie zaczęli tworzyć biblioteki w stylu Preferences dla ESP8266, które robią w zasadzie to samo co LittleFsConfig.

Supla::LittleFsCofig to klasa dziedzicząca między innymi po Supla::Config.
Supla::Config wystawia settery i gettery podobne do tego co robi NVS:
https://github.com/SUPLA/supla-device/b ... e/config.h

Do zapisu większych fragmentów danych, jak np. int[100], można użyć setBlob/getBlob.
Tylko pamiętaj, że domyślnie LittleFsConfig daje 1000 B, co dość szybko się kończy, szczególnie, że int[100] zajmie 400 B. Możesz to zwiększyć podając w konstruktorze większą wartość, tylko ta wartość będzie odpowiadała zaalokowanej ilości pamięci, której na ESP8266 i tak jest mało.

Return to “Arduino IDE”