Asynchroniczne wywołania funkcji w szkicu Arduino

14

Czy w szkicu Arduino istnieje sposób wykonywania asynchronicznych wywołań funkcji w pętli? Podobnie jak słuchanie żądań za pośrednictwem serwera HTTP i przetwarzanie ich w sposób nieblokujący .

Jacer Omri
źródło
1
Jeśli nie jesteś początkującym w C ++, możesz zajrzeć do biblioteki Cosa ( github.com/mikaelpatel/Cosa ). Jest to kompletne przepisanie biblioteki Arduino, aby było lepiej: OOP i generalnie sterowane przerwaniami. Myślę, że obsługują HTTP, ale jeszcze tego nie sprawdziłem.
jfpoilpret

Odpowiedzi:

11

Tak i nie. Jesteś trochę niejasny, co chcesz zrobić. Zrobiłem to w kilku różnych sekcjach (głównie skupionych na czytaniu danych z czujników ... dotyczy to wszystkiego, ale takiego kontekstu używam):

Wątki

AFAIK wszystkie Arduino mają tylko jeden rdzeń (mogą robić jedną rzecz jednocześnie). W przypadku większości kart Arduino wielowątkowość sprzętowa nie jest obsługiwana. Istnieją jednak sposoby implementacji wielowątkowości oprogramowania . Podejście AsheeshR nie zadziałałoby dobrze w przypadku funkcji, których wykonanie zajmuje dużo czasu (np. Coś w bibliotece, co zajmuje trochę czasu lub opóźnienie), ponieważ zostałyby zakłócone przez te instrukcje, ale działałoby to dobrze przez krótki czas działa jak pinMode(). Biblioteka Protothreads podana tam może być w tym lepsza, ale tak naprawdę nie wiem.

Trudno byłoby to zharmonizować za pomocą HTTP, zwłaszcza że trzeba to zrobić

Opóźnienia

Typowym sposobem przeciągnięcia szkicu jest użycie opóźnienia. Można to rozwiązać za pomocą w pętli głównej instrukcji if i millis()funkcji, która zwraca czas (nie czas zegarowy, ale czas od uruchomienia Arduino). Możesz również wykonać pętlę w pętli, aby sondować dane czujnika.

millis()Podejście nie działa dobrze z rzeczy, które powodują, że cały program do stajni (czyli więcej opóźnień lub pętle że ostatnia zauważalna ilość czasu). Zauważ, że 100 ms IIRC to ogólny maksymalny czas, aby interfejs użytkownika nie wydawał się opóźniony.

Przerwania

Przerwania to świetny sposób na utrzymanie prawie asynchroniczności. Za każdym razem, gdy zmienia się stan kodu PIN, uruchamiają krótki fragment kodu (określony przez użytkownika). Odrywa się od loop()i wraca tam, gdzie zostało przerwane po uruchomieniu „ ISR ”. Nie mam dużo czasu, aby wyjaśnić, jak to zrobić, ale szybkie wyszukiwanie w Google przyniesie wiele wyników.


Na twoim przykładzie najbardziej przydatna byłaby sekcja wątków. Ten temat jest dość niejasny, więc musisz eksperymentować z kilkoma rzeczami i znaleźć coś, co działa.

Anonimowy pingwin
źródło
3

Właśnie opublikowałem jakiś kod dla harmonogramu zadań na placu zabaw pewnego dnia, możesz rzucić okiem, może dostosujesz go do swoich potrzeb.

Procesor Arduino jest z natury jednowątkowy i nie może wykonywać wielu zadań. Jak już wspomniano, istnieją jednak sposoby na złudzenie wielozadaniowości. Annonomus Penguin trafił całkiem nieźle.

Zobacz także TimerOne (prawdopodobnie lepiej;)

Aurast
źródło
TimerOne to zły pomysł, ponieważ działa tylko z arduinos opartymi na AVR. Na przykład mój Wemos D1 R1 nie działa
Wiaczasław Gerchicow