Wpis z mikrobloga

Siema
Zaczynam swoją przygodę ze środowiskiem ArduinoIDE (programowanie ESP32), mam już trochę linijek kodu i chcę się dopytać o kilka rzeczy ( ͡º ͜ʖ͡º)
Robię sobie taką (na razie prymitywną) stację pogodową. Zakodowałem kilka "ekranów" czyli data czas (bazująca na domyślnym kodzie ze środowiska Arduino IDE), wilgotność, temperatura. Każdy wyświetla się po 5 sekund (funkcją delay).
Denerwuje mnie jednak, że wartość np. czasu zostaje pobierana raz przy wyświetleniu i sekundnik wtedy nie działa (oczywiście pewnie przez delay, bo pobiera jednorazowo tą wartość). Nie chciałbym tego rozpisywać jak żółtodziub czyli printLocalTime, delay 1000, printLocalTime, etc.
Da się to jakoś ładniej zrobić? xD

I jeszcze jedna kwestia. Funkcja pobierania czasu z NTP podaje dzień tygodnia w języku angielskim. Zrobiłem sobie customowe znaczki (polskie) i praktycznie w każdym innym miejscu wypisuję sobie to w naszym ojczystym języku, oprócz zegara. Chciałbym zrobić, hm.. "tabelę" z której podmieniałoby np. "Thu" na "Czw" etc. Jak się za to zabrać? ( ͡º ͜ʖ͡º)

#arduino #arduinoide #esp32 #programowanie #c
  • 20
  • Odpowiedz
@Zjem_Ci_nos
ESP32 ma dwa rdzenie i dwa "loopy" działające niezależnie, jeden rdzeń zatrudnij do sprawdzania czasu a drugi do wyświetlania, albo użyj przerywań/timera lub jak to ise tam nazywa

static uint32t var1 = 0;
static uint32
t var2 = 0;
static uint32_t var3 = 1000;

void setup1(){ //should run only once
//code for this setup1() function on core 1
var1 = 1000000;
}
void setup2(){ //should also run only once on
  • Odpowiedz
  • 3
@biauekWladcaJajek: może właśnie nabyłem ESP32 żeby NAUCZYĆ SIĘ TEGO? Po to zadaję te pytania? Po to się wdraźam?
Najlepiej w moim przypadku jest uczyć się na żywym organiźmie, czyli wpaść w coś i się tego uczyć, postawić jakieś założenia i podnosić z dnia na dzień stopień trudności.
Wpierw założenia, potem dokumentacja, sprawdzenie czy to jest możliwe i realizacja celu. Z 220 linijek (zrobionych w 2 godziny) mało która jest gotowcem, większość
  • Odpowiedz
  • 4
@Zjem_Ci_nos zamiast delay licz ms z funkcją millis. Ogólnie polecam ChatGPT do pomocy we fragmentarycznym pisaniu kodu. Wkurzające są limity znaków w pisaniu promptów ale da się wklejać fragmenty kodu w częściach. Dobrze jest wkleić fragment kodu który już masz, opisać jakich efektów oczekujesz i żeby zasugerował rozwiązanie z użyciem innej metody. Wtedy poda ci rozwiązanie wraz z wyjaśnieniem jak dana metoda działa. Wiadome jest że jak zaczynasz zabawę to nie wiesz
maniok - @ZjemCinos zamiast delay licz ms z funkcją millis. Ogólnie polecam ChatGPT d...

źródło: temp_file7655637894819201410

Pobierz
  • Odpowiedz
@Zjem_Ci_nos: hehe znam ten ból. Oni ci powiedzą, że musisz przeczytać najpierw 10 książek.

Robiłem podobne rzeczy, ale nie napiszę jak bo pewnie jest to totalnie niezgodne ze sztuką i wykopki by mnie zaraz zjechały. Napisz do mnie to podumamy
  • Odpowiedz
zamiast delay licz ms z funkcją millis


@maniok: nie, to zła porada nie słuchaj kolegi @Zjem_Ci_nos - znaczy słuchaj, bo to dobra porada ale w BARE METAL programowaniu. Delay() jak masz RTOSa wewnętrznie wzywa vTaskDelay() i to pozwala na przełączanie threadów dzięki czemu wykonują się inne operacje na innych wątkach.

@wiecejszatana Generalnie polecam sobie każdy osobny task w aplikacji pisać na osobnych wątkach, używasz delay() albo vTaskDelayUntil() by ustawić sobie timing
  • Odpowiedz
@Zjem_Ci_nos powiem Ci też dla ciekawostki, że wewnętrznie Arduino na ESP32 do loopów i do paru innych rzeczy (eventy, serial, wifi stack) używa osobnych tasków na core 0 i przy ustawianiu tasków na core 0 MUSISZ użyć delaya w loopie ponieważ ten delay pozwoli się najniższemu prio taskowi - watchdogowi - do nakarmienia go - w przeciwnym razie jeśli watchdog nie zostanie nakarmiony to ten zresetuje Ci urządzenie.

Ogólnie przeskocz sobie na
  • Odpowiedz
  • 1
@sorek Oczywiście, widać że masz ogromną wiedzę w temacie i metoda podana przez ciebie będzie o wiele lepsza. Na swoją obronę powiem tylko, że głównie bawię się z esp8266 i też jestem początkującym amatorem jak OP.

Dlatego lubię takie wpisy. Niby nie ja go zacząłem a i tak się czegoś nowego dowiedziałem. Nie wiedziałem że esp32 może mieć dwie pętle. Dzięki za dzielenie się wiedzą z innymi
  • Odpowiedz
Nie wiedziałem że esp32 może mieć dwie pętle.


@maniok: może mieć nawet 16!

Ogólnie Twoje podejście jest w 100% poprawne w normalnym systemie, jednak RTOS to specyficzna bestia, ale nawet tutaj ja używam tego by robić timing na niektórych rzeczzach gdy mam je w jednym wątku.
  • Odpowiedz
@maniok: tak, właściwie to limitu nie ma.. możesz mieć nawet 200 tasków, tylko wtedy overhead przełączania się między nimi jest spory.

I to też nie jest tak, że one się wykonują na raz - nie - po prostu gdy w jednym jest delay drugi przełącza się i wykonuje swoje instrukcje do czasu jak nie dojdzie do delay (albo task z wyższym priority zażąda przełączenia).

Polecam wyjaśnienie Pana z szwajcarskim akcentem (
sorek - @maniok: tak, właściwie to limitu nie ma.. możesz mieć nawet 200 tasków, tylk...
  • Odpowiedz
  • 0
@sorek Pana znam. Siedzę w pierwszym rzędzie. Niestety wszystkiego nie oglądam ale jak napotykam jakiś problem albo stykam się z konkretnym zagadnieniem to szukam i tam informacji
  • Odpowiedz