Strutturare uno Sketch per Arduino
Breve tutorial alla corretta impostazione di uno Sketch per Arduino
In questo tutorial si vuole presentare una metodologia quanto più professionale sulla struttura da seguire per la realizzazione dei nostri sketch per le schede Arduino. Non si entrerà nel dettaglio delle singole istruzioni, bensì si cercherà di sviluppare meglio l’organizzazione dell’algoritmo per ottenere un programma versatile e facilmente espandibile.
Innanzitutto possiamo intendere lo sketch suddiviso in cinque parti:
//PARTE 1: inclusione di eventuali librerie ... //PARTE 2: dichiarazione variabili e setting di eventuali librerie ... //PARTE 3: ciclo di Setup (set di istruzioni eseguito solo una volta all'accensione) void setup(){ ... } //PARTE 4: ciclo di loop (set di istruzioni eseguito ciclicamente) void loop(){ ... } //PARTE 5: funzioni ausiliarie (set di istruzioni da richiamare nel ciclo loop) void nome_funzione(){ ... }
Nella PARTE 1 vanno inserite le librerie di cui abbiamo bisogno. Nel momento in cui si effettua l’inclusione di una libreria è opportuno conoscere nel dettaglio ciò che si sta aggiungendo, poiché eventuali nomi utilizzati per gestire variabili all’interno della libreria stessa non potranno essere riutilizzati nel nostro sketch. Includere librerie che non servono direttamente nel nostro sketch significa occupare inutilmente memoria disponibile all’interno del microcontrollore. Le librerie possono essere incluse facilmente con il comando:
#include <nome_della_libreria.h>
ad esempio, se si vogliono sfruttare le memorie EEPROM si utilizzerà la libreria EEPROM.h
#include <EEPROM.h>
Può accadere, per librerie di terze parti, che vi siano incompatibilità e collisioni tra librerie diverse tra loro (ad esempio se all’interno delle due librerie vi sono due variabili con lo stesso nome…) ed in tal caso sta a noi il risolvere la problematica. Se invece vengono utilizzate solo le librerie fornite con l’IDE Arduino non vi saranno problemi di gestione.
Nella PARTE 2 vengono create tutte le variabili utilizzate nello sketch: dall’assegnazione delle variabili dedicate agli INPUT/OUTPUT alle variabili ausiliarie per contenere dati di gestione. In questa zona vengono anche fatte le eventuali dichiarazioni riguardanti le librerie (ad esempio se si utilizza un display LCD i2c, oltre ad includere la relativa libreria sarà doveroso dichiarare l’indirizzo i2c corrispondente al display, se il modello è 16×2 o 20×4, ed eventuali pin di gestione). Questa parte, spesso, viene ampliata/modificata/ridotta durante la stesura dello sketch.
NB. Le variabili occupano spazio nella memoria del microcontrollore, sceglierle in modo opportuno evita problematiche di saturazione della memoria.
Nella PARTE 3 il ciclo di Setup prevede quell’insieme di istruzioni che verranno eseguite solo una volta all’accensione. In questa zona tipicamente si vede l’apertura della comunicazione seriale con l’impostazione relativa alla velocità (Serial.begin(9600);) la dichiarazione di input/output e l’eventuale attivazione del sistema pull-up interno su eventuali input (pinMode(pin, TIPOLOGIA);), l’attivazione/disattivazione di eventuali OUTPUT (digitalWrite(pin, STATO);) ecc.
Nella PARTE 4 il ciclo di Loop serve a contenere l’algoritmo che verrà ripetuto ciclicamente dal microcontrollore fino a che non verrà disattivata l’alimentazione su due esso. Un algoritmo che sfrutta in maniera impropria strutture, istruzioni e si basa su molte variabili potrebbe funzionare ma si avrebbe una saturazione della memoria disponibile e, superata una certa soglia di memoria occupata, l’IDE di Arduino informa che ci potrebbero essere problemi di stabilità.
Inoltre, se si sta sviluppando un progetto ampio ed articolato, è suggerito spezzettare lo sketch per singole funzioni, richiamandole quindi a seconda della necessità nel ciclo Loop.
Nella PARTE 5 andremo a sviluppare le singole funzioni. Questo permette, ad esempio, di saper subito dove metter mano in caso di modifica dello sketch (se voglio modificare l’algoritmo del calcolo di una variabile mi basterà cercare la funzione interessata anziché scorrere l’intero algoritmo).