La funzione asincrona chiama nello schizzo di Arduino


14

In uno schizzo di Arduino, c'è un modo per effettuare chiamate di funzione asincrone all'interno del loop? Come ascoltare le richieste tramite il server http ed elaborarle in modo non bloccante .


1
Se non sei un principiante in C ++, puoi dare un'occhiata alla libreria Cosa ( github.com/mikaelpatel/Cosa ). È una riscrittura completa della libreria di Arduino per renderlo migliore: OOP e generalmente guidato da interruzioni. Penso che supportino HTTP, ma non ho ancora verificato quella parte.
jfpoilpret,

Risposte:


11

Sì e no. Sei un po 'vago su quello che vuoi fare. L'ho trasformato in alcune sezioni diverse (principalmente incentrato sulla lettura dei dati del sensore ... si applica a tutto ma questo è il contesto che sto usando):

discussioni

AFAIK tutti gli Arduinos hanno un solo core (possono fare una cosa alla volta). Per la maggior parte delle schede Arduino, il multithreading hardware non è supportato. Tuttavia, ci sono modi per implementare il multithreading software . L'approccio di AsheeshR non funzionerebbe bene per il completamento di funzioni che richiedono molto tempo (ovvero qualcosa in una libreria che richiede un po 'di tempo o un ritardo) perché verrebbe bloccato da quelle istruzioni, ma funzionerebbe bene in breve funziona come pinMode(). La libreria di Protothreads elencata potrebbe essere migliore in questo, ma non lo so davvero.

Sarebbe difficile orchestrarlo con HTTP, soprattutto perché devi farlo

ritardi

Un modo comune per lo stallo di uno schizzo è l'uso di un ritardo. Questo può essere risolto usando, nel ciclo principale, un'istruzione if e la millis()funzione che restituisce un tempo (non un tempo di clock, ma piuttosto il tempo dall'inizio di Arduino). È inoltre possibile eseguire un loop all'interno del loop per eseguire il polling dei dati del sensore.

L' millis()approccio non funzionerebbe bene con le cose che causano lo stallo dell'intero programma (ovvero più ritardi o loop che durano una notevole quantità di tempo). Si noti che 100ms IIRC è il tempo massimo generale per rendere l'interfaccia utente non sgraziata.

interrupt

Gli interrupt sono un ottimo modo per mantenere le cose quasi asincrone. Eseguono un breve codice (specificato dall'utente) ogni volta che cambia lo stato di un pin. Si interrompe da loop()e ritorna da dove era stato interrotto una volta eseguito " ISR ". Non ho molto tempo per spiegare come farlo, ma una rapida ricerca su Google produrrà molti risultati.


Per quanto riguarda l'esempio, la sezione di threading sarebbe la più applicabile. Questo argomento è piuttosto vago, quindi dovrai sperimentare alcune cose e trovare qualcosa che funzioni.


3

Ho appena pubblicato del codice per un programmatore di attività nel parco giochi l'altro giorno, potresti dare un'occhiata, forse puoi adattarlo alle tue esigenze.

Il processore di Arduino è intrinsecamente a thread singolo e non può essere multi-task. Come è stato menzionato, esistono tuttavia modi per creare l'illusione del multitasking. Il pinguino di Annonomus ha colpito abbastanza bene quelli.

Dai un'occhiata anche a TimerOne (probabilmente è meglio;)


TimerOne è una cattiva idea perché funziona solo con arduinos basati su avr. Ad esempio il mio Wemos D1 R1 non funziona
Vyachaslav Gerchicov
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.