Stránka 1 z 1

ESP32 C3 - RTC_DATA_ATTR neuchová data po restartu

Napsal: 09 úno 2025, 00:49
od jankop
Ladím program, který si ukládá jedinou proměnnou do RTC paměti pomocí deklarace RTC_DATA_ATTR. Proměnná se prokazatelně uloží, ale po restartu její hodnota neodpovídá.

Kód: Vybrat vše

// Mám pro esp32 C3 tento segment programu Arduino, ale nefunguje mi přepínání módů mezi STA a AP pomocí tlačítka.
#include <WiFi.h>
RTC_DATA_ATTR int32_t WifiModeFlag = 0L;
void setup() {
  WifiStart();
}
void loop() {
  // from WiFi station mode pressing the hardware Smart Button restarts the system
  if (!digitalRead(ButtonPin)) WifiModeSelectorFlag();
}
void WifiStart(void) {
  if (WifiModeFlag == 34567890) {
    WifiModeFlag = 0;
    // start WiFi Access point
    WiFi.softAP(_SensorName);
    digitalWrite(LedBuiltIn, HIGH);  //LED ON
  } else {
    // start WiFi station
    WiFi.mode(WIFI_STA);
    WiFi.begin(eGet.mySSID, eGet.myPassword);
    // wait for WiFi connect
    while (WiFi.status() != WL_CONNECTED) {
      WifiModeSelectorFlag();
      delay(250);
      digitalWrite(LedBuiltIn, !digitalRead(LedBuiltIn));
    }
    WiFi.setSleep(false);
    digitalWrite(LedBuiltIn, LOW);  //LED OFF
  }
}
// tests solid Smart button press and triggers a restart
void WifiModeSelectorFlag(void) {
  if (WiFi.getMode() != WIFI_STA) return;
  if (!digitalRead(ButtonPin)) {
    delay(50);
    if (!digitalRead(ButtonPin)) {
      WifiModeFlag = 34567890;
      // waiting for the button to be released
      while (!digitalRead(ButtonPin)) { delay(50); }
      //delay(1000);
      ESP.restart();
    }
  }
}

Re: ESP32 C3 - RTC_DATA_ATTR neuchová data po restartu

Napsal: 09 úno 2025, 08:04
od gilhad
Nemůže být problém v tom, že ji na začátku deklaruješ jako inicializovanou?
Očekával bych, že se po spuštění programu do ní ta nula zapíše (ale můžu se plést, neznám to).
WifiModeFlag = 0L;

Re: ESP32 C3 - RTC_DATA_ATTR neuchová data po restartu

Napsal: 09 úno 2025, 15:11
od jankop
Dík za pomoc gilhade. Zrušil jsem tu deklaraci, protože to nejspíš fatální chyba byla. Ale stejně to nefungovalo. Někde jsem právě teď narazil na zmínku, že RTC_DATA_ATTR uchovává data při DeepSleep a až RTC_NOINIT_ATTR uchová data i při restartu. A faktem je, že s RTC_NOINIT_ATTR mi to konečně funguje. Tohle moc zdokumentované není. Strávil jsem s tím spoustu času.
U ESP8266, který jsem doposud výhradně používal, je mechanizmus RTC mem. poněkud jiný. S ESP32 se teprve seznamuji a portoval jsem na něj program právě z ESP8266.
Dovolím si přidat pár postřehů.
1. Narazil jsem na Sonoff BasicR4, WiFi switch, který je založen na ESP32 C3. Protože kompletní zařízení v krabičce bylo za cca 170Kč, tak jsem si ho pořídil.
2. Ještě než jsem ho měl doma, jsem zjistil, že prázdný skech má po kompilaci velikost asi 266kB. V reálu pak program portovaný z ESP8266 na ESP32 C3 byl 3x delší.
3. Doba kompilace se mi jeví příšerně dlouhá i když mám docela slušný počítač. Naštěstí z toho člověka ruce nebolí.
4. Předchozí generace Sonoff Basic dovolovala bezprostředně aplikovat OTA bez potřeby sériové linky. U Sonoff BasicR4 jsem marně několik hodin pátral po této možnosti a nakonec jsem potupně sáhl po sériovém adaptéru.
5. V hardwarové konstrukci tohoto BasicR4 je jedna zásadní změna, kterou je třeba bezvýhradně respektovat. Je to skutečnost, že je vybaven stepdown měničem, ale tento měnič nemá transformátor a tedy je zařízení trvale galvanicky spojeno se sítí. Holt šetří se všude. Proto není možné připojovat k tomuto zařízení žádné senzory a externí doplňky. Programování musí pochopitelně také probíhat při odpojené síti, pouze s napájením z USB/Serial adaptéru. Nerspektování tohoto faktu může zničit váš NB/PC nebo vás (neberme si servítky) také přizabít. Na druhé straně takový měnič bez trafa z 230V na 3.3V může být docela zajímavý.
6. Program, který jsem přenášel, jsem měl na ESP8266 hodně vyladěný. Je to docela náročný http server. Musel jsem tam sáhnout i k fintám s životností souborů v cache prohlížeče. Snad proto musím konstatovat, že rozdíl ve výkonu těchto dvou zařízení na stejném jobu je sotva patrný. Dokonce pozoruji u ESP32 jakasi drobná zamrznutí. To by údajně mohlo souviset s power-managementem tohoto RISC procesoru. To chci ještě identifikovat a doladit.
7. Aktivoval jsem IPv6 a v prvním přiblížení se jeví pěkně funkční.V tomhle kontextu jsem si vzpomněl, že O2 chce za statickou IPv6 s prefixem /64 120Kč.
8. Co můžete při pořízení Sonoff BasicR4 čekat? Je to trocha bižuterie a pak procesor ESP32 C3, relé, modrá LED a tlačítko. Bez nástrojů demontovatelná krabička. Pak stačí připájet čtyřpinový hřebínek pro 3V3, Rx,TX a GND. Flashování přímo z Arduino IDE. Stačí stisknout tlačítko a připojit USB/serial adapter do počítače. LED začne svítit cca polovičním svitem, to je aktivní bootloader.
9. K BasicR4 je k dispozici firemní software eWelink, který dovede mnohé. Ovšem, když si BasicR4 flashnete, tak původní software už tam nedostanete. Na záruku můžete také zapomenout. Můžete ale zařadit tuhle hračku do své chytré domácnosti třeba pomocí software Tasmota.