«

»

Set 21

Stampa Articolo

Tutorial Arduino e le stringhe

In questi giorni ho provato a lavorare con le stringhe e Arduino, scoprendo che non è immediato programmare utilizzando le stringhe.
Sto sviluppando uno sketch con librerie esterne e mi trovo a dover affettare una stringa e passarla ad un metodo che accetta solo valori di tipo char.

IDE Arduino 0019

Oggi è certamente più semplice di qualche mese fa, questa semplificazione è arrivara con la versione 0019 dell’IDE Arduino.
Il motivo di tale semplificazione è che da questa versione la classe String è diventata una delle librerie core.
L’amico e appassionato Gioblu ha tradotto la guida ufficiale in questo articolo.

Non mi sovrappongo al bellissimo lavoro fatto da Gioblu che ho avuto modo di conoscere all’Arduino Camp 2011 e di cui apprezzo tutto il lavoro di tutorial e guide pubblicate, ma voglio aggiungere la mia personale esperienza all’uso di questa libreria con un esempio che ho impiegato qualche giorno a realizzare:

//          012345678901
String cmd="STRINGA TEST"
char val[5];
String mystr=cmd.substring(8,11);
mystr.toCharArray(val,5);
Serial.println(val);

Nell’esempio ho voluto riportare come convertire una sringa in una variabile di tipo char, lo scopo di questo esempio è poter utilizzare due dei metodi della chasse String di Arduino per estrarre una sotto stringa della stessa, la conversione in una variabile di tipo char l’ho introdotta sia mostrare un possibile utilizzo del secondo metodo toCharArray sia perchè nel codice in cui ho dovuto eseguire questa operazione sono coinvolte delle librerie che accettano come tipo di variabili solo quelle di tipo char.

Nella prima riga ho riportato u commento con dei numeri, lo utilizzo come indice per contare i caratteri della stringa sottostante; infatti la libreria String parte sempre dall’indice 0, in questo modo posso facilmente dire che la parola TEST inizia alla posizione 8 e termina alla posizione 11. Fatta questa scoperta posso utilizzare il metodo substring come alla riga 4, nella variabile di tipo String mystr sarà contenuto il valore TEST, tuttavia questo non è sufficente perchè nel mio sketch questo valore dovrebbe essere di tipo char per cui converto mystr in val utilizzando la funzione toCharArray.

Il risultato scritto nel monitor seriale sarà TEST, di tipo char che posso quindi utilizzare nella libreria esterna con cui sto scrivendo il mio sketch.

Buon lavoro

Permalink link a questo articolo: http://www.mauroalfieri.it/informatica/tutorial-arduino-e-le-stringhe.html

15 comments

Vai al modulo dei commenti

  1. jcamma

    Ciao Mauro

    Chiaro e ben esposto come sempre! Il metodo substring funziona alla grande ma oggi dopo ore di prove
    ho scoperto che il simulatore 0,98A non “vede” il metodo ToCharArray!!( mi da errore anche con gli esempi dell’IDE!). Alla fine sono arrivato a questo utilizzando substring e length…funziona ma non so se è una soluzione “stupidina”

    void setup ()
    {
    Serial.begin(9600);
    }
    void loop ()
    {
    StringToChar ();
    while(true);
    }
    void StringToChar()
    {
    String stringa = “A me piace Arduino”;
    String mystr = stringa.substring(10,18);
    Serial.println ( “La tua String e’—>” + mystr);
    int p = mystr.length();
    char array[p];
    for (int f=0; f “);
    Serial.println (array);
    }

    Ciao!

    1. Mauro Alfieri

      Ciao,
      ho letto i tuoi contributi e ti ringrazio.
      Tuttavia devo chiederti di specificare quale simulatore tu stia utilizzando, non tutti sono uguali.
      Inoltre il codice da simulatore potrebbe presentare errori dovuti all’interpretazione di un simulatore, io evito di scrivere con i simulatori e preferisco realizzare con componenti reali, questa è anche la filosofia con cui nasce Arduino e con cui il Team capitanato da Massimi Banzi continua a sviluppare nuovi firmware.

      Mauro

  2. jcamma

    errata corrige.. for con “f” fino a “p” e per ogni ciclio array di “f”=mystr di “f” ( per capire..se no si vedono i mostri)

    🙂

  3. Roc

    E se si volesse fare il contrario?

    Trasformare un array di caratteri in una stringa?

    😉

    1. Mauro Alfieri

      Ciao Roc,
      mi sembra di aver scritto un articolo anche su questo argomento 🙂

      Mauro

  4. Massimo

    Ciao Mauro, credo di essere molto simile ad un computer che, come ha detto un tuo professore, conosce solo due numeri: 0 ed 1. Io, per ciò che riguarda la programmazione, conosco solo i primi 8 capitoli del tuo “Percorso Base (per principianti)”. In questo nuovo capitolo è come se avessi fatto un salto nel buio, non tanto per i nuovi termini “String”, “Array”, “char” che, con un po’ di iniziativa ci si può istruire su internet, quanto per il fatto che non ho trovato una continuità con i precedenti capitoli e mi sono sentito smarrito con i nuovi argomenti. Tra le tante cose che hai trattato al di fuori del corso, c’è per caso anche qualcosa che possa fare da trait d’union con quanto fino ad ora affrontato?
    Grazie anche per l’indicazione dei corsi a Roma.
    Massimo

    1. Mauro Alfieri

      Ciao Massimo,
      Ogni tanto lungo il percorso di apprendimento é necessario affrontare uno scalino, questo é valido per molti percorsi formativi.
      La strada sempre in salita ma lineare limita l’apprendimento.

      Questo é uno di quei punti nel mio corso arduino.

      Le definizioni di String,Array,Char le trovi su internet cercandole su wikipedia e come si usano o cosa possono contenere le trovi nella Reference Guide presente sul sito Arduino.

      Mauro

  5. Pizz

    Ciao Mauro…intanto complimenti per l’ottimo lavoro con i tutorial di arduino.
    Vorrei sottoporti un problema che non riesco a risolvere riguardo la comunicazione di arduino via intenret.
    Il mio progetto è realizzare un sistema costituito da un server in Labview che invia delle stringhe a un client Arduino che leggendole sa come comportarsi. Per ora vorrei solo inviare dei comandi del tipo “led1ON” ma non riesco a ottenere dalla funzione client.read la stringa di partenza. Inoltre non so come fare per estrarre dalla stringa (quella che non riesco a ottenere dal client.read) il comando che mi serve ad esempio poniamo che debba comandare 3 led e da labview invio una stringa cosi:” led1ON/led2ON/led3OFF” come faccio per ottenere la stessa stringa e non i singoli caratteri uno alla volta? e da questa scritta come faccio a “estrapolare” i singoli comandi (tipo “led1ON”)?

    Grazie mille dell aiuto e ancora complimenti

    1. Mauro Alfieri

      Ciao Pizz,
      penso sia opportuno che tu legga meglio come funziona la comunicazione internet dal sito ufficiale arduino.cc
      Essa è di tipo seriale per cui puoi generare un buffer leggendo i valori che ti arriveranno sempre uno alla volta.
      Poi sulla stringa composta puoi fare i tuoi ragionamenti in base alla stringa inviata e quella ricevuta.

      Un consiglio generale, se lavori con le stinghe cerca di mantenere i messaggi costanti, ti agevola nell’analisi dei dati ricevuti; ad esempio invece di led1ON/led2ON/led3OFF prova con /led1A/led2A/led3S dove A sta per acceso e S per spento, la lingua non è importante ma in questo modo avrai 2 vantaggi:

      1. la stringa è costante a 4 caratteri di cui i primi 3 individuano il led e l’ultimo lo stato;
      2. il byte di stato ( A o S ) è sempre uno.

  6. Enrico

    Io non ho trovato come fare a paasare da valore ascii a carattere

    Grazie

    1. Mauro Alfieri

      Ciao Enrico,
      potresti spiegarmi meglio cosa intendi fare?

  7. Francesco

    Ciao… ho costruito un propeller clock… come faccio integrando il bluetooth a inviare delle stringhe mentre gira visualizzando cosi il nuovo messaggio ogni volta che lo invio ? Non è facile cavolo ! Grazie…

    1. Mauro Alfieri

      Ciao Francesco,
      interessante, vuoi pubblicarlo come tuo progetto sul blog?
      Sulla parte Bluetooth dipende dal tipo di connessione che hai scelto, solitamente sono stringhe seriali.

  8. louis

    Ciao Mauro, sto seguendo con molto interesse le tue guide su arduino. In questo particolare capitolo ho cliccato sul link del tuo amico Gioblu inerente la traduzione in italiano della classe Sting ed ho ricevuto la seguente segnalazione dal mio antivirus:
    Bitdefender ha bloccato questa pagina
    Questa pagina è stata bloccata dal filtro antimalware di Bitdefender.
    Prima di annullare la protezione, saresti in grado di dirmi che si tratta semplicemente di un falso positivo?
    Grazie
    Louis

    1. Mauro Alfieri

      Ciao Louis,
      puoi chiedere all’autore del sito, purtroppo io a parte il link non ho modo di eseguire alcun controllo.
      All’epoca in cui ho predisposto il link non restituiva tale errore.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Puoi usare i seguenti tag ed attributi HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>