Vedendo dei codici scritti da me e da altri mi son sempre chiesto se vi era la possibità di ottimizzare meglio il codice e renderlo sempre più compatto e meno esigente di risorse. Mi son detto perchè non proponiamo un gioco sul forum in modo da far capire a chi è all'inizio della programmazione come si può ottiimizzare un codice per renderlo più veloce e occupare meno memoria? L'idea è questa: propongo un tema molto semplice, una piccola funzione che deve ricreare l' SOS in codice morse. E' una cosa molto semplice che può fare chiunque ha un arduino buttato nel cassetto a prender polvere, deve solo collegare la usb e utilizzare il led a bordo. Per chi non lo sapesse l' SOS in codice morse è strutturato in questo modo: (S)1 0 1 0 1(spazio tra lettere) 000 (O)111 0 111 0 111 (Spazio tra lettere) 000 (S)1 0 1 0 1 (spazio tra parole)0000000... ripete. In pratica ogni 1 corrisponde al tempo di un punto, uno 0 corrisponde allo spazio tra un punto e l' altro e ha la stessa durata dell' 1. Tra una lettera e l' altra ci sono 000 quindi ipotizzando un tempo di 1= 250ms lo spazio tra due lettere durerà 750 ms led OFF. Per scrivere una linea ci vogliono 111 = 750 ms led ON. Lo spazio tra una parola e la successiva è dato da 0000000 = 1750 ms led OFF. Ci sono solo alcune regole del gioco da rispettare:
- La funzione creata non deve essere bloccante quindi niente uso di delay o cicli che possano bloccare l'esecuzione del programma.
- Per poter essere comprensibile a tutti, non bisogna far uso di istruzioni assembler o accesso diretto a porte e registri.
- A chi mastica già da tempo con la programmazione, dare prima la possibilita a chi è poco pratico di dare la propria soluzione in modo da fargli capire eventuali errori commessi.
Qui sotto un esempio del risultato finale scritto nel peggiore dei modi. In bocca al lupo.
/* clock 250 ms */
/* costruzione stringa SOS " 1 0 1 0 1 000 111 0 111 0 111 000 1 0 1 0 1 0000000 ....ripete " */
#define t_punto 250
#define t_linea 750
#define t_simbolo_simbolo 250
#define t_lettera_lettera 750
#define t_parola_parola 1750
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, true);
delay(t_punto);
digitalWrite(LED_BUILTIN, false);
delay(t_simbolo_simbolo);
digitalWrite(LED_BUILTIN, true);
delay(t_punto);
digitalWrite(LED_BUILTIN, false);
delay(t_simbolo_simbolo);
digitalWrite(LED_BUILTIN, true);
delay(t_punto);
digitalWrite(LED_BUILTIN, false);
delay(t_lettera_lettera);
digitalWrite(LED_BUILTIN, true);
delay(t_linea);
digitalWrite(LED_BUILTIN, false);
delay(t_simbolo_simbolo);
digitalWrite(LED_BUILTIN, true);
delay(t_linea);
digitalWrite(LED_BUILTIN, false);
delay(t_simbolo_simbolo);
digitalWrite(LED_BUILTIN, true);
delay(t_linea);
digitalWrite(LED_BUILTIN, false);
delay(t_lettera_lettera);
digitalWrite(LED_BUILTIN, true);
delay(t_punto);
digitalWrite(LED_BUILTIN, false);
delay(250);
digitalWrite(LED_BUILTIN, true);
delay(t_punto);
digitalWrite(LED_BUILTIN, false);
delay(250);
digitalWrite(LED_BUILTIN, true);
delay(t_punto);
digitalWrite(LED_BUILTIN, false);
delay(t_parola_parola);
}