Scritte scorrevoli LCD

Ciao a tutti,
sto sviluppando un programma che invia del testo su un display lcd 16x2, utilizzando Arduino. Funziona tutto come dovrebbe ma ho il problema che se ho delle stringhe lunghe, non entrano nello schermo e non sono visualizzabili. Siccome devo far scorrere solo la seconda linea del display, non riesco proprio a capire come devo scrivere la funzione per farlo.
Questo è il codice che ho scritto fin ora:

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup(){
    // righe e colonne LCD 
  lcd.begin(16, 2);
  // inizializzazione seriale
  Serial.begin(9600);
  lcd.setCursor(0,0);
}

void loop(){
    if (Serial.available()) {
    delay(100);
    lcd.clear();
    while (Serial.available() > 0) {
      char car = Serial.read();
      if (car == '@'){
          lcd.setCursor(0,1);
      }
      else{
        lcd.print(car);
      }
    }
  }
  delay(300);
}

Potreste aiutarmi in qualche modo? Grazie mille in anticipo!

puoi creare un ciclo di for che stampa carattere per carattere, fai confronti con millis e fai un clear ogni volta

superlol: puoi creare un ciclo di for che stampa carattere per carattere, fai confronti con millis e fai un clear ogni volta

Grazie per la risposta rapida! ho provato a fare qualcosa con i cicli ma non ho ottenuto buoni risultati... Potresti farmi un rapido esempio? Sono programmatore ma con i microcontrollori non ci ho lavorato moltissimo prima d'ora...

Prova apostare il codice del secondo programma che hai fatto ....

ecco il secondo programma scritto, la struttura sarebbe: La prima riga sempre ferma poi quando trova un carattere @, il cursore si sposta sotto e scrive il testo che dovrebbe scorrere…

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup(){
    // righe e colonne LCD 
  lcd.begin(16, 2);
  // inizializzazione seriale
  Serial.begin(9600);
  lcd.setCursor(0,0);
}

void loop(){
    int c = 0;
    int flag = 0;
    int n = 0;
    char stringa[50];
    if (Serial.available()) {
      delay(100);
      lcd.clear();
      while (Serial.available() > 0) {
        char car = Serial.read();
        if ((car == '@')&&(flag==0)){
            lcd.setCursor(0,1);
            flag = 1;
        }
        else{
          if(flag == 0) lcd.print(car);
          else{
             stringa[c] = car;
             c = c+1;
             for(int i=0; i<c; i++){
                lcd.setCursor(i,1);
                lcd.print(stringa[i]);
             }
          }
        }
      }
    }
  else{
      n = n+1;
      for(int i=n; i<c; i++){
        lcd.setCursor(i,1);
        lcd.print(stringa[i]);
     }
  }
  delay(300);
}

mi stampa la scritta ma non scorre :\

non ho capito bene come fuinzona quel codice e mi pare poco ottimizzato
ma comunque io posso dirti che per scorrere farei una cosa tipo:

char stringa[] = "ciao sto sforando i caratteri dell'lcd";
int larg = 16; //larghezza del display
int inizio = 0;
inf fine = strlen(stinga);

void loop() {
lcd.setCursor(0,1);
lcd.print(stringa);
delay(500); //tempo prima di scorrere, puoi anche fare controlli con millis se vuoi
for(int a = 0; a<=fine; a++) {
for(int i=0; i<=larg; i++) {
lcd.setCursor(i,1);
lcd.print(stringa[i+inizio]);
}
delay(500); // tra uno scorrimento e l'altro
inizio++;
}

}

conta che mi sono svegliato da poco ed è da rivedere ma dovrebba andare…

superlol:
non ho capito bene come fuinzona quel codice e mi pare poco ottimizzato
ma comunque io posso dirti che per scorrere farei una cosa tipo:

char stringa[] = "ciao sto sforando i caratteri dell'lcd";

int larg = 16; //larghezza del display
int inizio = 0;
inf fine = strlen(stinga);

void loop() {
lcd.setCursor(0,1);
lcd.print(stringa);
delay(500); //tempo prima di scorrere, puoi anche fare controlli con millis se vuoi
for(int a = 0; a<=fine; a++) {
for(int i=0; i<=larg; i++) {
lcd.setCursor(i,1);
lcd.print(stringa[i+inizio]);
}
delay(500); // tra uno scorrimento e l’altro
inizio++;
}

}




conta che mi sono svegliato da poco ed è da rivedere ma dovrebba andare...

Grazie per la risposta, il codice l’ho provato e va bene, c’è da rivedere solo qualche contatore che va azzerato.
Ora proverò ad inserirlo nel mio codice, e ti farò sapere!

wow mi stupisco da solo di aver fatto solo qualche piccolo errore visto k sono ancora mezzo addormentato e l'ho steso grossolanamente in 2 minuti :D

Bene, l’ho provato e diciamo che si muove come voglio ma non accetta più i dati dalla seriale e mi rimane sempre memorizzato il vecchio messaggio che però è composto da tutti simboli…
il nuovo codice è questo:

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup(){
    // righe e colonne LCD 
  lcd.begin(16, 2);
  // inizializzazione seriale
  Serial.begin(9600);
  Serial.flush();
  lcd.setCursor(0,0);
}

void loop(){
    int c = 0;
    int flag = 0;
    int n = 0;
    char stringa[50];
    char nick[20];
    if (Serial.available()) {
      Serial.flush();
      c = 0;
      flag = 0;
      n = 0;
      delay(100);
      while (Serial.available() > 0) {
        char car = Serial.read();
        if ((car == '@')&&(flag==0)){
            c = 0;
            flag = 1;
        }
        else{
          if(flag == 0) nick[c] = car;
          else  stringa[c] = car;
          c++;
        }
      }
    }
  else{
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print(nick);
      lcd.setCursor(0,1);
      lcd.print(stringa);
      delay(800); //tempo prima di scorrere, puoi anche fare controlli con millis se vuoi
      for(int a = 0; a<=40; a++) {
        for(int i=0; i<=16; i++) {
        lcd.setCursor(i,1);
        lcd.print(stringa[i+n]);
      }
      delay(500); // tra uno scorrimento e l'altro
      n++;
     }
      delay(500);
  }
  delay(500);
}

il problema sono i delay, conta che anche aspettando 500ms tra un ciclo e l’altro fai 40 cicli * 500ms l’uno sono 20000md che sono 20 secondi… non è per nulla poco… dovresti come ho detto sistemare con millis, break, continue ecc… non sono cose eleganti ma vanno…