Realizzare il seguente circuito collegando il filamento lungo (positivo) del Led alla porta digitale 4 (che funge da polo positivo se attivata)
Leggere riga per riga il seguente codice, copiarlo ed incollalo sull'IDE di Arduino, e quindi caricalo su Arduino, seguendo la procedura spiegata nel tutorial precedente.
Se non si sono commessi errori, il Led dovrebbe accendersi e spegnersi con un intervallo di tempo di 1 secondo. Adesso provare, una per volta, le seguenti modifiche al codice ed al circuito:
Variare l'intervallo di tempo (dentro il delay);
In digitalWrite (4, ......); sostituire 1 al posto di HIGH e 0 al posto di LOW, notando che il funzionamento rimane invariato;
Variare la porta digitale (puoi usare quelle digitali da 2 a 13) - se si utilizza la porta 13 si noterà che si accenderà anche un led integrato nella scheda di Arduino. Questo led integrato nella scheda, collegato al PIN 13 è molto comodo per verificare alcuni sketch senza dover creare un circuito elettronico;
Creare un nuovo programma riscrivendo le istruzioni (senza copiarle) per sforzarsi di ricordare la loro sistassi;
Inserire più led, con le rispettive resistenze, e collegarli a più porte digitali facendoli lampeggiare da Arduino con le opportune righe di programmazione.
Utilizziamo adesso una variabile, ossia una parte di memoria a cui attribuiamo un nome a piacere e nella quale possiamo memorizzare dei contenuti numerici o dei caratteri. Le variabili vanno dichiarate possibilmente all'inizio del programma.
int luceled;
equivale a riservare una parte di memoria della scheda Arduino, assegnarle il nome luceled ed infine destinarla a contenere solo numeri interi compresi tra -32768 a +32768 ( 2 byte di memoria corrispondenti a 16 bit e quindi 2^16 = 65536 combinazioni possibili di sequenze di 0 ed 1 - destinate 32768 a numeri negativi ed altrettanti a numeri positivi).
all'interno del ciclo void loop
inseriremo dunque:
luceled = 0;
digitalWrite (4, luceled);
delay (1000);
luceled = 1;
digitalWrite (4, luceled);
delay (1000);
ottenendo, come nel primo sketch, l'accensione e lo spegnimento del led ogni secondo.
Osservando le sei istruzioni, si noteranno tre istruzioni ripetersi due volte praticamente identiche tranne che per i valori 0 e 1 attribuiti a luceled.
E' possibile variare luceled attraverso le seguenti operazioni matematiche che poi trasformemo in istruzioni:
luceled = 0
luceled = -luceled + 1 (ossia -0+1=1 quindi luceled contiene adesso il valore 1)
luceled = -luceled +1 (ossia -1 + 1 = 0 quindi luceled contiene adesso il valore 0)
e quindi ogni volta che Arduino esegue l'istruzione
luceled = luceled*(-1) + 1;
in luceled si alterna il valore 0 ed 1.
come accade in queste istruzioni:
Lo sketch appena eseguito appare decisamente più snello ed elegante di quello iniziale, anche se è ulteriormente migliorabile. Riservare una parte della memoria destinandola a contenere valori compresi tra -32768 a +32768 per inserirci solo i valori 0 ed 1 è uno ovvio spreco di memoria. Al posto della variabile di tipo intero (int luceled;) , possiamo usare una variabile di tipo booleana (bool luceled;) che consente di memorizzare solo due valori logici TRUE (1) e FALSE (0). utilizzando quindi meno memoria della variabile intera (1 byte).
Verificare quindi che tutto funzioni correttamente sostituendo bool luceled = 0; ad int luceled = 0;
Utilizzando le variabili booleane è possibile utilizzare un altro operatore matematico (logico) che consente di negare il valore della variabile.
Questa istruzione:
luceled = !luceled;
inserisce in luceled il valore negato (!) di luceled e quindi se in luceled c'è 1, ovvero il valore FALSO, pone in luceled la negazione di FALSO e quindi VERO (1) e viceversa.
Il risultato finale è quindi il seguente sketch:
che appare decisamente più elegante e snello di quelli scritti in precedenza.
Questo esempio mostra l'opportunità di non accontentarsi del primo sketch in grado di soddisfare il nostro progetto, ma di renderlo il più snello ed elegante possibile. Ciò si tradurrà in un minor uso dell'esigua memoria interna ad Arduino (32256 byte) ed una maggiore velocità di esecuzione delle istruzioni.
Analogo ragionamento dovrà essere fatto con la parte circuitale, che determinerà un più ridotto numero di componenti, di cavi di collegamento (possibilmente di lunghezza adeguata) e quindi una maggior leggibilità del circuito con conseguente risparmio energetico. In caso contrario, con jumper che si annodano tra loro prima di passare da un componente ad un altro si parlerà di "spaghetti wires".
ULTIMA OSSERVAZIONE: In questo progetto si possono usare anche le porte digitali (PIN) 0 ed 1 solo che, essendo normalmente usate per comunicazioni di tipo seriale, inviare e ricevere dati (TX e RX), quando si carica il codice questi due pin (in realtà solo il PIN zero) devono essere scollegati e ricollegati a caricamento completato. Ciò è necessario perché queste due porte possono essere utilizzate anche per programmare la scheda Arduino da un altro microncontrollore o da un'interfaccia bluetooth e quindi, quando la porta zero riceve dei segnali contemporaneamente ai dati che riceve dalla porta USB del PC, Arduino segnala un errore dovuto al fatto che riceve dati da più ingressi.