[RISOLTO] Andare a capo su un display LCD tramite comunicazione seriale

Buonasera a tutti voi.
Ho un problema con un mio sketch riguardante la scrittura di due righe su un display LCD 16*2 gestito dalla libreria <LiquidCrystal.h>

Tramite un programma, da PC invio in seriale una stringa nel formato "Nome\nCognome".
Ingenuamente speravo che il \n il display lo interpretasse come "vai a capo", cosa invece non vera :frowning:

Ora, ho provato in tutti i modi di andare a capo: tramite caratteri speciali da interpretare da lato Arduino, ma niente... o ricevo errori, oppure sul display non compare nulla....

Vi prego aiutatemi, sto brancolando nel buio =(

Grazie!!!
Peppins

Per andare a capo devi piazzare prima il cursore nella seconda riga e poi stampare il testo.
Ciao Uwe

Lato arduino potresti verificare la presenza di "/n" nella stringa ricevuta da seriale (o qualunque altro carattere tu voglia), in caso affermativo esegui un lcd.setCursor(0, 1); che equivale ad andare a capo.

Dai una lettura a questo thread: [RISOLTO]Comunicazione seriale leggere parte della stringa - Software - Arduino Forum

Grazie delle risposte ragazzi! :smiley:

Allora, il metodo setCursor() è inutile se non faccio in modo di cercare il carattere speciale, cosa che non riesco a fare perchè l'oggetto String non è supportato dalle librerie LiquidCrystal.h

Quindi lo sketch:

String nome
while(Serial.available() > 0)
   {
     nome =+ Serial.read();
   }
   lcd.print(nome); //oppure lcd.write(nome)
   delay(2500);
   lcd.clear();
}

o mi da errore in fase di compilazione o non scrive nulla sul display.

Ho provato anche ad acquisire i dati in array di caratteri con il controllo:

char carattere[1];
while(Serial.available() > 0)
   {
   carattere[0] = Serial.read();
   if (carattere[0] == "@") //@ è il mio carattere personalizzato per andare  a capo
         lcd.setCursor(1,0)
   else
         lcd.print(carattere[0]);
   }
   delay(2500);
   lcd.clear();
}

ma niente....

Un singolo carattere incluso fra doppi apici non è un char ma una stringa di char. Quindi il confronto

carattere[0] == "@"

non va bene, per i singoli caratteri devi usare gli apici singoli:

carattere[0] == '@'

Che dire... GRAZIE MILLE!!! XD XD XD

Con il singolo apice funziona perfettamente.
Purtroppo mi hanno sempre detto, professori compresi, che in C non ci fosse differenza tra " e '....

Posto l'estratto funzionante e scrivo [RISOLTO].

char carattere[1];
while(Serial.available() > 0)
    {
      carattere[0] = Serial.read();
      if (carattere[0] == '@')
      {  
        lcd.setCursor(0,1);
      }
      else
      {
        lcd.write(carattere[0]);
      }
    }

Chiudo con una domanda :stuck_out_tongue:
se dovessi dichiarare una variabile all'interno di un ciclo o di un blocco if, la stessa verrebbe disallocata al termine del ciclo o al termine del programma?

Ciao!

La variabile sará valida nella funzione finche non esci, oppure la dichiari static, allora c'é anche alla sucessuva chiamata della funzione.
http://arduino.cc/en/Reference/Static

Ciao Uwe

Se invece la dichiari dentro un normalissimo if nel loop(), ogni volta viene dichiarata e sovrascritta.

Sempre meglio fare tutto fuori, all'inizio dello sketch.
A meno che non stia parlando di funzioni/subroutine, allora vale il discorso di Uwe.

ilPeppins:
Purtroppo mi hanno sempre detto, professori compresi, che in C non ci fosse differenza tra " e '....

Non ci posso credere... :astonished:

se dovessi dichiarare una variabile all'interno di un ciclo o di un blocco if, la stessa verrebbe disallocata al termine del ciclo o al termine del programma?

Parliamo di "blocco di codice".
Qualunque gruppo di righe di codice racchiuso fra le parentesi graffe è un blocco di codice, e la visibilità di una variabile dichiarata dentro uno di questi blocchi è limitata al blocco stesso. La variabile verrà distrutta all'uscita dal blocco.
Ad esempio, nel for la variabile che usi come indice, se la dichiari nel for stesso avrà visibilità solo all'interno del for.

Esempio:

byte i;
byte x = 0;
for (i = 0; i++; i <10) {
  x++;
}
i++;

In questo caso, i è dichiarata fuori dal for e quindi la sua visibilità si estende al blocco superiore, che può essere un altro blocco di codice come uno switch.. case oppure anche il corpo di una funzione.

Invece

byte x = 0;
for (byte i = 0; i++; i <10) {
  x++;
}
i++;

Qui avrai un errore perché i era stata dichiarata nel for e la potevi vedere solo nel blocco del for.

Ancora un caso:

byte i;
byte x = 0;
for (byte i = 0; i++; i <10) {
  x++;
}
i++;

In questo caso la i dichiarata nel for NON è la stessa i dichiarata al suo esterno, la i del for nasconde la visibilità della i dichiarata fuori dal for. Anche se hanno lo stesso nome, sono 2 variabili diverse