Skocz do zawartości

Monitory HMI w użytku domowym.


SOYER

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ę?

 

Link do komentarza
Share on other sites

(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_
Link do komentarza
Share on other sites

(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
Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

(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
Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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...?

Link do komentarza
Share on other sites

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...

 

Link do komentarza
Share on other sites

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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.