Multithreading con Arduino
Pubblicato da hosiris su ottobre 20, 2011
E’ possibile eseguire operazioni in multithread con arduino? Diciamo di no! Perché il nostro piccolo amico non è dotato di scheduler. Allora bisogna trovare il modo di supplire a questa mancanza.
Utilizzaremo il seguente schema:

la resistenza ha il valore di 470ohm. Di seguito il risultato reale.

Facciamo una prima applicazione in cui semplicemente faremo lampeggiare i led:
void setup(){
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
}
void loop(){
digitalWrite(13, HIGH);
digitalWrite(12, HIGH);
delay(500);
digitalWrite(13,LOW);
digitalWrite(12,LOW);
delay(500);
}
Vediamo che i led saranno costretti a lavorare in maniera sincrona:
Sostituiamo adesso quel codice con il seguente:
#define ledPin1 12
#define ledPin2 13
#define led1Cycle 500U
#define led2Cycle 750U
unsigned long led1LastMillis = 0;
unsigned long led2LastMillis = 0;
boolean led1State = false;
boolean led2State = false;
boolean cycleCheck(unsigned long *lastMillis, unsigned int cycle)
{
unsigned long currentMillis = millis();
if(currentMillis - *lastMillis >= cycle)
{
*lastMillis = currentMillis;
return true;
}
else
return false;
}
void setup()
{
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
}
void loop()
{
if(cycleCheck(&led1LastMillis, led1Cycle))
{
digitalWrite(ledPin1, led1State);
led1State = !led1State;
}
if(cycleCheck(&led2LastMillis, led2Cycle))
{
digitalWrite(ledPin2, led2State);
led2State = !led2State;
}
}
In questo modo, grazie al check sul valore restituito da millis() riusciamo a gestire più processi separatamente:
Buon divertimento!


Frattanto nella blogosfera #36 « Ok, panico detto
[...] Multithreading con Arduino ::: HosiriS [...]