Skocz do zawartości

Co wybrać dla ESP32 - Arduino, czy IDF


Elvis

Pomocna odpowiedź

Nie chce mi się zaglądać do dokumentacji, ale o ile pamiętam coś koło dwóch sekund. Oczywiście można to wszystko sobie poustawiać, możesz karmić watchdoga bez wywoływania delay/yield czy całkiem wyłączyć.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

12 minut temu, ethanak napisał:

Nie chce mi się zaglądać do dokumentacji, ale o ile pamiętam coś koło dwóch sekund. Oczywiście można to wszystko sobie poustawiać, możesz karmić watchdoga bez wywoływania delay/yield czy całkiem wyłączyć.

2 sekundy to kupa czasu...😉 dziekuje bardzo za odpowiedz...co do twojego przykladu no to fakt...bardzo schludnie i prosto wyglada...ale jako "zadanie domowe" juz mam taki mini zarys jak by to na millis wygladalo...choc jest duzo trudniej bo trzeba pare flag zapamietac a to dodatkowo komplikuje, ale nawet dla doksztalcenia spruboje to zrobic jak najprosciej..😜

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

8 minut temu, ethanak napisał:

Właśnie o to chodzi abyś porównał czytelność, stopień trudności napisania kodu i modyfikacji dla obu rozwiązań.

Z modyfikacja akurat to nie bylby problem bo zmiany tylko w tablicach...co do reszty? Hmmm..ciezko bedzie pobic te taski😉 ale zobacze co wyskrobie..napewno sie pochwale...🤔

Link do komentarza
Share on other sites

20 godzin temu, ethanak napisał:

Spróbuj zrobić to na tych swoich millisach(), a potem przerób na siedem diod 🙂

Zgodnie z postanowieniem wrzucam kod na milisach...wczoraj po polnocy mnie naszlo😉

#define LEDY 5
#define ILOSC_INTERVAL 5

uint32_t last_t[LEDY];
bool stan_led[LEDY] = {1,1,1,1,1};
uint8_t licznik[LEDY] = {1,1,1,1,1};
uint32_t atualny_t = 0;

int leds[LEDY][ILOSC_INTERVAL + 1] = {
    {9,100,200,300,400,500},
    {10,110,220,200,600,100},
    {11,200,250,300,350,400},
    {12,400,410,420,430,440},
    {13,100,110,110,100,90}};

void setup() {

for (int i = 0; i < LEDY; i++) {
   pinMode(leds[i][0], OUTPUT);
   digitalWrite(leds[i][0], LOW);
  }
}

void loop() {
  atualny_t = millis();
  h();

}


void h() {

  for (int i = 0; i < LEDY; i++) {
    if (atualny_t - last_t[i] > leds[i][licznik[i]]) { //jesli czas uplynal dla danej led
      digitalWrite(leds[i][0], stan_led[i]); //zmien stan
      licznik[i]++;                         //przestaw licznik na kolejny interval dla danej led
      last_t[i] = atualny_t;                //zapisz aktualny czas dla led
      stan_led[i] = !stan_led[i];           //ustaw na przeciwny stan
      
      if (licznik[i] > ILOSC_INTERVAL) {  //jesli ilosc intervalow sie skonczyla dla danej led...
      licznik[i] = 1;                     //to ustaw na pierwszy
      }
    } 
  }
}

co prawda nie ma tutaj na starcie tego samego stanu na led bo ilosc intervalow jest nieparzysta, ale to tylko jedna linijka ktorej poprostu nie chcialo mi sie dopisac...te jedynki na starcie w tablicach tez mozna sie pozbyc piszac w kodzie np

licznik[i + 1]

ale z lenistwa juz nie kombinowalem...jak widac na millis tez to w miare zgrabnie wyglada...😉 a co do zmiany ilosci led lub intervalow no to tylko w definicjach zmienic i ok...(choc wiadomo ze na taskach to jeszcze zgrabniej wyglada, no ale takie bylo "zadanie domowe" wiec zrobilem)

Edytowano przez farmaceuta
Link do komentarza
Share on other sites

Świetnie

To teraz zobacz ile robisz rzeczy które nie są związane z programem. Jakieś dodatkowe liczniki, jakieś zapamiętywania stanów...

Nie publikowałem na razie całego kodu czytaka ale pomyśl, jak skomplikowałby się program gdybym chciał bawić się w jakieś millisy w przypadku syntezatora mbrola i synchronicznego odtwarzania dźwięku. Na dzisiaj wygląda to tak, że jeden task pcha zdania w kolejkę (przetwarzając to w międzyczasie na zapis fonetyczny) i czeka, aż się kolejka zwolni; drugi task pobiera zdania z kolejki, syntetyzuje mowę i pcha to do DMA. Żadnych millisów, delay jest po to aby jeden task mógł odczytać fragment książki nie przejmując się tym co zrobi gadacz

 No i po to są delaye w gadaczu, żeby reader miał czas na wrzucenie mu danych do gadania...

 

 

Link do komentarza
Share on other sites

Niewiele zrozumialem z powyzszego...😉hehe no ale sens wypowiedzi rozumiem, i wiem ze w prostych sytuacjach to na milis ujdzie, ale w tych bardziej "pro" to byla by katorga gdzie na taskach to latwizna jak sie je zna...(przyjdzie i czas na rtos'a dla mnie)

Link do komentarza
Share on other sites

(edytowany)
Dnia 6.12.2021 o 04:03, ethanak napisał:

@farmaceuta no to taki mały przykład - program z serii "blink", czyli miganie pięcioma diodami w różnym rytmie niezależnie (pisane "na kartce" czyli mogą być błędy):



int leds[5][6] = {
    {18,100,200,300,400,500},
    {19,110,220,200,600,100},
    {21,200,250,300,350,400},
    {22,400,410,420,430,440},
    {23,100,110,110,100,90}};

void ledTask(void *param)
{
    int *led=(int *)param;
    int i;
    pinMode(*led, OUTPUT);
    digitalWrite(*led, 0);
    while (1) {
        for (i=1; i< 6; i++) {
            digitalWrite(*led, !digitalRead(*led));
            delay(led[i]);
        }
    }
}

void setup()
{
    int i; char name[5];
    for (i=0; i<5; i++) {
        sprintf(name,"led%d", i);
        xTaskCreate(ledTask, name, 5000, (void *)leds[i], 0, NULL);
    }
}

void loop()
{
    // a tu jakiś kawałek kodu
}

 

W międzyczasie powstało całkowicie nowe środowisko dla ESP32 z pogranicza Arduino i MicroPython, które zachwyciło mnie prostotą i szybkością z jaką umożliwia programowanie. Nazywa się Toit i zostało stworzone w czasie ostatnich kilku lat przez programistów o ugruntowanym dorobku. Poniżej kod zainspirowany postem @ethanak napisany w Toit.

import gpio

leds ::= [[19, 100,200,300,400,500],
          [18, 110,220,200,600,100],
          [ 5, 200,250,300,350,400],
          [17, 400,410,420,430,440],
          [16, 100,110,110,100,90]]

main:
  for i := 0; i < 5; i++:
    task:: ledTask i

ledTask ledN:
  led := gpio.Pin leds[ledN][0] --output --input
  while true:
    for i := 1; i < 6; i++:
      led.set (led.get + 1) % 2
      sleep --ms=leds[ledN][i]

Ostatnio do środowiska dodano pakiet Jaguar, który dodatkowo przyspiesza tworzenie i uruchamianie programów bez potrzeby korzystania z chmury Toit.  

 

blink-leds-toit.thumb.gif.c2b0635b105a572a04cfb56572b2f651.gif

Edytowano przez krzychb
  • Lubię! 1
Link do komentarza
Share on other sites

Dnia 22.12.2018 o 02:14, Elvis napisał:

@krzychb dzięki za linka - co prawda sama odpowiedź nie do końca rozwiała moje wątpliwości, ale pod wpisem znalazłem list do książki Neil-a Koban'a: https://leanpub.com/kolban-ESP32/applinked

O ile rozumiem Arduino ma co najmniej jedną wadę związaną z brakiem wsparcia dla wielowątkowości - ktoś ma z tym jakieś doświadczenia? ESP32 ma dwa rdzenie, trochę szkoda byłoby nie dość że wykorzystywać tylko jeden to jeszcze w jednym wątku...

Dziękuję

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

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