Storage - czyli przechowywanie danych w urządzeniach

User avatar
vajera
Posts: 7287
Joined: Wed Oct 31, 2018 7:58 am
Location: Biedrusko
Has thanked: 289 times
Been thanked: 161 times

Post

nebraska wrote: Mon Dec 08, 2025 10:37 pm
vajera wrote: Mon Dec 08, 2025 10:27 pm
nebraska wrote: Mon Dec 08, 2025 10:10 pm Wgrałem kod i procek ciągle się resetuje.

Code: Select all

#include <Arduino.h>
#include <SuplaDevice.h>
#include <supla/storage/littlefs_config.h>
#include <supla/control/action_trigger.h>
#include <supla/control/button.h>
#include <supla/storage/eeprom.h>

#define STORAGE_OFFSET 512
Supla::Eeprom eeprom(STORAGE_OFFSET);

#define BUTTON_PIN 4
auto switch1 = new Supla::Control::Button(BUTTON_PIN, true, true);

bool flaga{false};
int32_t zmienna = 1;

auto cfg = Supla::Storage::ConfigInstance();


enum default_actions { BUTTON1_CLICK1 };
class addedActionsClass : public Supla::ActionHandler, public Supla::Element {
public:
  addedActionsClass() {}
  void handleAction(int event, int action) { // obsluga przyciskow z Supli

    if (action == BUTTON1_CLICK1) {
      printf("Klik x1 \n");
      flaga = !flaga;
      zmienna=2;
    }

  }
};
addedActionsClass *custAct = new addedActionsClass;


void setup() {
  Serial.begin(115200); 
  Supla::Storage::Init();

  switch1->setMulticlickTime(500, false);
  switch1->addAction(BUTTON1_CLICK1, custAct, Supla::ON_CLICK_1); 
 
  Serial.print("EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEprom: ");
  Serial.println(zmienna);
  
  SuplaDevice.begin();                   
}
void loop() {

  if(!flaga) {
    printf("zapis do eeprom \n");
    flaga= !flaga;
   
   cfg->setInt32("moja_zm_1", zmienna);
   cfg->saveWithDelay(2000);
   
   
  }}

 
To:

Code: Select all

addedActionsClass *custAct = new addedActionsClass;
zamień na to:

Code: Select all

addedActionsClass *custAct = new addedActionsClass();
Zmienione. Nie mam pomysłu skąd ten reset :roll:
Zamiast:

Code: Select all

Supla::Eeprom eeprom(STORAGE_OFFSET);
daj:

Code: Select all

Supla::Eeprom eeprom(STORAGE_OFFSET);
Supla::LittleFsConfig     configSupla();
Bramka Zigbee <=> SUPLA
Więcej informacji tutaj:
https://forum.supla.org/viewforum.php?f=127
FAQ https://forum.supla.org/viewtopic.php?t=17277
User avatar
klew
Posts: 13906
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

vajera wrote: Mon Dec 08, 2025 10:34 pm
klew wrote: Mon Dec 08, 2025 10:25 pm
nebraska wrote: Mon Dec 08, 2025 10:10 pm
Najpierw musisz stworzyć instancję klasy typu "Config" i dopiero potem możesz pobrać na niego wskaźnik. Obecnie jest tam pewnie nullptr, na którym próbujesz działać -> crash.

Zobacz sobie przykłady WebInterface, albo CustomInputs.
To ma ogarnięte:

Code: Select all

auto cfg = Supla::Storage::ConfigInstance();
Nie do końca. Tu pobiera wskaźnik na instancję, której nigdzie nie stworzył (co dodałeś w późniejszym poście). Także cfg to nullptr.

Do tego takich rzeczy ja bym nie inicjalizował statycznie, ze względu na ryzyko "static initialization fiasco". Może nie teraz i nie tutaj, ale przeniesie potem coś do innego pliku i nagle crashe bez widocznego powodu
Najlepsze suple dla Twojego domu :mrgreen:
nebraska
Posts: 204
Joined: Thu Dec 08, 2022 3:00 pm
Been thanked: 1 time

Post

vajera wrote: Mon Dec 08, 2025 10:42 pm
nebraska wrote: Mon Dec 08, 2025 10:37 pm
vajera wrote: Mon Dec 08, 2025 10:27 pm

To:

Code: Select all

addedActionsClass *custAct = new addedActionsClass;
zamień na to:

Code: Select all

addedActionsClass *custAct = new addedActionsClass();
Zmienione. Nie mam pomysłu skąd ten reset :roll:
Zamiast:

Code: Select all

Supla::Eeprom eeprom(STORAGE_OFFSET);
daj:

Code: Select all

Supla::Eeprom eeprom(STORAGE_OFFSET);
Supla::LittleFsConfig     configSupla();
Dziękuje, jeszcze zadeklarowałem rozmiar i problem ustąpił.

Code: Select all

Supla::Eeprom eeprom(STORAGE_OFFSET);
Supla::LittleFsConfig configSupla(2048);
nebraska
Posts: 204
Joined: Thu Dec 08, 2022 3:00 pm
Been thanked: 1 time

Post

nebraska wrote: Mon Dec 08, 2025 11:03 pm
vajera wrote: Mon Dec 08, 2025 10:42 pm
nebraska wrote: Mon Dec 08, 2025 10:37 pm

Zmienione. Nie mam pomysłu skąd ten reset :roll:
Zamiast:

Code: Select all

Supla::Eeprom eeprom(STORAGE_OFFSET);
daj:

Code: Select all

Supla::Eeprom eeprom(STORAGE_OFFSET);
Supla::LittleFsConfig     configSupla();
Dziękuje, jeszcze zadeklarowałem rozmiar pamięci i problem ustąpił.

Code: Select all

Supla::Eeprom eeprom(STORAGE_OFFSET);
Supla::LittleFsConfig configSupla(2048);
nebraska
Posts: 204
Joined: Thu Dec 08, 2022 3:00 pm
Been thanked: 1 time

Post

Na logach nic nie widać, żeby zapisywało do eeprom. Po resecie zmienna cały czas na serialu widze taka sama.
zzrr
Posts: 1864
Joined: Wed Oct 26, 2022 7:35 pm
Has thanked: 76 times
Been thanked: 119 times

Post

Ja bym wpisał
Supla::LittleFsConfig configSupla;

a w setup
auto cfg = Supla::Storage::ConfigInstance();
EDIT:
No i to ale już masz
Supla::Storage::Init();

I kasowanie całej pamięci przed wgraniem
nebraska
Posts: 204
Joined: Thu Dec 08, 2022 3:00 pm
Been thanked: 1 time

Post

zzrr wrote: Mon Dec 08, 2025 11:18 pm Ja bym wpisał
Supla::LittleFsConfig configSupla;

a w setup
auto cfg = Supla::Storage::ConfigInstance();
EDIT:
No i to ale już masz
Supla::Storage::Init();

I kasowanie całej pamięci przed wgraniem
Tak, tylko musze miec globalnie żeby móc się dostać w kodzie w dowolnym miejscu.
Kasowanie przed wgraniem masz na mysliALL FLASH w Arduino np dla esp8266?
Chyba przyjdzie mi użyć zwykłego eeproma bo w tym cięzko mi się połapać. Nie mogę zapisać prostej zmiennej :lol:
zzrr
Posts: 1864
Joined: Wed Oct 26, 2022 7:35 pm
Has thanked: 76 times
Been thanked: 119 times

Post

nebraska wrote: Mon Dec 08, 2025 11:30 pm Tak, tylko musze miec globalnie żeby móc się dostać w kodzie w dowolnym miejscu.
Kasowanie przed wgraniem masz na mysliALL FLASH w Arduino np dla esp8266?
Chyba przyjdzie mi użyć zwykłego eeproma bo w tym cięzko mi się połapać. Nie mogę zapisać prostej zmiennej :lol:
EDIT:
globalnie od razu to by chyba tak trzeba:
Supla::LittleFsConfig configSupla;
Supla::Config *cfg = nullptr;

a w setup
Supla::Storage::Init();
cfg = Supla::Storage::ConfigInstance();

Nie pamiętam w jakim przykładzie u siebie coś zapisywałem do pamięci w LOOP. Może w żadnym... :)
nebraska
Posts: 204
Joined: Thu Dec 08, 2022 3:00 pm
Been thanked: 1 time

Post

zzrr wrote: Mon Dec 08, 2025 11:39 pm
nebraska wrote: Mon Dec 08, 2025 11:30 pm Tak, tylko musze miec globalnie żeby móc się dostać w kodzie w dowolnym miejscu.
Kasowanie przed wgraniem masz na mysliALL FLASH w Arduino np dla esp8266?
Chyba przyjdzie mi użyć zwykłego eeproma bo w tym cięzko mi się połapać. Nie mogę zapisać prostej zmiennej :lol:
EDIT:
globalnie od razu to by chyba tak trzeba:
Supla::LittleFsConfig configSupla;
Supla::Config *cfg = nullptr;

a w setup
Supla::Storage::Init();
cfg = Supla::Storage::ConfigInstance();

Nie pamiętam w jakim przykładzie u siebie coś zapisywałem do pamięci w LOOP. Może w żadnym... :)
Chyba powinno być w setup zalokowanie w pamięci obiektu.

Code: Select all

cfg = new Supla::Storage::ConfigInstance();
User avatar
klew
Posts: 13906
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

nebraska wrote: Mon Dec 08, 2025 11:13 pm Na logach nic nie widać, żeby zapisywało do eeprom. Po resecie zmienna cały czas na serialu widze taka sama.
A masz gdzieś odczyt pamięci?
Najlepsze suple dla Twojego domu :mrgreen:

Return to “Arduino IDE”