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.
Indice
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
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
metti la lettera maiuscola sul tuo nome alla fine, mi urta