Applicazioni multithread

Dovrei fare sistema che mi rilevi la temperatura e contemporaneamente mi catturi l'evento di un pulsante.
C'è la possibilità di fare programmazione parallela in Arduino?
Io ho trovato questo link:

http://www.waynemay.com/threading-in-arduino-07252011#note-124-1

Ne sapete nulla?

Grazie

parallelo no, come non puoi nemmeno con un PC mono-cpu e mono-core :slight_smile:
ma arduno esegue un'istruzione nell'ordine dei nanosecondi, quindi direi che se anche prima fai una e poi l'altra, ad occhio umano stai facendo tutto contemporaneamente.
Certo esistono sistemi per fare le cose più o meno in fretta, ma di solito non vale la pena perderci tempo.

Con il sistema che hai allegato aggiungi un layer (uno strato) tra arduino e il tuo codice, che esegue la gestione del thread, rendendo di fatto tutto più lento!!
I thread sono utili in sistemi complessi in modo da non doversi preoccupare di cosa un programma fà rispetto ad un altro; ma arduino può contenere progetti talmente basici che non è necessario, se non per puro scopo dimostrativo.

Se spieghi cosa hai in mente possiamo darti qualche consiglio :smiley:

Nulla di complesso.
Vorrei rilevare la temperatura e contemporaneamente catturare l'evento di un pulsante per poi fargli fare qualche cosa che ancora non so :smiley: potrebbe essere l'apertura di un cancello come fa suonare la fanfara :smiley: per ora mi sto concentrando sulla parte software.

Ho trovato questa libreria: Arduino Playground - HomePage che sembra faccia al caso mio.
Per farla funzionare ho dovuto modificare il file TimedAction.h e sostituire WProgram.h in Arduino.h

La TimedAction è una libreria che fa eseguire una determinata funzione (quindi un "compito") dopo un predeterminato intervallo di tempo. Non è un multithreading vero e proprio, il multithreading prevede lato software un meccanismo che permetta di eseguire più compiti in parallelo.

Esistono a tale scopo alcuni "sistemi operativi" multithreading per i microcontrollori Atmel, ad esempio FemtoOS oppure l'altro SO m.t. che aveva sviluppato un lettore di questo forum e di cui ora mi sfugge il nome. Essi lavorano ad un livello molto più basso e sono molto più complessi, prevedendo appunto tutta una logica di tick da assegnare ad ogni thread in modo che i questi siano eseguiti quasi in parallelo: quasi perché ogni compito è eseguito per un certo lasso di tempo, poi si passa al successivo. Esiste poi tutta una logica di gestione per attivare/disattivare questi thread così come impostarne la priorità.

Alla fine dei salmi spesso il gioco non vale la candela, nel senso che la complessità che si aggiunge al proprio codice non ripaga delle funzionalità aggiunte. Dopo tutto stiamo parlando di micro ad 8 bit e 16 MHz di clock: spesso basta strutturare bene il codice per ottenere lo stesso effetto anche senza ricorrere a tali strumenti.

Bè ma già la TimedAction è una buona soluzione.
Fai eseguire la lettura della temperatura ogni secondo e quella del pulsante ogni messo secondo.
Certo non è un multithread però è già qualcosa per un, come dicevi tu, micro ad 8 bit e 16 MHz di clock.

Grazie

Per queste 2 cose puoi benissimo usare una gestione dei 2 compiti basata sul trascorrere del tempo segnato dalla funzione millis() e 2 semplici if, non è necessario usare una libreria :wink:

unsigned long tempoOp1;
unsigned long tempoOp2;

void setup() {
  tempoOp1=millis()+1000; //1 secondo
  tempoOp2)=millis()+500; //0,5 sec
}

void loop() {
  if (millis()>tempoOp1) {
    ......il compito da eseguire....
    tempoOp1=millis()+1000;
  }
  if (millis()>tempoOp2) {
    .....il compito da eseguire.....
    tempoOp2=millis()+500;
  }
}

Grazie per la segnalazione ma con la libreria mi sembra più pulito.
:wink:

Metodo KISS: mai complicare una cosa che può essere fatta semplice. La lib TimedAction appesantisce il codice con il suo carico di codice, se devi solo leggere 1 pulsante ed un pin, perché complicarsi la vita? :stuck_out_tongue:

leo72:
Metodo KISS: mai complicare una cosa che può essere fatta semplice. La lib TimedAction appesantisce il codice con il suo carico di codice, se devi solo leggere 1 pulsante ed un pin, perché complicarsi la vita? :stuck_out_tongue:

quoto: ciò che non c'è, non si può rompere :grin:

Se il pulsante deve aprire il cancello forse puoi direttamente collegarlo a qualcosa che fa aprire il cancello senza passare dal micro, diverso il discorso se devi anche monitorare questa apertura in qualche modo

Per la serie UCAC (Ufficio Complicazione Affari Semplici) segnalo la libreria chibiOs, un RTOS citato qui sul forum, che sto provando e che trovo molto interessante (per ora ho aftto solo robe stile hello world, sia chiaro...)

Per quanto riguarda il discorso "sparare ad una mosca con un cannone" sono d'accordo, ma rilevo anche che un problema particolarmente semplice (almeno in apparenza) come quello esposto potrebbe essere anche un'ottima occasione per imparare ad usare una libreria che tornerà poi utile in scenari più compelssi.

:slight_smile:

Ah, comunque direi che in questo caso una semplice esecuzine sequenziale con un paio di delay() andrebbe bene ugualmente... sempre che lo sketch non debba fare altre cose.