Arduino: Struttura del programma

La struttura di base del linguaggio di programmazione Arduino chiamata ‘sketch’ è abbastanza semplice e viene eseguito in almeno due parti. Queste due parti necessarie (dette anche funzioni) sono racchiuse nei seguenti blocchi di istruzioni:

void setup()
{
   istruzioni che devono essere eseguire una sola volta all’inizio del programma;
}

void loop()
{
   ciclo in cui viene racchiuso il programma vero • proprio che deve essere eseguito
ripetutamente finché la scheda non viene spenta;

}

Dove setup () è la preparazione, loop () è l’esecuzione. Entrambe le funzioni sono necessarie per l’esecuzione del programma.

Il contenuto scritto dentro le parentesi graffe, •quindi dopo la funzione setup, contiene ed esegue la dichiarazione di tutte le variabili. La funzione setup è posta sempre all’inlzio del programma. Essa viene eseguita solo una volta, ed è usata per impostare i pin del microcontrollore Arduino, il cosidetto pinMode, o inizlalizzare la comunicazione seriale.

Segue la funzione loop. Essa include il codice da eseguire in modo continuo: lettura ingressi, attivazione uscite, ecc. Questa funzione è il cuore di tutti i programmi di Arduino.

setup ()

Il setup 0 viene eseguito una volta sola appena si avvia il programma. Viene utilizzato per inizializzare i pin del mioocontrollore Arduino e quindi stabilisce i pin di ingresso e di uscita, e/o inizializza la comunicazione seriale. Deve essere incluso in un programma, anche se non ci sono istruzioni da eseguire.

void setup ()
{
pinMode (pin, OUTPUT); // imposta la variabile ‘pin’ come uscita
}

loop ()

La funzione loop () fa girare consecutivamente il programma contenuto all’interno delle parentesi graffe, permettendo al programma di scambiare, rispondere e controllare la scheda Arduino.

void loop ()
{
digitalWrite (pin, HIGH); // il ‘pin’ è su o acceso
delay(1000); // pausa di un secondo
digitalWrite(pin, LOW); // il ‘pin’ è giù o spento
delay(1000); // pausa di un secondo
}

Funzione

Una funzione è un blocco di codice che ha un nome ben definito, quindi è un blocco di istruzioni che vengono eseguite quando la funzione viene chiamata. La funzione void setup () e •void loop () sono già state descritte. Le altre funzioni saranno descritte più avanti.

Le funzioni sono utilizzate per eseguire operazioni ripetitive in modo da ridurre il codice programma ed evitare quindi confusione nel programma stesso. La funzioni sono dichiarate all’inizio del programma • e specificate dal tipo di funzione.

La struttura della funzione è la seguente:
‘Tipo del valore restituito’ ‘Nome funzione’ (‘Elenco dei parametri’)
Dopo il tipo, occorre dichiarare il nome dato alla funzione e tra parentesi i parametri che vengono passati alla funzione.

Esempio int delayVal():
Il tipo di valore che viene restituito dalla funzione ‘int’ per la funzione delayVal è di tipo intero. Se nessun valore deve essere restituito il tipo di funzione è nullo. I tipi di dati (int, byte, long, insigne long) verranno spiegati più avanti. La funzione int per la variabile di esempio delayVal() è di tipo intero • viene usato per impostare un valore di ritardo in un programma leggendo il valore di un potenziometro. Prima occorre dichiarare una variabile locale v; viene letto il valore del potenziometro che da un numero compreso tra 0-1023, poi si divide tale valore per 4, cosi si ha un valore finale compreso tra 0-255, • infine viene restituito il valore al programma principale.

int delayVal()
{
   int v; // creo temporaneamente una variabile di nome ‘v’
   v = analogRead(pot): // legge il valore del potenziometro
   v = v / 4; // converte il valore 0-1023 a 0-255
   return v; // restituisce il valore finale
}

Le parentesi €graffe

Le parentesi graffe definiscono l’inizio e la fine dei blocchi di codice e dei blocchi di istruzioni come il void loop () e le istruzioni condizionate if.

Type function ()
{
   statements;
}

Una parentesi graffa aperta ‘{‘ deve essere sempre seguita da una parentesi graffa di chiusura ‘}’, il numero delle parentesi devono essere uguali. Una parentesi aperta e non chiusa può portare a errori nascosti che il compilatore del programma non vede e che a volte può essere difficile da rintracciare in un programma di grandi dimensioni. L’ambiente Arduino include una comoda funzione per controllare le parentesi graffe, basta selezionare un check, o anche fare click sul punto di inserimento subito dopo una parentesi e la sua corrispondente parentesi di chiusura sarà evidenziata.

Punto e virgola

Il punto •e virgola è utilizzato per chiudere ogni istruzione o dichiarazione e• serve a separare gli elementi del programma. Il punto e virgola permette di scrivere due o più istruzioni su una stessa riga, ma questo rende li codice più difficile da leggere. Un punto e virgola è anche usato per separare gli elementi in un ciclo for. Dimenticare di terminare una riga con il punto e virgola si tradurrà in un errore di compilazione … ed è forse l’errore più frequente.

Commenti

Blocco commenti (più righe). All’inizio di ogni programma è conveniente scrivere un commento al programma stesso. Una serie di righe di commenti costituiscono un blocco. Il blocco del commento è un’area di testo ignorato dal programma • viene usato per aiutare a capire le parti del programma. Iniziano con ‘/*’ e finiscono con ‘*/’ e possono estendersi su più righe.

/*
commento riga uno
commento riga due
commento riga tre
*/

Singola linea di commento. I commenti di singola linea iniziano con ‘//’ e terminano con la prossima linea di codice. Sono usati per fornire maggiori informazioni su ciò che la dichiarazione compie o per un promemoria.

// riga singola

Poiché i commenti sono ignorati dal processore di Arduino non occupano spazio di memoria, quindi possono essere usati con generosità • possono anche essere usati per “commentare” blocchi di codice per il debug dello sketch.