Skocz do zawartości

Monitory HMI w użytku domowym.


Pomocna odpowiedź

@_LM_ jeśli dobrze się wczytałem i zdiagnozowałem, to:

prawdopodobnie problem jest spowodowany tym, że ustawiam cyklicznie co sekundę label (zegar), ustawiam też inny label(alert) w zależności od eventa z MQTT.

prawdopodobnie więc, z tego co wyczytałem, problemem jest konflikt renderowania wywoływany przeze mnie z tym wywoływanym przez lv(lv_tick?).

Fakt faktem miałem trochę źle napisana tą funkcję od alertów wypisywanych na ekranie, a zależnych od info z MQTT. Co mogłem z wypisywania napisów przeniosłem bezpośrednio do action_akcja(lv_event_t * e). To znacząco ograniczyło te ERRORy.

Jednak nadal co sekundę aktualizuję label z czasu i najprawdopodobniej "co któryś raz" on się gryzie z tym z lv.

Teraz error jest sporadyczne, ale nadal jest:

8:50:32.159 -> HEAP.............:7133456
18:50:33.240 -> HEAP.............:7133456
18:50:34.305 -> HEAP.............:7133456
18:50:35.383 -> HEAP.............:7133456
18:50:36.446 -> HEAP.............:7133316
18:50:37.529 -> HEAP.............:7133456
18:50:38.593 -> HEAP.............:7133456
18:50:39.682 -> HEAP.............:7133504
18:50:40.757 -> HEAP.............:7133456
18:50:41.858 -> HEAP.............:7133504
18:50:42.935 -> HEAP.............:7133456
18:50:44.036 -> HEAP.............:7133504
18:50:45.054 -> HEAP.............:7133456
18:50:46.130 -> HEAP.............:7133504
18:50:47.199 -> HEAP.............:7133456
18:50:48.290 -> HEAP.............:7133432
18:50:49.352 -> HEAP.............:7133456
18:50:50.396 -> HEAP.............:7133456
18:50:51.440 -> HEAP.............:7133504
18:50:52.441 -> HEAP.............:7133456
18:50:53.502 -> HEAP.............:7133456
18:50:54.638 -> HEAP.............:7133504
18:50:55.613 -> HEAP.............:7133456
18:50:56.685 -> [Error]	(98.494, +29840)	 _lv_inv_area: detected modifying dirty areas in render 	(in lv_refr.c line #213)
18:50:56.685 -> HEAP.............:7133456
18:50:57.716 -> HEAP.............:7133504

Wydaje się, że rozwiązaniem jest to:

https://docs.lvgl.io/8.3/porting/os.html

MUTEX? coś o tym pisałeś na samym początku tego wątku...

Czy dobrze to diagnozuję?

 

(edytowany)

To wynika z działania RTOSa dobrze kombinujesz w stronę MUTEX - a miałeś gdzieś tam wcześniej ustawiony ale ze złym parametrem 😉 kombinuj. 

Ewentualnie jeśli danych z MQTT jest sporo to chyba użyłbym kolejki do jednego taska lvgl. Połączenie kolejki i MUTEXa powinno dać dobre wyniki, ale tutaj nie jestem 100% pewny bo wciąż rozgryzam tajniki free rtosa

Edytowano przez _LM_
(edytowany)

Zmiany labela po wywołaniu z mqtt ogarnałem w samych eventach lvgl. Został zegarek

Tutaj napisano, że można by na razie zapomnieć o mutexach jeśli ustawiamy element lv w eventach lv lub timerach lv:

https://docs.lvgl.io/8.3/porting/os.html

Próbuję na razie ogarnąć ten zegar w timerze lv:

https://docs.lvgl.io/8.3/overview/timer.html

ale moja znajomość języka jest taka, że nie wiem co gdzie wstawić co w SETUP, co nie, a co jako osobna funkcja... na razie kombinuję jak koń pod górę

Edytowano przez SOYER

Cześć, problem błędów i resetów wydaje się rozwiązany.

Generalnie trzeba pamiętać o tym by ustawić elementy LV tylko w eventach lv lub timerach lv.

Te labele które można to ustawiam w eventach, a  dla zegara zrobiłem timer  i problemy błędów zniknęły, wydaje się, całkowicie.

Miałem problem z linijką tworzącą timer:

lv_timer_t * timer = lv_timer_create(my_time, 1000,  NULL);

którą mam w SETUP. W tym przykładzie było to umieszczone nad SETUP, ale takie umiejscowienie powodowało od razu panic na starcie i ciągłe resety.

Ciało funkcji:

void my_time(lv_timer_t * timer)
{
  if (lv_scr_act()==objects.main){
   tim = rtc.getTime();
   lv_label_set_text(objects.lbl_0_time, tim.c_str());
  }
}

Działa.

(edytowany)

Cześć, mała aktualizacja, po dołożeniu kodu QR ostatnio zrobiłem deep sleep-a wywoływanego na ekranie. Jako, że nie wiem jak go wybudzić inaczej, budzi się sam rano, lub po naciśnięciu fizycznego resetu.

Udało mi się też pokonać problem z dodawaniem obrazków. Powoli rozróżniam co robi EEZ, a czego potrzebuje LVGL. Niestety tak jak dla QRCodu jak i dla bitmap/obrazków to niekoniecznie jest to samo. Pomimo, że libs lvgl to 8.3 i w EEZ też mam zaznaczone, że pracuję na lvgl 8.3. Nie wiem skąd te błędy w takim razie, ale udało się to zrobić.

Kod dla QR(był problem z argumentami funkcji lv_qrcode_create() )

lv_obj_t *qr1;
////////////////////////
void qrcodeLink(void)
{
  lv_obj_set_pos(objects.btn_3_update, 60, 63);
  lv_obj_t * obj = lv_qrcode_create(objects.scr3, 125, lv_color_hex(0xff3f3a3a), lv_color_hex(0xffcdc8c8));
  objects.qr1 = obj;
  lv_obj_set_pos(obj, 290, 60);
  const char * data = "http://esp32.local/update";
  lv_qrcode_update(obj, data, strlen(data));
  lv_obj_set_style_border_color(obj, lv_color_hex(0xffcdc8c8), 0);
  lv_obj_set_style_border_width(obj, 5, 0);
}

Dla bitmap/obrazków EEZ wstawiał(podobnie problem z argumentami i podobnie sypało błędami przy kompilacji):

const lv_img_dsc_t img_t = {
  .header.magic = LV_IMAGE_HEADER_MAGIC,
  .header.cf = LV_COLOR_FORMAT_RGB565,
  .header.flags = 0,
  .header.w = 60,
  .header.h = 60,
  .header.stride = 120,
  .data_size = 7200,
  .data = img_t_map,
};

a powinno być:

const lv_img_dsc_t img_t = {
  .header.always_zero = 0,
  .header.w = 60,
  .header.h = 60,
  .data_size = 7200,
  .header.cf = LV_IMG_CF_TRUE_COLOR,
  .data = img_t_map,
};

Teraz próbuję tą wiedzę obrócić w sensowny wygaszacz.

 

Edytowano przez SOYER
10 minut temu, _LM_ napisał:

A jakby dołożyć czujnik który go wybudzi kiedy ktoś podejdzie do ekranu? 

Dobry pomysł, ale to jest pewnie obsługiwane przez expander, a z nim sobie nie radzę. 

Bardziej mnie zastanawia jak pobierać obrazki do wyświetlenia z karty SD.

Chciałem sobie lvgl-owski timer zresetować funkcją :

lv_timer_reset(timer1);

Oczywiście najpierw mam: 

void screenSaver(lv_timer_t * timer1)
{
  if (lv_scr_act()==objects.main){
   lv_scr_load_anim(objects.scr6, LV_SCR_LOAD_ANIM_OVER_TOP, 1000, 100, false);
  }
  else if (lv_scr_act()==objects.scr6){
   lv_scr_load_anim(objects.scr7, LV_SCR_LOAD_ANIM_OVER_TOP, 1000, 100, false);
  }
}



lv_timer_t * timer1 = lv_timer_create(screenSaver, 600000,  NULL);

 

Niestety wywala błędy przy kompilacji, jak dobrze pamiętam timer1 was not declared, co może być źle jak bez linijek resetujących timer działa bardzo dobrze...?

Napiszę też, może ktoś poratuje:

Jeśli umieszczę nad SETUP:

void screenSaver(lv_timer_t * timer1){
  LV_UNUSED(timer1);
  if (lv_scr_act()==objects.main){
   lv_scr_load_anim(objects.scr6, LV_SCR_LOAD_ANIM_OVER_TOP, 1000, 100, false);
  }
  else if (lv_scr_act()==objects.scr6){
   lv_scr_load_anim(objects.scr7, LV_SCR_LOAD_ANIM_OVER_TOP, 1000, 100, false);
  }
  else if (lv_scr_act()==objects.scr7){
   lv_scr_load_anim(objects.scr6, LV_SCR_LOAD_ANIM_OVER_TOP, 1000, 100, false);
  }
}

 lv_timer_t * timer1 = lv_timer_create(screenSaver, 600000,  NULL);

Wtedy mogę mieć w kodzie lv_timer_reset(timer1); i się skompiluje...
...ale po wgraniu mam takie coś:

17:48:10.411 -> Rebooting...
17:48:10.411 -> ESP-ROM:esp32s3-20210327
17:48:10.411 -> Build:Mar 27 2021
17:48:10.411 -> rst:0xc (RTC_SW_CPU_RST),boot:0xb (SPI_FAST_FLASH_BOOT)
17:48:10.411 -> Saved PC:0x403781a9
17:48:10.411 -> SPIWP:0xee
17:48:10.411 -> mode:DIO, clock div:1
17:48:10.411 -> load:0x3fce3818,len:0x109c
17:48:10.411 -> load:0x403c9700,len:0x4
17:48:10.459 -> load:0x403c9704,len:0xb50
17:48:10.459 -> load:0x403cc700,len:0x2fe4
17:48:10.459 -> entry 0x403c98ac
17:48:10.975 -> Guru Meditation Error: Core  0 panic'ed (LoadProhibited). Exception was unhandled.
17:48:10.975 -> 
17:48:10.975 -> Core  0 register dump:
17:48:10.975 -> PC      : 0x4202d253  PS      : 0x00060130  A0      : 0x8202d3f0  A1      : 0x3fceb200  
17:48:10.975 -> A2      : 0x00000000  A3      : 0x0000000c  A4      : 0x00000000  A5      : 0x3fcf2398  
17:48:10.975 -> A6      : 0x00001800  A7      : 0x00000004  A8      : 0x00000000  A9      : 0x00000003  
17:48:10.975 -> A10     : 0x00000003  A11     : 0x3fceb208  A12     : 0x3fceb20c  A13     : 0x00000000  
17:48:10.975 -> A14     : 0x00000003  A15     : 0x00000000  SAR     : 0x00000019  EXCCAUSE: 0x0000001c  
17:48:10.975 -> EXCVADDR: 0x00000014  LBEG    : 0x400556d5  LEND    : 0x400556e5  LCOUNT  : 0xfffffffd  
17:48:10.975 -> 
17:48:10.975 -> 
17:48:10.975 -> Backtrace: 0x4202d250:0x3fceb200 0x4202d3ed:0x3fceb230 0x4202af7a:0x3fceb250 0x4202ac9b:0x3fceb270 0x4202cc74:0x3fceb290 0x4200584a:0x3fceb2c0 0x4204c3d2:0x3fceb2e0 0x40377e7f:0x3fceb310 0x403cdb0e:0x3fceb340 0x403cdea5:0x3fceb380 0x403c9919:0x3fceb4b0 0x40045c01:0x3fceb570 0x40043ab6:0x3fceb6f0 0x40034c45:0x3fceb710
17:48:10.975 -> 
17:48:10.975 -> 
17:48:10.975 -> 
17:48:10.975 -> 
17:48:10.975 -> ELF file SHA256: f53fa2d250fc1e14
17:48:10.975 -> 
17:48:10.975 -> E (556) esp_core_dump_flash: Core dump flash config is corrupted! CRC=0x7bd5c66f instead of 0x0
17:48:10.975 -> E (564) esp_core_dump_elf: Elf write init failed!
17:48:11.022 -> E (569) esp_core_dump_common: Core dump write failed with error=-1
17:48:11.022 -> Rebooting...

 

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...