INPUT ANALOGICO: DISPLAY ANALOGICO
Costruire il seguente circuito (serve un Display LCD)
PIN | Significato |
![]() |
1 | VSS - GND – Massa | |
2 | Vdd - Vcc: +5v power (4.5 – 5.5 V) | |
3 | V0 - Contrasto | |
4 | RS: Register Select indica il tipo di comando che inviamo | |
5 | R/W indica all’lcd se deve scrivere o leggere – 0 scrivi 1 leggi | |
6 | E: Enabled per abilitare la scrittura nei registri | |
7 | DB0: linea dati 0, non usato | |
8 | DB1: linea dati 1, non usato | |
9 | DB2: linea dati 2, non usato | |
10 | DB3: linea dati 3, non usato | |
11 | DB4: linea dati 4 collegato al pin 4 di Arduino | |
12 | DB5: linea dati 5 collegato al pin 5 di Arduino | |
13 | DB6: linea dati 6 collegato al pin 6 di Arduino | |
14 | DB7: linea dati 7 collegato al pin 7 di Arduino | |
15 | Led+: terminale positivo per la retroilluminazione (Anodo) | |
16 | Led-: terminale negativo per la retroilluminazione (Catodo) |
I Pin 7,8,9 e 10, nel nostro schema, risultano come non collegati. In realtà i display di questo tipo possono essere pilotati sia con 4 che 8 bit (con 4 possiamo risparmiare i pin di Arduino!). La differenza tra una modalità e l’altra consiste nella differente velocità di trasferimento dell’informazione sul display. Non avendo particolari necessità i 4 bit sono sufficienti. Dal Pin 7 al Pin 14 abbiamo quindi le linee dati su cui transitano i dati che si inviano o si ricevono dai registri del display. Un valore HIGH (H) indica scrittura (WRITE) del bit nel registro del display, un valore LOW (L) indica un valore letto (READ) da un registro.
Al pin V0 In genere viene collegato ad un potenziometro o trimmer in configurazione partitore di tensione in modo che possiate applicare sul Pin 3 una tensione che varia da 0 a +5V. Al variare della tensione varia il contrasto.
Gli esempi proposti utilizzano la libreria di sistema "LiquidCrystal". Tale libreria è descritta in modo egregio nella pagina ufficiale presente sul sito (http://arduino.cc/en/Reference/LiquidCrystal). I metodi disponibili della classe LiquidCrystal sono: begin(), clear(), home(), setCursor(), write(), print(), cursor(), noCursor(), blink(), noBlink(), display(), noDisplay(), scrollDisplayLeft(), scrollDisplayRight(), autoscroll(), noAutoscroll(), leftToRight(), rightToLeft(), createChar()
Codice Sorgente A
Obiettivo progetto: Scrivere sul display LCD la scritta "AVE STUDENTS" seguita dal numero di secondi trascorsi dall'accensione di Arduino.
soluzione:
In questo esempio i metodi dell'oggetto LiquidCrystal() utilizzati sono: begin(), clear(), print(), setCursor()
/* ----------------------------------------------------------------------------------- Esempio che mostra l'utilizzo del display LCD senza uso del potenziometro. La libreria LiquidCrystal lavora con tutti i display LCD compatibili con il driver Hitachi HD44780 driver (interfaccia a 16/14 pin) Nel mio circuito i pin dell'LCD sono connessi a quelli di Arduino in questo modo: * Pin R/W dell LCD => pin GND * Pin V0 dell LCD => pin GND * Pin RS dell LCD => pin digitale 2 * Pin E dell LCD => pin digitale 3 * Pin D4 dell LCD => pin digitale 4 * Pin D5 dell LCD => pin digitale 5 * Pin D6 dell LCD => pin digitale 6 * Pin D7 dell LCD => pin digitale 7 -------------------------------------------------------------------------------------- */ #include <LiquidCrystal.h> // Libreria per gestire il Display LCD /* -------------------------------------------------------------- Inizializzo la libreria con il comando LiquidCrystal impostando i contatti secondo il circuito che ho costruito: LiquidCrystal(rs, enable, d4, d5, d6, d7) LiquidCrystal(rs, rw, enable, d4, d5, d6, d7) LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7) LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7) --------------------------------------------------------------- */ LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Ho usato la 1^ sintassi void setup() { // Imposto il nr di colonne e righe del Display lcd.begin(16, 2); lcd.clear(); // Pulisce l'LCD e pone il cursore all'inizio lcd.print("AVE "); // Stampo a video il AVE ... lcd.print("STUDENTS"); // e prosegue sulla stessa riga } void loop() { // ISTRUZIONE: setCursor(col, row) - La numerazione parte da 0 lcd.setCursor(0, 1); // 1° colonna - 2° riga // stampa il numero di secondi trascorsi dal reset di Arduino lcd.print(millis()/1000); }
Codice Sorgente B
Obiettivo progetto: Creare un simbolo a forma di busta chiusa (disposto in verticale) che oscilla da destra a sinistra sul display LCD
soluzione:
In questo esempio i metodi dell'oggetto LiquidCrystal() utilizzati sono: begin(), clear(), scrollDisplayRight(), scrollDisplayLeft(), setCursor(), createChar(), write()
/* ----------------------------------------------------------------------------------- Esempio che mostra l'utilizzo del display LCD senza uso del potenziometro. La libreria LiquidCrystal lavora con tutti i display LCD compatibili con il driver Hitachi HD44780 driver (interfaccia a 16/14 pin) Nel mio circuito i pin dell'LCD sono connessi a quelli di Arduino in questo modo: * Pin R/W dell LCD => pin GND * Pin V0 dell LCD => pin GND * Pin RS dell LCD => pin digitale 2 * Pin E dell LCD => pin digitale 3 * Pin D4 dell LCD => pin digitale 4 * Pin D5 dell LCD => pin digitale 5 * Pin D6 dell LCD => pin digitale 6 * Pin D7 dell LCD => pin digitale 7 -------------------------------------------------------------------------------------- */ #include <LiquidCrystal.h> // Libreria per gestire il Display LCD #define nCOL 15 byte Segno[8] = { B11111, B11001, B10101, B10011, B10101, B11001, B11111, B00000 }; // Array 8x5 bit per la definizione di un singolo carattere /* -------------------------------------------------------------- Inizializzo la libreria con il comando LiquidCrystal impostando i contatti secondo il circuito che ho costruito: LiquidCrystal(rs, enable, d4, d5, d6, d7) LiquidCrystal(rs, rw, enable, d4, d5, d6, d7) LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7) LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7) --------------------------------------------------------------- */ LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Ho usato la 1^ sintassi void setup() { // Creo un carattere personalizzato. Sono gestibili al massimo 8 caratteri personalizzati 8x5 pixels // (numerati da 0 a 7). L'aspetto del carattere è specificato mediante un array di 8 byte (uno per ogni // riga. I primi 5 bit determinano i pixel accesi. Deve stare all'inizio del setup() lcd.createChar(0, Segno); // Creo il carattere che mi sono inventato // Imposto il nr di colonne e righe del Display lcd.begin(16, 2); // lcd.clear(); // Per mostrare il carattere occorre poi usare la funzione // write con in numero abbinato nel createChar(n,Array) - write(byte(n)) lcd.write(byte(0)); } void loop() { int i; // Questo ciclo sposta il testo a destra for (i = 0; i < nCOL; i++) { // Sposta il contenuto del display di una colonna a destra lcd.scrollDisplayRight(); delay(150); // aspetta un attimo } // Questo ciclo sposta il testo a sinistra for (i = 0; i < nCOL; i++) { // Sposta il contenuto del display di una colonna a sinistra lcd.scrollDisplayLeft(); delay(150); // aspetta un attimo } }
Obiettivo progetto: Creare uno programma che sia in grado di leggere il testo digitato sul Serial Monitor e lo mostri sul display LCD. Poichè la linea di invio del serial monitor accetta al massimo 69 caratteri mentre il display utilizzato può mostrare solamente 32 caratteri inserire i necessari controlli che evitino di mostrare la sequenza digitata oltre il trentaduesimo carattere.
soluzione:
In questo esempio i metodi dell'oggetto LiquidCrystal() utilizzati sono: begin(), clear(), cursor(), leftToRight(), blink(), setCursor(), createChar(), write(), home(), print()
// La libreria WIRE.H va aggiunta se ho effettuato l'aggiornamento // della libreria LiquidCrystal alla versione che supporta I2C #include <Wire.h> // Libreria di sistema - E' richiesta da I2CIO.cpp #include <LiquidCrystal.h> // Libreria LCD I2C /* ----------------------------------------------------------------------------------- Esempio che mostra sul display LCD quello che viene digitato sul serial monitor La libreria LiquidCrystal lavora con tutti i display LCD compatibili con il driver Hitachi HD44780 driver (interfaccia a 16/14 pin) Nel mio circuito i pin dell'LCD sono connessi a quelli di Arduino in questo modo: * Pin R/W dell LCD => pin GND * Pin V0 dell LCD => pin GND * Pin RS dell LCD => pin digitale 2 * Pin E dell LCD => pin digitale 3 * Pin D4 dell LCD => pin digitale 4 * Pin D5 dell LCD => pin digitale 5 * Pin D6 dell LCD => pin digitale 6 * Pin D7 dell LCD => pin digitale 7 -------------------------------------------------------------------------------------- */ /* -------------------------------------------------------------- Inizializzo la libreria con il comando LiquidCrystal impostando i contatti secondo il circuito che ho costruito: LiquidCrystal(rs, enable, d4, d5, d6, d7) LiquidCrystal(rs, rw, enable, d4, d5, d6, d7) LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7) LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7) --------------------------------------------------------------- */ LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Ho usato la 1^ sintassi void setup() { Serial.begin(9600); lcd.begin(16, 2); // inizializzo LCD lcd.clear(); // pulisce lo schermo lcd.setCursor(0,0); // Si posiziona sulla prima riga, prima colonna lcd.print("Digita sul S.M."); lcd.setCursor(0,1); lcd.print("del testo ..."); Serial.println("Digita del testo (max 32 char) ..."); } void loop() { char ch; int r=0, c=0; if (Serial.available()) // Se ci sono caratteri sul Serial Monitor { // aspetta un attimo affinchè arrivi l'intero messaggio delay(100); lcd.clear(); // pulisce lo schermo while (Serial.available() > 0) { if (r!=2) { lcd.setCursor(c++,r); lcd.write(Serial.read()); if (c==16) {c=0; r++;} } else Serial.read(); // butto via i caratteri in + } } }
Si osservi, nonostante la tipologia del circuito utilizzata sia completamente diversa, l'estrema somiglianza di questo programma con quello proposto nell'esempio (analogo come funzionalità richieste) al codice sorgente A proposto per LCD con bus I2C.