void setup() { statements; } void loop() { statements; }
Dove setup() indica il blocco di settaggio e loop() è il blocco che viene eseguito. Entrambe le sezioni sono necessarie per far si che un programma funzioni.
setup() è la prima funzione ad essere invocata verrà eseguita una volta sola e in essa vengono dichiarate le variabili usate nel programma, è usata per impostare il pinMode o inizializzare la comunicazione seriale.
La funzione loop() contiene il codice che deve essere eseguito ripetutamente, in essa vengono letti gli input, i segnali di output ecc…
Questa funzione è la parte principale di un programma Arduino (sketch), esegue la maggior parte del lavoro.
La funzione setup() è chiamata una volta sola quando il programma viene fatto funzionare. E' usata per inizializzare il pinMode e la seriale e deve essere incluso in un programma, anche se non ci sono istruzioni da eseguire.
void setup() { pinMode(pin, OUTPUT);
//inposta il 'pin' come output }
Dopo che è stata eseguita la chiamata alla funzione setup(), la funzione loop() fa esattamente quello che suggerisce il suo nome, esegue ripetutamente un loop, permettendo al programma di modificare, rispondere e controllare la scheda Arduino.
void loop() { digitalWrite(pin, HIGH); // imposta 'pin' ad on delay(1000); // effettua una pausa di 1 secondo digitalWrite(pin, LOW); // imposta 'pin' ad off delay(1000); // effettua una pausa di 1 secondo }
Una funzione è un blocco di codice a cui è attribuito un nome, è da intendersi come un blocco di istruzioni che vengono eseguite quando viene invocata la funzione.
Delle funzioni void setup () e void loop () abbiamo già discusso, parleremo di altre funzioni più avanti.
Le funzioni personalizzate possono essere scritti per eseguire compiti ripetitivi e ridurre confusione in un programma. Quando si dichiara una funzione in primo luogo bisogna dichiarare il tipo della funzione, cioè il tipo di valore restituito dalla funzione, quindi se la funzione è di tipo 'int' (intero), vorrà dire che restituirà un valore intero.
type functionName(parameters)La funzione di tipo intero: delayVal() è utilizzata per fissare un valore di ritardo in un programma che legge un valore da un potenziometro. Per prima cosa dichiariamo una variabile locale v di tipo intero, impostiamo v al valore restituito dalla funzione analogRead(pot), che può restituire un valore compreso tra 0 e 1023, dividiamo il valore ottenuto per 4 per ottenere un valore compreso tra 0 e 255 e infine restituiamo questo valore al programma principale (quello che ha invocato delayVal() ).
{
statements;
}
int delayVal() { int v; // varibile temporanea intera 'v' v = analogRead(pot); // lettura del valore del potenziometro v /= 4; // conversione da 0-1023 a 0-255 return v; // restituisce il valore finale }
Le parentesi graffe (dette anche solamente "parentesi" o "parentesi graffe") definiscono l'inizio e la fine di un blocco funzione e blocchi istruzione così come la funzione void loop() e le istruzioni for e if
type function() { statements; }
Una parentesi graffa aperta deve essere sempre seguita da una parentesi graffa chiusa. Questo è spesso indicato come bilanciamento delle parentesi. Parentesi non bilanciate possono creare diversi problemi al compilatore e talvolta possono essere difficili da rintracciare in un programma molto esteso.
L'ambiente Arduino include una funzione utile per controllare il bilanciamento delle parentesi graffe. E' sufficiente selezionare una parentesi o fare click immediatamente dopo la parentesi affinchè venga evidenziata la parentesi logicamente corrispondente.
Il punto e virgola deve essere usato al termine di un'istruzione e separa gli elementi di un programma. Il punto e virgola è usato per separare elementi in un ciclo for.
int x = 13; // dichiara che la variabile 'x' // è un intero
dimenticare un punto e virgola al termine di una riga produrrà un errore di compilazione. La rilevazione di un punto e virgola mancante non è sempre semplice da rilevare, alcune volte il compilatore potrebbe darvi dei messaggi di errore che possono sembrare illogici, in questo caso la prima cosa da fare è controllare la mancanza di un punto e virgola nei pressi della linea di codice dove il compilatore ha evidenziato l'anomalia.
I blocchi commenti, o commenti multi-linea, sono aree di testo che sono ignorate dal programma e sono usate per una descrizione lunga del codice oppure commenti che aiutano la comprensione di parti del programma. Il bloccco commento incomincia con /* e termina con */ e può occupare più righe.
/* questo è un blocco commento chiuso non dimenticare di chiudere il commento anche i segni di blocco commento sono bilanciati */
poiché i commenti vengono ignorati dal programma, essi non occupano spazio di memoria, quindi è opportuno usarli frequentemente, abbondando il più possibile nello specificare le azioni dei vari blocchi del programma, agendo in questo modo sarà anche più semplice effettuare il debug del programma.
Nota: non è possibile annidare blocchi di commenti, cioè inserire un blocco commento all'interno di un altro blocco commento.
I commenti in singola linea incominciano con // e terminano con la successiva linea di codice. Come per il blocco commento, anche i commenti in singola linea sono ignorati dal programma e non occupano spazio di memoria.
// questo è un commento su una sola lineaI commenti su un'unica linea sono spesso usati dopo un'istruzione per fornire maggiori informazioni sull'azione che compie e per futura memoria.