Categories: Arduino

Multithread con Arduino e la libreria TimedAction ( come simularlo con il protothreading)

Benvenuti su 9minuti.it, oggi vedremo una libreria molto utile e che può semplificarci la vita in tanti casi.

Sto parlando di simulare il multithread con Arduino e la libreria TimedAction.

Arduino, di suo, non ha il supporto per il multithread e quindi va simulato.

Ma cos’è il multithread e perché ci serve?

Abbiamo visto come nella programmazione si parta dall’alto e si vada verso il basso, a volte però è necessario eseguire più programmi in maniera simultanea e in questo caso parliamo di programmazione concorrente.

Vorrei ora fare un esempio che ha a che fare poco con l’informatica ma che credo possa spiegare bene il concetto.

Prendiamo due testi, il primo è la poesia Soldati di Giuseppe Ungaretti e il secondo sono le prime tre strofe della Divina Commedia di Dante Alighieri.
Se fossero righe di un programma (o di un testo in generale) partiremmo dalla prima e finiremmo con l’ultima.

Si sta come
d’autunno
sugli alberi
le foglie.


Nel mezzo del cammin di nostra vita
mi ritrovai per una selva oscura,
ché la diritta via era smarrita.

Ma se invece volessimo leggerle in contemporanea, possiamo farlo?

Il processori degli attuali computer sono multi core, multithread e addirittura a volte multi processore.

Essi non avrebbero alcun problema ad eseguire i due testi in maniera simultanea.

Qui sotto un esempio dei due testi visti come due thread differenti eseguiti nello stesso esatto momento.

Primo Thread                               Secondo Thread 

Si sta come                                Nel mezzo del cammin di nostra vita
d’autunno                                  mi ritrovai per una selva oscura,
sugli alberi                               ché la diritta via era smarrita.
le foglie.

Arduino purtroppo però non supporta il multithreading. 🙁

Ed è qui che vediamo come simulare il multithread con Arduino e la libreria TimedAction, per far questo dobbiamo però introdurre una nuova parola: protothreading.

Nell’esempio sottostante vediamo un esempio di come agisce il protothreading, ovvero legge una riga di un testo e subito dopo quella dell’altro, in maniera alternata.

Si sta come
Nel mezzo del cammin di nostra vita 
d’autunno
mi ritrovai per una selva oscura, 
sugli alberi
ché la diritta via era smarrita.
le foglie.

Ecco perché, quando si parla di protothreading, non possiamo parlare esattamente di contemporaneità.

Il microcontrollore di Arduino è però così veloce che nella grandissima maggioranza dei casi non noteremo alcun ritardo.

Dalla teoria alla pratica

Necessario:

  • Arduino Uno
  • Pulsante
  • Resistenza da 10k ohm

Collegamento del pulsante

Lo sketch

Scarichiamo la libreria TimedAction se non sapete come farlo vi mando a questa guida.

Nell’esempio seguente vedremo come eseguire due funzioni quasi contemporaneamente in maniera da simulare il multithread con Arduino e la libreria TimedAction.

La prima funzione controllerà se un pulsante viene premuto e accenderà il led integrato collegato al pin 13. La seconda invece stamperà a schermo una stringa ogni minuto.

#include <TimedAction.h>

#define button 8
#define led 13
int minutes = 0;

void checkButton(){
  if (ditalRead(button) == TRUE){
    digitalWrite(led, HIGH);
  }
  else{
    digitalWrite(led, LOW);
  }
}

void minutesCounter(){
  minutes++;
  Serial.print("Minuti trascorsi: " + minutes );
}

TimedAction TimedAction_checkButton = TimedAction(100, checkButton);
TimedAction TimedAction_minutesCounter = TimedAction(60000, minutesCounter);

void setup() {
  pinMode(led, OUTPUT);
  pinMode(button, INPUT);
  Serial.begin(9600);
}

void loop() {
  TimedAction_checkButton.check();
  TimedAction_minutesCounter.check();
}

1 – Includiamo la libreria TimedAction

3, 4 – Usiamo le define per i pin del led e del bottone

5 – Dichiariamo la variabile di tipo intero minutes che verrà incrementata ad ogni minuto

7 – Iniziamo a scrivere la nostra funzione checkButton() di tipo void

8 – Se lo stato del pin 8 è attivo

9 – Allora accendiamo il pin 13

11 – Altrimenti

12 – Spegnamo il pin 13

16 – Iniziamo a scrivere la nostra funzione minutesCounter() di tipo void

17 – Incrementiamo di 1 la nostra variabile minutes

18 – Scriviamo a schermo “Minuti trascorsi: ” e il numero contenuto all’interno della variabile minutes

21 – Creiamo un oggetto di tipo TimedAction chiamato TimedAction_checkButton e lo inzializziamo con la funzione TimedAction().

Questa funzione riceve due parametri, uno è ogni quanto tempo vogliamo che la nostra funzione venga eseguita, in questo caso ogni 100 millisecondi. Il secondo invece è il nome della nostra funzione senza le parentesi tonde.

22 – Facciamo la medesima cosa per la seconda funzione. Come avrete visto la eseguiamo una volta ogni 60 secondi, in maniera da avere un minuto preciso.

25, 26 – Dichiariamo i pin che andremo ad utilizzare. In output per il led ed in input per il bottone.

27 – Attraverso il metodo begin() dell’oggetto Serial possiamo stampare a schermo la nostra stringa

31, 32 – Usiamo il metodo check() dei nostri oggetti di tipo TimedAction precedentemente creati

Se tutto è andato bene dovreste vedere… Anzi no, non ve lo dico, tanto ormai dovreste aver capito.

Come al solito rimango disponibile per qualsivoglia chiarimento!

Grazie,
alessandro

Alessandro Oppo

Alessandro è un milanese che vorrebbe scappare da Milano, è appassionato di informatica ma vorrebbe vivere senza telefono, è un artigiano eppure vorrebbe robotizzare tutto, impara una cosa e già vorrebbe studiare dell’altro. Autodidatta da sempre, gli piace sbattere la testa finché tutto non funziona come vuole lui, spesso ci riesce anche! Visita il suo blog personale alexoppo.com Il motto che si ripete dentro la testa è: “Se ci sono riusciti gli altri ci posso riuscire anche io”.

View Comments

Recent Posts

Ponti sospesi: cosa abbiamo sbagliato? cosa si potrebbe fare?

Poco prima di Natale ho avuto la fortuna di poter partecipare a un evento chiamato…

11 mesi ago

Siamo quel che facciamo? – racconto breve

Armando quel giorno era particolarmente stanco. Tutto, per quanto andasse bene, sembrava metterlo sotto pressione.…

1 anno ago

Il limite è sempre la mente – Racconto breve

Armando guardò l’orologio e vide il proprio riflesso sul quadrante bianco. Il riflesso però non…

1 anno ago

L’ultimo giorno del carcere – Racconto breve

I muri sono muri, lo sono sempre, anche quando le porte sono aperte. Era la…

1 anno ago

Riflessioni sul carcere

Pochi di noi riflettono sull’esistenza nella nostra società del carcere. Il carcere è la concretizzazione…

1 anno ago

Come dovremmo dialogare secondo me

Spesso intraprendiamo delle conversazioni e delle chiacchierate piuttosto inconsapevolmente. Voglio dire che non siamo molto…

1 anno ago