Uložení řetězce pomocí Preferences

Odpovědět
tosik
Příspěvky: 90
Registrován: 11 led 2020, 14:48
Reputation: 0

Uložení řetězce pomocí Preferences

Příspěvek od tosik » 18 zář 2022, 20:56

Ahoj.

Potřeboval bych uložit datum na ESP32 do paměti pomocí Preferences. Jelikož s ním dál nebudu pracovat jako s datumem, postačí mi ho uložit jako řetězec.
Co se týče číselných hodnot, není problém, ale s řetězcem mi to nějak nejde. Co dělám špatně?

Kód: Vybrat vše

#include <RTClib.h>                   // pro časový modul           
#include <Preferences.h>              // pro zápis hodnot (i vícebitových, desetinných, znaků apod. do trvalé paměti

Preferences preferences;               // pro ukládání do trvalé paměti
RTC_DS3231 rtc;                        // časový modul DS3231

// časové řízení - začátek
    uint8_t den, mesic;
    uint8_t sekundy = 0;
    uint8_t hodiny = 0;
    uint8_t minuty = 0;
    int rok;
    
  // časové řízení - konec

void setup() {
  Serial.begin(115200);
  preferences.begin("EEpamet", false);       // jméno prostoru max. 15 znaků, mód čtení/zápis (false)
  delay(500);

  // ------- Hledání a nastavení čas. modulu - začátek ----------
  if (! rtc.begin()) {
    Serial.println("Nemohu najít modul RTC");    
  }
  // nastaví do RTC datum a čas z počítače během nahrávání programu
  //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

  DateTime now = rtc.now();
  byte hodiny = now.hour();
  byte minuty = now.minute();
  byte sekundy = now.second();
  byte den = now.day();
  byte mesic = now.month();
  int rok = now.year(); 

  String datumSynchro;
  datumSynchro = (String)hodiny;
  datumSynchro += ":";
  datumSynchro += (String)minuty; 
  datumSynchro += ":";
  datumSynchro += (String)sekundy;
  datumSynchro += "*";
  datumSynchro += (String)den;
  datumSynchro += "/";
  datumSynchro += (String)mesic;
  datumSynchro += "/";
  datumSynchro += (String)rok;

  const char* test = "Nactena vychozi hodnota";
  
  Serial.println(datumSynchro);
  preferences.putString("datumPoslSynchEZ", datumSynchro);
  String nactenaHodnota =  preferences.getString("datumPoslSynchEZ", test); 
  Serial.println(nactenaHodnota);
  Serial.println("********************************");
}

void loop() {
 }

Uživatelský avatar
Caster
Příspěvky: 380
Registrován: 11 zář 2019, 09:02
Reputation: 0

Re: Uložení řetězce pomocí Preferences

Příspěvek od Caster » 19 zář 2022, 00:01


tosik
Příspěvky: 90
Registrován: 11 led 2020, 14:48
Reputation: 0

Re: Uložení řetězce pomocí Preferences

Příspěvek od tosik » 19 zář 2022, 16:10

To už jsem samozřejmě studoval. Já umím uložit a načíst, ale s řetězcem mi to nejde. když ho vložím do proměnné deklarované jako const char, tak uložím i načtu. Jenže já potřebuji ukládat řetězec, který se v průběhu běhu programu mění. A to mi nefunguje. Zřejmě to mám špatně přetypované... Nenašel jsem žádný článek, kde by ten řetězec vytvořili v průběhu běhu programu a pak ho ukládali....

tosik
Příspěvky: 90
Registrován: 11 led 2020, 14:48
Reputation: 0

Re: Uložení řetězce pomocí Preferences

Příspěvek od tosik » 19 zář 2022, 16:40

Prostě jako by to vůbec ten řetězec neuložilo, pak by to mělo právě vrátit výchozí hodnotu.... Tady kód bez načítání z časového modulu...

Kód: Vybrat vše


#include <Preferences.h>              

Preferences preferences;               
// simulace dat načtených z časového modulu
uint8_t den = 28;
uint8_t mesic = 11;
uint8_t sekundy = 23;
uint8_t hodiny = 15;
uint8_t minuty = 45;
int rok = 1985;

void setup() {
  Serial.begin(115200);
  preferences.begin("EEpamet", false);       // jméno prostoru max. 15 znaků, mód čtení/zápis (false)
  delay(500); 
// poskládání řetězce pro uložení do paměti
  String datumSynchro = "";
  datumSynchro = (String)hodiny;
  datumSynchro += ":";
  datumSynchro += (String)minuty; 
  datumSynchro += ":";
  datumSynchro += (String)sekundy;
  datumSynchro += "*";
  datumSynchro += (String)den;
  datumSynchro += "/";
  datumSynchro += (String)mesic;
  datumSynchro += "/";
  datumSynchro += (String)rok;
// deklarace výchozí hodnoty  
  const char* test = "Nactena vychozi hodnota";
  
  Serial.println(datumSynchro);
  preferences.putString("datumPoslSynchEZ", datumSynchro);
  String nactenaHodnotaZpameti;
  nactenaHodnotaZpameti = preferences.getString("datumPoslSynchEZ", test); 
  Serial.println(nactenaHodnotaZpameti);
  Serial.println("********************************");
}

void loop() {  
}


tosik
Příspěvky: 90
Registrován: 11 led 2020, 14:48
Reputation: 0

Re: Uložení řetězce pomocí Preferences

Příspěvek od tosik » 19 zář 2022, 18:22

Tak problém s ukládáním byl v tom, že pojmenování prostoru, kam se bude ukládat, nesmí být delší, než 15 znaků.. Takže stačilo "datumPoslSynchEZ" zkrátit, třeba na "datPoslSynchEZ" a už to jede jak má. Věděl jsem o tomto omezení, ale myslel jsem, že to platí pouze pro název celého jmenného prostoru (preferences.begin("EEpamet", false);)...

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Bing [Bot] a 7 hostů