Lezione 4

By lapinig,

  Filed under: Programmazione Arduino
  Comments: None

La “scoperta dell’acqua calda”

In questa quarta lezione passiamo ad usare metodi volti a NON “dover riscoprire sempre l’acqua calda”…

Scrivendo un codice, dopo averlo collaudato e verificato il corretto funzionamento, eliminandone tutti i possibili errori o problemi, non conviene mai doverlo riscrivere sempre ad ogni nuovo programma.

Questo non vuol dire semplicemente che dobbiamo usare il “copia ed incolla” che, peraltro, è utilissimo. Vuole invece dire che occorre scrivere il codice in maniera da poterlo riutilizzare anche in altri programmi con poche o nessuna modifica. Partiremo in questa lezione con un programma già scritto nella lezione precedente, vedremo che la parte che ci interessa per la gestione del display è la medesima, mentre la parte che gestisce la pressione dei pulsanti (con anti-rimbalzo) è corretta ma andrà riscritta per gestire un numero maggiore di pulsanti senza raddoppiare il numero di righe di codice necessarie.

Esercitazione 9: Uso di strutture e funzioni

Con la piattaforma TinkerCad realizziamo questo circuito

Partendo dalla base di un altro esercizio già svolto nella Lezione 3, si deve realizzare un timer con conteggio alla rovescia e quattro pulsanti: due per la impostazione del tempo di durata, un pulsante di start ed un pulsante di stop/reset.

L’uscita comanda da Arduino potrebbe essere un timer per esposizione fotografica, un timer per accensione forno per cottura, ecc. ecc.

Organizziamo però meglio il lavoro rispetto all’esercizio di partenza: mentre in esso vi erano variabili con nomi diversi per gestire la pressione dei pulsanti con controllo anti-rimbalzo adesso, raddoppiando i pulsanti, non conviene più utilizzare questo metodo.

Occorre “riutilizzare” lo stesso codice per TUTTI i pulsanti, anche per quelli che verranno eventualmente aggiunti in futuro. Senz’altro creiamo una funzione che gestisca la pressione del pulsante (stato attuale, stato precedente, tempo dell’ultima variazione, ecc.). Per poter fare questo occorre prima generare una “struttura” ad-hoc.

// Struttura che raggruppa alcune variabili per la
// gestione dell’oggetto PULSANTE
typedef struct
{
int Porta;
bool newLettura;
bool oldLettura;
unsigned long long TimeUltimaVariazione;
// Stato STABILE del pulsante
bool StatoAttuale;
bool StatoPrecedente;
} _PULS_STRUCTURE;

Praticamente con l’istruzione typedef struct creiamo un “nuovo” tipo di variabile che in realtà è un gruppo di variabili. Dal nome possiamo riconoscere più o meno quelle utilizzare nella Lezione 3.

Di seguito con la riga

_PULS_STRUCTURE Pulsante[NUM_PULSANTI];

dove NUM_PULSANTI nel nostro caso vale 4, avvisiamo il compilatore che esiste un gruppo di 4 variabili (o array) di nome Pulsante organizzate con la nuova struttura creata di nome _PULS_STRUCTURE.

Per utilizzare le variabili contenute in questa struttura utilizzeremo comandi di questo tipo: Pulsante[3].newLettura = digitalRead(..….

Dove la variabile newLettura contenuta nel gruppo Pulsante all’indice 3, verrà scritta con il contenuto dell’ingresso letto sul piedino di Arduino indicato. Attenzione al fatto che l’indice 3 indica la quarta (ed ultima in questo caso) variabile Pulsante ovvero quella che si riferisce all’ultimo pulsante sulla destra.

L’uso di queste variabili indicizzate (o array) è molto utile e ci permette di creare una sola funzione che esegue i comandi da noi forniti per tutti gli indici, anche se fossero centinaia e centinaia…

Il codice completo del programma che abbiamo visto nel corso della lezione del 21 giugno scorso lo potete trovare qui.

Riepilogo dei contenuti della lezione:

  1. Abbiamo creato una struttura (typedef struct) per raggruppare più variabili riconducibili ad un gruppo che a sua volta può essere indicizzato. Nello scrivere il codice non dobbiamo “risparmiare” sul numero delle variabili che, spesso, sono centinaia od anche migliaia, ma sui loro nomi, in questo modo risparmieremo con la scrittura del codice, specialmente se usiamo variabili indicizzate (o array), potendo scrivere codice riutilizzabile.
  2. Abbiamo creato una funzione “riutilizzabile”, cioè con la stessa funzione, passandogli parametri diversi possiamo gestire, nel nostro esempio, più pulsanti.