Leggere e interpretare una stringa da seriale PROBLEMA

Salve,
mi sono da poco approcciato ad arduino seguendo qualche video tutorial di un noto canale su YouTube. In una delle lezioni, il ragazzo spiega come leggere ed interpretare una stringa da seriale in particolare riesce a comporre una stringa tramite l’inserimento da seriale di alcuni caratteri e andandola a confrontare con alcune parole, ad esempio if(stringa==“accendi”){ digitalWrite(13,HIGH); quindi far accendere il led 13 se avessimo digitato da seriale accendi.
Il problema sta nel fatto che andando a riscrivere il suo codice:

String stringa="";
char c;

void setup() {
  Serial.begin(9600);
  pinMode(13,OUTPUT);
}

void loop() {
  if(Serial.available()){
    do{
      if(Serial.available()){
        c=Serial.read();
        stringa+=c;
      }
    }while(c!='\n');
    if(stringa == "accendi")
    digitalWrite(13,HIGH);    
  }
}

Nel video effettivamente funziona, ma se vado a riproporlo non mi funziona. Come mai? Ho commesso qualche errore?

Buongiorno,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione tutto il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, fino a quando non sarà fatta la presentazione, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:

Salve, mi scuso per non essermi presentato, ho inviato la presentazione al thread da te linkato :slight_smile:

Ma tu spedisci il fine stringa \n ??

No, ma seleziono dal monitor seriale a Capo (nl) tramite l'apposito pulsante in basso

Beh intanto sto programmino di una decina di righe ha una serie di cose che NON si dovrebbero fare, ad iniziare all'uso delle variabili "String" (magari posta il link a sto video così capiamo cosa sta dicendo...).

Per capire meglio ciò che fai, prova sempre a commentare le singole istruzioni del loop:

 // Se è presente almeno un carattere sulla seriale.
  if(Serial.available()){
    // Entro in un ciclo
    do{
      // Se è presente almeno un carattere
      if(Serial.available()){
        // Leggo il carattere e lo accumulo nel buffer
        c=Serial.read();
        stringa+=c;
      }
      // Esco dal ciclo se l'ultimo carattere ricevuto è un line feed
    }while(c!='\n');
    // Se ho ricevuto esattamente "accendi" accendo il LED
    if(stringa == "accendi")
      digitalWrite(13,HIGH);
  }

Qui già forse puoi iniziare a capire, ma non voglio darti la "pappa pronta", devi iniziare a capire da solo cosa fare quando un programma non ti funziona come atteso.
Dovresti cercare di capire cosa fa o vede il programma, scrivendo sulla seriale "qualcosa", ed in base a cosa leggi puoi quindi iniziare a capire meglio.

Quindi ad esempio:

 // Se è presente almeno un carattere sulla seriale.
  if(Serial.available()){
    // Entro in un ciclo
    do{
      // Se è presente almeno un carattere
      if(Serial.available()){
        // Leggo il carattere e lo accumulo nel buffer
        c=Serial.read();
        stringa+=c;
        // PER DEBUG: mostro il codice esadecimale di cosa ho ricevuto
        Serial.print(c, HEX);
        Serial.print(" ");
      }
      // Esco dal ciclo se l'ultimo carattere ricevuto è un line feed
    }while(c!='\n');
    // PER DEBUG: scrivo la stringa totale ricevuta
    Serial.println();
    Serial.print("Ho quindi ricevuto: \"");
    Serial.print(stringa);
    Serial.println("\"");
    // Se ho ricevuto esattamente "accendi" accendo il LED
    if(stringa == "accendi")
      digitalWrite(13,HIGH);
  }

Ora prova questo codice (l'ho scritto al volo, verifica comunque tu se è tutto corretto), e poi vedi cosa ti scrive sul monitor seriale. Ed in base a questo se qualcosa ti si accende, o in caso negativo posta qui l'esatto output così andiamo avanti.

E posta quel link che sono curioso di vedere chi è che consiglia ste cose.

Innanzitutto ti ringrazio di aver risposto al mio topic docdoc, non capisco comunque cosa intendi con la frase "sto programmino di una decina di righe ha una serie di cose che NON si dovrebbero fare"; le variabili string rappresentano dei tipi di dati quasi "elementari" non capisco perchè non si dovrebbero usare (anche inizialmente). Per quanto riguarda i commenti, non lo ho fatto poichè non lo ho ritenuto necessario in quanto sapevo già cosa facevano le varie strutture e comandi, grazie comunque per averlo fatto tu :). Ho testato il tuo codice cioè il mio con l'aggiunta della stampa a video della stringa (+ HEX) il risultato è sempre lo stesso. Ti linko il video così magari puoi capire meglio: VIDEO

Carmine_S1:
le variabili string rappresentano dei tipi di dati quasi “elementari” non capisco perchè non si dovrebbero usare (anche inizialmente).

Te lo spiego subito …

NON sei su un PC dove c’è un sistema operativo ed un “garbage collector”, sei su una piccola MCU con solo 2KBytes di SRAM, dove devi fare tutto tu e dove usare la classe “String”, a causa dell’allocazione e riallocazione dinamica della memoria, porta quasi sempre … a grossi problemi e sicuri mal di testa !!! :smiling_imp:

Impara invece ad usare le stringhe classiche del C … ovvero semplici array di char terminati dal carattere null (0x00) e le funzioni che trovi nella libreria standard (… che, oltretutto, è automaticamente inclusa dal IDE) AVR libc ed, in particolare, quanto è in <string.h>.

Guglielmo

Carmine_S1:
le variabili string rappresentano dei tipi di dati quasi "elementari" non capisco perchè non si dovrebbero usare

Non sono dati "elementari" perché la "String" (con la "S" maiuscola) è una classe di oggetti che, come ti ha scritto anche Guglielmo, in questo tipo di sistemi molto piccoli e con poca RAM la continua allocazione e deallocazione dello spazio in RAM porta alla saturazione dello spazio perché non esiste il "garbage collector" (se sai programmare spero tu sappia cosa sia un Garbage Collector...).
Ma per ora non ho approfondito questa cosa perché non necessaria, ignorala, puoi anche usare le String in programmini come questo (ma è necessario, se vuoi continuare a programmare in Arduino, che tu abbandoni le String in favore delle "stringhe C", di cui ti parleremo se vorrai DOPO che avrai risolto questa cosa).

Ho testato il tuo codice cioè il mio con l'aggiunta della stampa a video della stringa (+ HEX) il risultato è sempre lo stesso.

E certo, grazie che è lo stesso, se la logica è la stessa ma solo con l'aggiunta dell'output su seriale, cosa pensavi? Te l'ho scritto, se non leggi quello che scrivo o non cerchi di capirlo è un problema.

Ti ho scritto che ho aggiunto quelle righe per farti vedere cosa fa il programma, e cercare di farti arrivare a capire da solo cosa fare quando un programma non ti funziona come atteso ossia aggiungere delle Serial.print() di debug perché non essendoci nell'IDE Adruino strumenti per fare debug con breakpoint, questo è il metodo principale per farlo.

Ed infatti ti ho anche detto di provare quel codice con le Serial.print e poi vedere cosa ti scrive sul monitor seriale. E di postare qui l'esatto output. Se invece ti limiti a dire che fa "la stessa cosa" e NON posti l'output della seriale, non serve cercare di aiutarti ma vuoi forse la "pappa pronta" e ti dico che non è così che funziona qui. E' necessario impegnarsi un minimo per leggere ciò che ti si scrive e provare a seguire le indicazioni ed i consigli.

Per cui ora fallo, per favore, posta l'output così riprendiamo il discorso.