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

  • Questo sito ed i suoi contenuti è fornito "così com'è" e Mauro Alfieri non rilascia alcuna dichiarazione o garanzia di alcun tipo, esplicita o implicita, riguardo alla completezza, accuratezza, affidabilità, idoneità o disponibilità del sito o delle informazioni, prodotti, servizi o grafiche correlate contenute sul sito per qualsiasi scopo.
  • Ti chiedo di leggere e rispettare il regolamento del sito prima di utilizzarlo
  • Ti chiedo di leggere i Termini e Condizioni d'uso del sito prima di utilizzarlo
  • In qualità di Affiliato Amazon io ricevo un guadagno dagli acquisti idonei qualora siano presenti link al suddetto sito.

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

29 commenti

Vai al modulo dei commenti

    • jcamma il 20 Dicembre 2012 alle 13:31
    • Rispondi

    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. 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

    • jcamma il 20 Dicembre 2012 alle 13:38
    • Rispondi

    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)

    🙂

  1. E se si volesse fare il contrario?

    Trasformare un array di caratteri in una stringa?

    😉

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

      Mauro

    • Massimo il 28 Ottobre 2013 alle 14:02
    • Rispondi

    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. 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

    • Pizz il 13 Agosto 2014 alle 10:27
    • Rispondi

    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. 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.

    • Enrico il 6 Ottobre 2015 alle 22:58
    • Rispondi

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

    Grazie

    1. Ciao Enrico,
      potresti spiegarmi meglio cosa intendi fare?

    • Francesco il 27 Dicembre 2016 alle 19:25
    • Rispondi

    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. 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.

    • louis il 6 Marzo 2017 alle 16:29
    • Rispondi

    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. 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.

    • Sergio il 21 Settembre 2017 alle 22:36
    • Rispondi

    Ciao Mauro, sto cercando di usare un modulo sim800l collegato con arduino, ma trovo difficoltà a trattare la stringa che estraggo dall’sms con un ciclo if per riconoscere il testo del commando:
    If (text!=””){
    If(text==”led on”) {
    digitalWrite(PIN_LED, HIGH);
    delay(1000);
    digitalWrite(PIN_LED, LOW);
    }
    }

    Ho riportato solo la parte che non funziona, evidentemente mi sfugge qualcosa nella gestione delle stringhe.
    Grazie per il tuo aiuto.

    1. Ciao Sergio,
      le stringhe sono complesse da gestire con Arduino, conviene usare le funzioni C per farlo, sono più comode.
      Inoltre devi essere certo che “text” sia una String e non altro tipo ( es.: char )

    • Maurizio il 8 Gennaio 2018 alle 09:38
    • Rispondi

    Ciao Mauro.
    Mi sto imbattendo in un problema e volevo chiederti una consulenza.
    Ho un array char a cui durante lo sketch vorrei aggiungere una variabile numerica, per poi trattare tutto cone se fosse un char da visualizzare su una riga del display.
    Come mi consigli di muovermi??
    Per esempio:
    char mych[3]={“pippo”,”pluto”,”paperino”}
    int dati[3]={20,30,40}
    ad un cero punto voglio che diventi pippo 20,pluto 30,paperino 40 per poi mandarli in visulaizzazione sul display
    lcd.setCursor(0,0);
    lcd.print(mych[0]);
    lcd.setCursor(0,1);
    lcd.print(mych[1]);
    lcd.setCursor(0,2);
    lcd.print(mych[2]);
    lcd.setCursor(0,3);
    lcd.print(mych[3]);

    Grazie per l’aiuto

    1. Ciao Maurizio,
      le righe che indichi sono contrarie a quello che scrivi.
      Non riesco a comprendere cosa tu voglia ottenere, pippo 20 deve essere su una sola riga? pluto 30 appare sulla riga sotto ?

        • Maurizio il 8 Gennaio 2018 alle 16:07
        • Rispondi

        Si esatto, sono su tre righe diverse; scusa ho scritto male, le righe sono tre e non quattro.
        Quello che volevo dirti è che prima nelle tre righe scrivo pippo,pluto,paperino poi dopo aver modificato le variabili faccio scrivere pippo 20,pluto 30,paperino 40.
        Pensavo di fare così:
        trasformare l’array char in string, la variabile int in string sommare le due string e trasformarla in char array per poi mandarla al display…
        Che ne pensi??

        1. Ciao Maurizio,
          mi sembra complesso ma un buon esercizio di conversione.
          Io semplicemente lavorerei con le posizioni del cursore per posizionare i valori 20,30,40 nelle posizioni desiderate.

            • Maurizio il 9 Gennaio 2018 alle 16:29

            Ho provato così:
            char* mych[3]={“pippo”,”pluto”,”paperino”}
            int dati[3]={20,30,40}

            String str_1=mych[i];
            String str_2=dati[i];
            String str_3=str_1+str_2;
            ….
            così per le tre variabili, poi manca la parte di conversione in char….
            Ma già così non funziona, mi da errore…
            Quello che dici tu è corretto, ma essendo che devo visualizzare il tutto su un display con due righe, devo scorrere verso l’alto per far vedere anche la terza voce, quindi non posso lasciare fisso il valore….
            Insomma una volta variata la variabile, dovrebbe seguire il nome….
            Spero di esseremi fatto capire…
            Grazie.

          1. Ciao Maurizio,
            forse adesso ho compreso, usa la funzione sprinf per comporre la linea come mostro in molti articoli dedicati ai display, crei 3 buffer e scrivi solo quelli sul monitor.

    • francesco il 24 Marzo 2018 alle 20:27
    • Rispondi

    ciao Mauro e complimenti per tutto il tuo lavoro sempre impeccabile . sto facendo un progetto “inverso ” di lettura tramite emoncms .riesco a leggere il feed tramite la modifica del web-client ma sono bloccato. leggo il valore un carattere per volta e quindi devo crearmi una stringa che contenga il feed e poi convertirlo ( es da “1256” a 1256) ma tutti le prove mi portano ad errori ( da int a chat) o a scritture incomprensibili della stringa. mi puoi dare qualche dritta?
    Grazie mille

    1. Ciao Francesco,
      tu devi convertire una stringa in intero, come scrivi nella prima parte del commento, o da un intero ad una stringa, come scrivi nella seconda parte ?

    • Giovanni il 7 Dicembre 2018 alle 11:03
    • Rispondi

    Ciao. Leggo solo oggi il tuo tutorial online, spero venga ancora seguito.
    Intanto rispondo a @Pizz, nel caso non abbia ancora risolto:
    C, a differenza dei linguaggi alti, non fa differenza tra un carattere e il suo ascii.
    Dipende da te come leggerlo E dal display.
    lcd.print(String(65)); è uguale a lcd.print(‘A”);

    ‘A’ + 4 =69 (o “D”). La differenza c’èe solo nella visualizzazione che decidi tu, se decidi tu.
    ‘a’ e 65 sono la stessa cosa , in C.

    Vorrei approffittarne per fare una domanda a Mauro:

    Perché non riesco a visualizzare su monitor seriale questo?

    […]
    char miochararray []=”abcd”;

    Serial.print(mioarray);
    […]
    ???
    Voglio printare tutto il char array, senza ricorsione, senza for.
    Mi da errore di ambiguità. Eppure se non ricordo male In C si indica il nome della variabile
    chararray e “couta” tutti gli elementi dell’array visualizza sul serial monitor tutto senza ricorso a for, while, etc.

    1. Ciao Giovanni,
      grazie per il contributo a Pizz, è sempre bello quando ci si scambia informazioni tra appassionati della medesima materia.
      Premetto che il linguaggio Arduino non è un C puro e quindi alcune sintassi che il C accetta non sono riproducibili.
      Hai provato a fare il cast a String?

    • Massimiliano il 28 Aprile 2020 alle 20:39
    • Rispondi

    Buonasera Mauro
    Volevo chiederti una info, se potessi aiutarmi sarebbe fantastico.
    ho realizzato il tuo progetto per l’irrigazione con RTC diversi anni fa…
    Progetto fantastico…
    adesso vorrei ho installato sullo stesso progetto un modulo wifi per la gestione da remoto.
    mi sarebbe venuto in mente anche di aggiornare l’orario quando voglio interrogando il Cloud che mi risponde con una stringa del genere:

    $CLOUD:TIME:1588098552794 2020-04-28 20:29:12 UTC+2
    // questa stringa mi arriva tramite altra seriale dal modulo WIFI

    quindi la vado a leggere come segue:

    if (Msg.substring(0, 12) == “$CLOUD:TIME:”)
    {
    Serial.println(Msg.substring(37, 45)); // scrive orario correttamente 20:29:12
    // adesso vorrei salvare l’ora come unica stringa per poi successivamente aggiornare RTC

    ora = Msg.substring(37, 45); // qs metodo non funziona non capisco dove sbaglio.

    che ne dici ?
    ti ringrazio anticipatamente
    Massimiliano

    1. Ciao Massimiliano,
      come hai dichiarato la variabile ora?
      Che errore ti restituisce?

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.