Tutorial: Arduino scritte scorrevoli su Lcd

Propongo di realizzare delle scritte scorrevoli con Arduino ed un display LCD, sfruttando la liberia LiquidCrystal.h e due suoi metodi puoi far scorrere il testo a destra e sinistra dul display Lcd.

Lcd 4x20 HD44780

Puoi collegare il display ad Arduino come mostrato in questo articolo e ruota il cursore del potenziomentro fino a vedere i caratteri sullo schermo.

Partendo dal tutorial pubblicato sul sito ufficiale ti mostrerò una variante che rende il codice più adattabile a diversi display.

Far scorrere del testo su un display Lcd è molto semplice se utilizzi i metodi scrollDisplayLeft() e scrollDisplayRight()  a tua disposizione con la libreria LiquidCrystal.h, per completezza riporto il codice originale dell’esempio mostrato sul sito ufficiale:

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("hello, world!");
  delay(1000);
}

void loop() {
  // scroll 13 positions (string length) to the left
  // to move it offscreen left:
  for (int positionCounter = 0; positionCounter < 13; positionCounter++) {
    // scroll one position left:
    lcd.scrollDisplayLeft();
    // wait a bit:
    delay(150);
  }

  // scroll 29 positions (string length + display length) to the right
  // to move it offscreen right:
  for (int positionCounter = 0; positionCounter < 29; positionCounter++) {
    // scroll one position right:
    lcd.scrollDisplayRight();
    // wait a bit:
    delay(150);
  }
 
    // scroll 16 positions (display length + string length) to the left
    // to move it back to center:
  for (int positionCounter = 0; positionCounter < 16; positionCounter++) {
    // scroll one position left:
    lcd.scrollDisplayLeft();
    // wait a bit:
    delay(150);
  }
 
  // delay at the end of the full loop:
  delay(1000);

}

Questo codice sposta la scritta “hello world!” prima verso sinistra fino alla sua scomparsa, successivamente la sposta verso destra fino alla scomparsa e nuovamente fa ricomparire la scritta spostando il testo verso sinistra, leggendo il codice vedrai che ad ogni fase di spostamento del testo l’effetto ottenuto è inverso, ossia utilizzando il metodo scrollDisplayLeft() ciò che scolla è il display verso sinistra e quindi il testo sembra si sposti verso destra.

Il codice che ti propongo è molto più semplice, innanzitutto separa il codice di ciascun spostamento per analizzarlo singolarmente:

// include the library code:
#include <LiquidCrystal.h>

String textMsg="hello, world!";
int display_cols = 16;
int display_rows = 2;
int strLength = textMsg.length();

// initialize the library with the numbers 
// of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
 // set up the LCD's number of columns and rows:
 lcd.begin(cols, rows);
 // Print a message to the LCD.
 lcd.print(textMsg);
 delay(1000);
}

void loop() {
  // scroll string length positions to the left
  for (int pCounter = 0; pCounter < strLength; pCounter++) {
    // scroll one position left:
    lcd.scrollDisplayLeft();
    // wait a bit:
    delay(150);
  }

  // delay at the end of the full loop:
  delay(1000);

}

Vediamo linea per linea lo sketch mostrato:

linea 02: includi la libreria LiquidCrystal.h necessaria a scrivere sul display e far scorrere il testo mostrato;
linea 04: definisci una stringa di testo, utilizza un variabile di tipo string per poterne misurare la lunghezza in modo automatico, vedrai in seguito il motivo di questa scelta;
linea 05: definisci una variabile di tipo intero che indica il numero di colonne del display, es.: 16;
linea 06: definisci una variabile di tipo intero che indichi il numero di linee del display, es.: 2/4/ecc…;
linea 07: misuriamo la lunghezza della stringa definita alla linea 04, utilizzando il metodo lenght() della Classe String;
linea 11: definisci un oggetto di tipo lcd passandogli i pin necessari al funzionamento del display LCD;
linee 13-19: definisci la funzione setup(), in cui inizializza il display (linea 15) passandogli come colonne e righe quelle definite nelle variabili presenti alle linee 05 e 06 e successivamente scrivi la stringa sul display (linea 17), attendendo un tempo di 1 sec (1000 millisecondi) per lasciare al display il tempo di eseguire il comando indicato;
linea 21: definisci la funzione di loop(), eseguita ciclicamente da Arduino;
linea 23: costruisci un ciclo for da 0 fino alla lunghezza della stringa misurata con il metodo lenght() alla linea 07;
linea 25: ad ogni incremento della variabile pCounter sposta il display verso sinistra di una posizione, in questo modo al termine del ciclo il display sarà stato spostato di un numero di caratteri pari alla lunghezza della stringa, con conseguente scomparsa della stringa stessa dal display;
linea 27: attendi un tempo di 150 millisecondi per ciascun incremento del ciclo for per consentire al display di eseguire lo spostamento;
linea 31: attendi un tempo di 1 sec tra un passaggio del ciclo di loop ed il successivo;

L’effetto della scritta sul display sarà quello di vedere la scritta scorrere verso sinistra e magicamente ricomparire dopo 1 secondo per scorrere novamente verso sinistra ripetendo il ciclo all’infinito.

Scritto in questo modo questo sketch ha il solo valore di esempio didattico della funzione di Scroll offerta dalla LiquidCrystal, nei prossimi articoli proverò a scrivere degli esempi più interessanti anche nel loro utilizzo pratico in qualche progettino.

Buon divertimento

Cortesemente, prima di inserire i commenti leggi il regolamento

Permanent link to this article: http://www.mauroalfieri.it/elettronica/tutorial-arduino-scritte-scorrevoli-su-lcd.html

25 comments

Skip to comment form

    • marco on 5 gennaio 2013 at 06:19
    • Reply

    ciao,

    mi sono appena avvicinato al mondo arduino, sono un radioamatore e ho intenzione di andare a fondo di questo mondo magnifico.

    sono anche perito informatico (classe 70) allora questi oggetti stavano nella mente di qualche visionario e basta.

    mi piacerebbe provare a capire qsa di piu’… ad esempio se invece di “hello world” volessi prendere dei dati dal web, come posso farlo?

    del tipo… premo un pulsante e sul display mi vengono visualizzati i dati del dx cluster per radioamatori, aggiornati ogni volta che premo il tasto?

    qualche info in piu’: il dxcluster e’ un sito dove tutti i radiamatori possono postare in real time stazioni (magari difficili o distanti) che collegano, dando la frequenza su cui altri si possono sintonizzare per collegare la stessa stazione, molti sw usano il cluster con telnet ma non ho proprio idea come trasferire l’info ad arduino per poi vederla sul disply…

    Mi sai aiutare? grazie, ciao Marco.

    1. Ciao Marco,
      interesante progetto quello di reperire dei dati dal Web e visualizzarli su un display LCd con Arduino.
      Nel blog trovi tantissimi articoli dedicati ad Arduino e da perito informatico sono certo che non avrai difficoltà con il software.

      Per quanto riguarda la struttura del progetto io proverei ad utilizzare una ethernet shield in modalità client per collegarmi al sito che dici e prendere il dato e poi elaborare la risposta per separare la parte dati dai tag html e altri ammennicoli inutili al tuo progetto; a questo punto non hai che da scriverli sul display.

      Mauro

    • Andrea on 3 giugno 2013 at 08:03
    • Reply

    Ciao Mauro,
    ti faccio una domanda la cui risposta forse è già presente nel tuo sito ma non la trovo:
    Posso cambiare l’indirizzo dei pin dove collegare il display?
    Questo perchè ho una 2560 dove stò sviluppando un progetto ed ho quei pin già occupati.
    Ti ringrazio in anticipo per la risposta.
    Andrea.

    1. Ciao Andrea,
      si puoi, ricordati di cambiarli nella riga 5 dello sketch.

      Mauro

        • Andrea on 5 giugno 2013 at 12:16
        • Reply

        Grazie mille!
        Andrea.

  1. Ciao,credo che nella riga sottolineata,vengano chiamate delle variabili,mai dichiarate.(cols,rows)

    void setup() {
    // set up the LCD’s number of columns and rows:
    lcd.begin(cols, rows);
    ——————————

    Le variabili in merito dichiarate sono :

    String textMsg=”hello, world!”;
    int display_cols = 16;
    int display_rows = 2;
    int strLength = textMsg.length();

    La riga quindici andrebbe corretta da questa

    15 lcd.begin(cols, rows);

    a questa

    15 lcd.begin(display_cols,display_ rows);

    chiamando le variabili dichiarate nella rispettive righe 5, 6.

    😉 Kevinone.

    1. Grazie Kevinone,
      non mi ero accorto dell’errore di copia e incolla 🙂
      Lo correggerò.

      Mauro

    • ion on 15 ottobre 2013 at 15:49
    • Reply

    Ciao Mauro volevo chiederti se e possibile realizzare con Arduino più scritte scorrevoli che cambiano ogni 5 minuti per la durata di 60 minuti cosi da avere 12 messaggi diversi da visualizzare?

    1. Ciao Ion,
      certo è possibile, puoi preparare un array di stringhe in cui ciascuna stringa è una frase da far scorrere ed ogni 3600000 millisecondi farla cambiare, anche se io utilizzerei una RTC shield per calcolare l’ora 🙂

      Mauro

    • Gianni on 26 gennaio 2014 at 18:25
    • Reply

    Ciao Mauro volevo chiederti un grosso piacere anche se è la prima volta che ti scrivo… Sono da poco entrato a conoscenza della scheda Arduino…sto creando qualcuno che possa darmi una mano nel programmare il mio progettino…gioco da un po’ ad Softair e per rendere intrigante le giocate volevo dare un pizzico di brio creando una bomba ad orologeria con tastierino a codici..potresti aiutarmi??..sto impazzendo con i vari video su youtube ma nn riesco a trovare niente…grazie.
    Gianni

    1. Ciao Gianni,
      progettino davvero interessante 🙂
      Io mi dirigerei verso il mio kit datalogger con display LCD così da aver il 90% del materiale già pronto. Mancherebbe la parte che simula l’esplosione, pensavi a luci e suono?

      Potresti adattare lo sketch della regolazione orario scritto per un altro progetto e ti mancherebbero solo due parti:

      – impostazione dell’ora di scatto
      – conteggio alla rovescia a partire dall’ora corrente ( giusto per renderla più reale)

      Potersi usare la scheda SD per memorizzare tutti le impostazioni in caso di reset così che se per qualche motivo si resetta arduino alla partenza riparte il conteggio, un po’ come nei film 🙂

      Certo mancherebbero tante altre cose come il circuito anti manomissione ecc.. Ma si tratta pur sempre di un prodotto ludico 🙂

      Mauro

    • Francesco on 17 agosto 2014 at 15:01
    • Reply

    ciao Mauro,
    grazie per il tutorial, ora la scritta scorrevole funziona anche a me!! 🙂
    volevo chiederti un paio di info
    1. è possibile far scorrere un solo rigo e lasciare fisso l’altro?
    2. è possibile visualizzare una frase scorrendo verso il basso? cioè la prima riga contiene una parte che segue nella seconda riga e via via che scorre le righe salgono

    grazie 1000 per il supporto e complimenti per il sito!!
    Francesco

    1. Ciao Francesco,
      lo scroll orizzontale è possibile con i metodi illustrati della classe LCD.
      Lo scroll verticale puoi realizzarlo con dei cicli di scrittura su linee definendo linea per linea cosa visualizzare.

        • Francesco on 19 agosto 2014 at 08:00
        • Reply

        grazie Mauro! ci provo 😉

    • ALESSANDRO on 6 febbraio 2015 at 20:45
    • Reply

    ciao Mauro,
    io vorrei scrivere sul display due scritte( tengo premuto un bottone scrive PREMUTO , rilascio il bottone scrive LIBERO) mi puoi aiutare??
    grazie

    1. Ciao Alessandro,
      posso aiutarti con tutti i miei articoli sul blog, sono centinaia e puoi leggerne e copiare quanti ne vuoi.
      Ogni articolo o sketch è commentato linea per linea per aiutarti a capire cosa faccio.
      Se li segui,leggi e comprendi vedrai che riuscirai a realizzare il tuo progetto.

    • Nicola on 16 agosto 2015 at 10:40
    • Reply

    Ciao Mauro,
    ho un dubbio.
    C’è una lunghezza massima dei caratteri visualizzabili in una riga dell’LCD?
    Perchè per quanto vada a incrementare “manualmente” il valore di srtLenght nella stringa ” if(i<=strLength) ", dopo 38 caratteri di va a capo e continua nella riga sottostante.
    Hai idea di quale possa essere il problema?

    PS: Ti avevo già accennato al mancato ricevimento della newsletter; ho provato ad iscrivermi con un nuovo account gmail, ma anche su quello non ricevo nulla.

    1. Ciao Nicola,
      puoi verificare se esista un limite nella libreria LCD, effettivamente il valore 38 è alquanto strano, che tipo di display stai utilizzando ?

      P.S:. la newsletter non viene inviata sempre, ma solo in occasione di informazioni importanti che non pubblico sul blog, per gli articoli regolari la cosa migliore è consultare il blog.

      • Nicola on 21 agosto 2015 at 21:51
      • Reply

      uso un “normale” 16 x 2

      1. Ciao Nicola,
        purtroppo non ho idea su cosa causi questo comportamento anomalo, prova ad eseguire qualche test con testi e parametri differenti per determinare se si tratti di un limite della libreria o del tuo display.

    • robi on 9 marzo 2016 at 22:29
    • Reply

    Ciao Mauro utilizzo un lcd 4 x20 con la funzione scrollDisplayLeeft ,come il testo esce dalla prima riga mi va a scrivere sulla terza e la terza passa nella prima non ti dico quante prove di codice ho fatto ma senza risultato

    grazie robi

    1. Ciao Robi,
      il comportamento è legato al funzionamento del driver: HD44780, se leggi le specifiche, scopri che è in grado di gestire 2 linee x 40 caratteri che nel tuo caso diventano 4 righe 20 caratteri in cui il 21° carattere della prima linea è nel tuo caso il primo carattere della 3a riga.
      Probabilmente la libreria gestisce male lo scrollDisplayLeft, prova a cercarne una che lo gestisca meglio.

    • robi on 11 marzo 2016 at 18:21
    • Reply

    grazie, Mauro e buon fine settimana

    • Michele on 4 settembre 2018 at 21:01
    • Reply

    Buonasera Mauro,
    io ho un display 20×4 I2C, mi sono creato un codice il quale fa apparire la prima casella a sx nera e ogni 200ms ne aggiunge una, alla fine poi vado nel mio loop. Tale codice èmolto lungo in quanto ogni 200ms vado a scrivere sul mio lcd il carattere alla x riga e x colonna. Non si può “snellire” con un ciclo for? Il risultato deve essere come le barre di caricamento che da sinistra riempie la riga fino a destra.
    Grazie

    1. Ciao Michele,
      se le operazioni sono ripetitive puoi usare un ciclo for, anche se io consiglio sempre di usare il ciclo principale, il loop(), come prima scelta.

Lascia un commento

Your email address will not be published.

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