---
# System prepended metadata

title: Multitasking a Arduino (II).
tags: [Arduino, ' programació', SMX]

---

<div style="width: 45%; margin-left: auto;">

![image](https://hackmd.io/_uploads/By3ai4Bolx.png)

</div>

<a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"><img alt="Llicència de Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-sa/4.0/88x31.png" /></a><br />Aquesta obra està subjecta a una llicència de <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">Reconeixement-CompartirIgual 4.0 Internacional de Creative Commons</a>

# Multitasking a Arduino (II).
## Avançant amb la solució.

Una possible solució per al problema d'enviar missatges cada 2 i cada 3 segons podria ser la següent:

```cpp=
void setup() {
  Serial.begin(115200);
  Serial.println("Inicialitzant l'aplicació");
}

void loop() {
  Serial.println("> Missatge cada 2 segons.");
  Serial.println("> Missatge cada 3 segons.");
  delay(2000);
  Serial.println("> Missatge cada 2 segons.");
  delay(1000);
  Serial.println(">>  Missatge cada 3 segons.");
  delay(1000);
  Serial.println("> Missatge cada 2 segons.");
  delay(2000);
}
```

Com podem veure el nostre loop es repeteix cada 6 segons que és exactament el Mínim Comú Múltiple entre 2 i 3.
Aquesta solució no és gaire satisfactòria, d'una banda ens obliga a repetir l'enviament dels mateixos missatges i d'altra és engorrosa i poc intuitiva.

Una millor aproximació pot consistir en l'utilització de la funció millis() que ens retorna el nombre de milisegons que porta el sistema en marxa. Emprant aquesta funció podem desar quan va ser la darrera vegada que varem enviar cadascú dels missatges i tornar-los a enviar només quan toqui de manera condicional.
![image](https://hackmd.io/_uploads/BkEN4IHTge.png)

```cpp=
unsigned long ultim_missatge_2_s = 0;
unsigned long ultim_missatge_3_s = 0;

void setup() {
  Serial.begin(115200);
  Serial.println("Inicialitzant l'aplicació");
  ultim_missatge_2_s = millis();
  ultim_missatge_2_s = millis();
}

void loop() {
  unsigned long ara = millis();
  if (ara - ultim_missatge_2_s > 2000){
    Serial.println("> Missatge cada 2 segons.");
    ultim_missatge_2_s = ara;
    }
  if (ara - ultim_missatge_3_s > 3000){
    Serial.println("  >>  Missatge cada 3 segons.");
    ultim_missatge_3_s = ara;
    } 
}
```

Aquesta solució ja és força interessant, però encara la podem millorar amb l'ús de tasques asíncrones. Nosaltres utlitzarem la llibreria de Luís Llamas creada a tal efecte.
![image](https://hackmd.io/_uploads/rJFVYIrael.png)


```cpp=
#include "AsyncTaskLib.h"

void tasca_2_s(){
  Serial.println("> Missatge cada 2 segons.");
  }

void tasca_3_s(){
  Serial.println("  >>  Missatge cada 3 segons.");
  }

AsyncTask asyncTask2(2000, true, tasca_2_s);
AsyncTask asyncTask3(3000, true, tasca_3_s);

void setup() {
  Serial.begin(115200);
  Serial.println("Inicialitzant l'aplicació");
  asyncTask2.Start();
  asyncTask3.Start();
}

void loop() {
     asyncTask2.Update();
     asyncTask3.Update();
    }
```

Les tasques asíncrones són la eina més còmode per a realitzar operacions independents de la resta del programa. Hi ha més d'una llibreria que permet treballar amb elles, cadascuna amb els seus avantatges i els seus inconvenients.

