Con l’introduzione degli input/output analogici, abbiamo quasi concluso la trattazione degli argomenti di base della programmazione con Arduino. Alla fine di questo episodio infatti dovreste avere delle ottime basi per cominciare a lavorare su componenti e sensori un po’ più avanzati, ma al tempo stesso più utili ed interessanti.
In particolare oggi vedremo le variabili char e String per poi realizzare un programma che vada a leggere ed interpretare una stringa tramite monitor seriale: in questo caso la comunicazione tra Arduino e il computer sarà bilaterale.

char
Il tipo char (character) va usato per dichiarare variabili che contengano un singolo carattere alfanumerico, quindi lettere, numeri e simboli. I valori che si assegnano ad una variabile di tipo char devono essere inclusi tra due apici; ecco un esempio di inizializzazione:

char carattere=’a’

Con questa istruzione dichiariamo la variabile “carattere” come tipo char e le assegniamo la lettera ‘a’.
In realtà il linguaggio dell’IDE Arduino rappresenta i caratteri mediante il famosissimo codice ASCII (American Standard Code for Information Interchange) che fa corrispondere ad ogni carattere un numero intero compreso tra 0 e 127. Ciò significa che quello che per noi ad esempio è il carattere ‘1’, in realtà sarà rappresentato con il corrispondente valore della tabella ASCII, che non è 1. 
Per avere prova di ciò e fissare il concetto possiamo scrivere un programma che, data una variabile di tipo char, stampi il corrispondente valore intero.

Ecco il codice:

Attenzione !
intero=carattere ⇒ Questa istruzione assegna il contenuto della variabile carattere, che è di tipo char, alla variabile intero che è di tipo int: in questo modo il tipo char viene convertito in int.

Ecco il risultato: 

""""

Potete verificare il risultato ottenuto consultando la tabella ASCII.

""""

Curiosità:  Lo standard ASCII è stato pubblicato dall'American National Standards Institute (ANSI) nel 1968 e da allora è divenuto così importante che addirittura vi fu dedicato un asteroide, il “3568 ASCII”.

 

String

Il tipo String (stringa) va usato per dichiarare variabili che contengano sequenze di caratteri, cioè parole. Le parole che si assegnano ad una variabile di tipo String devono essere incluse tra doppie virgolette; ecco un esempio di inizializzazione:

String stringa=”overVolt”


È bene ricordare che abbiamo anche la possibilità di comporre delle stringhe mediante l’operatore “+”. Ad esempio:

void setup() {
    String stringa=”C”;
    stringa += ‘i’;
    stringa += ‘a’;
    stringa += ‘o’;
    Serial.begin(9600);
    Serial.print(stringa);
}

Questo programma restituisce in output la parola “Ciao”. 

Fino ad ora, riguardo alla comunicazione seriale, abbiamo visto solo il caso in cui è Arduino ad inviare delle informazioni al computer.
I tipi char e String che abbiamo appena introdotto invece risultano particolarmente utili nell’ambito della comunicazione seriale bidirezionale in cui Arduino non solo invia in output delle informazioni al computer, ma è in grado anche di riceverne in input (mediante il monitor seriale). Come spiegato nell’articolo #6, in questa modalità di comunicazione le informazioni vengono scambiate sequenzialmente, una alla volta; ciò significa che se Arduino invia una stringa al nostro computer, in realtà questo riceverà un solo carattere alla volta, e sarà il monitor stesso a ricomporli, in ordine, per risalire all’informazione originaria. 
Nella situazione inversa, cioè quando il computer invia una stringa ad Arduino, il processo di ricomposizione delle informazioni non è automatico, ma va eseguito da codice. 

Attenzione!
Per inviare un carattere o una sequenza di caratteri ad Arduino, bisogna utilizzare l’apposita textbox presente nel monitor seriale:

""""

SOFTWARE

Scriviamo ora un programma che faccia accendere e spegnere il led integrato nella scheda Arduino tramite comando seriale (“accendi” - “spegni”). Per fare ciò Arduino deve prima leggere i singoli caratteri ottenuti in input, poi deve comporli in una stringa ed infine interpretarli, cioè confrontarli con i comandi “accendi” e “spegni”.
Ovviamente potremmo evitare il problema usando come comandi dei singoli caratteri, ad esempio “a” per accendere e “s” per spegnere, ma questa sarebbe una forte limitazione per i progetti un po’ più avanzati. 

Per la gestione dei comandi utilizzeremo due variabili:

  • char c ⇒ conterrà i singoli caratteri del comando digitato nel monitor seriale
  • String comando⇒ è la variabile in cui metteremo tutti i caratteri uno alla volta per poi comporre la stringa

Attenzione! Il seguente paragrafo contiene la spiegazione dettagliata e lo sviluppo logico del programma. Alla fine dell'articolo troverete il codice completo.

L’istruzione necessaria per comunicare ad Arduino di leggere i dati che arrivano dal buffer seriale è Serial.read(), però noi vogliamo che Arduino legga il contenuto del buffer solo quando esso contiene delle informazioni; per fare ciò utilizziamo il controllo
if(Serial.available()) ⇒ la condizione sarà vera solo se nel buffer ci sono effettivamente informazioni da leggere.

Adesso possiamo seguire il seguente ragionamento:
Se nel buffer sono presenti dei caratteri, allora aggiungili singolarmente nella variabile comando finchè non si arriva alla fine della stringa”.

Arduino però ha bisogno di un riferimento per capire quando effettivamente la stringa inserita in input dall’utente finisce: questo riferimento è il carattere speciale (detto escape) ‘\n’, che significa “new line” e va scritto tra apici singoli. 
A questo punto possiamo utilizzare un ciclo do… while che continua a leggere i caratteri presenti nel buffer finchè non trova uno ‘\n’.

do {
    c = Serial.read;
    stringa += c;

} while(c != ‘\n’)

Ora vi starete chiedendo come fare ad aggiungere uno ‘\n’ dopo aver scritto una parola. Beh, ci penserà il monitor seriale!
Nella barra inferiore della finestra c’è un menu a tendina che consente di specificare un carattere di fine riga:


""""

In questo modo, quando l’utente schiaccia il tasto “Invio”, automaticamente verrà aggiunto il carattere ‘\n’ alla stringa.

La porzione di codice che consente ad Arduino di leggere il comando di input, quindi è la seguente:

char c;
String comando;

void setup() {
    Serial.begin(9600);
}

void loop() {
    if(Serial.available()) {
        stringa=””;
        do {
            c = Serial.read;
            stringa += c;
        } while(c != ‘\n’);
        Serial.print(comando);
    }
}


Per capire se Arduino sta interpretando correttamente i dati di input, ci facciamo stampare il contenuto della variabile “comando” con la solita istruzione Serial.print():

""""

Come potete vedere dalla gif, il risultato è ancora anomalo: per correggere il difetto basta semplicemente ricordare ad Arduino che deve procedere con la lettura di ogni singolo carattere solo se nel buffer c’è qualcosa da leggere. Inseriamo quindi nel do… while un controllo if(Serial.available()), in questo modo:

char c;
String comando;

void setup() {
    Serial.begin(9600);
}

void loop() {
    if(Serial.available()) {
        stringa=””;
        do {
            if(Serial.available()) {
                c = Serial.read;
                stringa += c;
             }
         } while(c != ‘\n’);
        Serial.print(comando);
    }
}

 

Perfetto! Adesso Arduino è in grado di lavorare correttamente sulle stringhe che riceve dal monitor seriale, quindi, ricordando che il led integrato è collegato al pin numero 13,  possiamo completare il nostro programma. 

Ecco il CODICE COMPLETO: