Sul mercato si possono trovare diverse varianti con più o meno righe, caratteri e soprattutto pià o meno euro. Possiamo dire che l'LCD 16x2 è un buon compromesso utilità/prezzo.
Come dicevo l'unica vera limitazione, forse viziati da questi megaschermi hd high resolution (mio padre probabilmente negli anni 80 non la pensava allo stesso modo), è il limitato numero di linee, SOLO 2!!!!!!!
Siccome 2 linee mi stavano strette ho pensato di creare un piccolo skatch che mi potesse dare un infinito numero di linee.
partiamo dai componenti:
- 1x LCD 16x2 (va benissimo qualsiasi lcd con standard Hitachi HD44780, io ho utilizzato l'LCD-00255 di sparkfun)
- 1x trimpot 10k
- 2x ButtonSwitch
- 2x Resistenze 10KΩ
- 1x Resistenza 220Ω
- 1x Arduino (ovviamente, io ho utilizzato Leonardo)
- un po di cavetteria
Per poter gestire in modo semplice il componente ho utilizzato la libreria di arduino LiquidCrystal, è molto semplice da usare, dopo aver fatto i primi due esempi chiunque è in grado di sviluppare qualcosa di più concreto (come nel mio caso).
Anche la progettazione del circuito è una piccola variante rispetto a quella che si trova nelle pagine di tutorial di LiquidCrystal, anzi se vogliamo essere sinceri, è quella di LiquidCrystal con due bottoni in più -_-'
Di seguito il circuito:
Come si può notare dall'immagine il circuto è uguale a quello presente sul sito di ardunino, l'unica differenza sono gli switch collegati ai pin 8 e 9 i quali verranno utilizzati per intercettare i bottoni e spostare le linee dell'LCD su e giu.
L'implementazione:
in tutto ho sviluppato 6 metodi
- begin(int lineNumber)
utilizzato per dichiarare e inizializzare il numero di linee che verranno visualizzate
- setLine(int lNumber, String txt)
prende in ingresso il numero di linea dove inserire il testo, e il testo
- showLine(int line)
prende in ingresso la linea da visualizzare sull'lcd, line è da considerasi il puntatore alla linea che verrà messa sulla riga 1
- showLine()
questo metodo non fa altro che richiamare il metodo showLine(int line) con la riga attuale, è utile per effettuare dei refresh nel caso si voglia modificare una linea e visualizzare il suo contentuo
- goUp()
questo metodo incrementa di uno il puntatore che indica le linee da visualizzare
- goDown()
questo metodo decrementa di uno il puntatore che indica le linee da visualizzare
Un po di codice:
innanzi tutto le variabili
//test vars
String txt1 = "this is 1st line";
String txt2 = "this is 2nd line";
String txt3 = "this is 3rd line";
String txt4 = "this is 4th line";
//PINS
int RS = 12;
int RW = 11;
int D4 = 5;
int D5 = 4;
int D6 = 3;
int D7 = 2;
int pinBtnUp = 9;
int pinBtnDown = 8;
//Internal variables
LiquidCrystal _lcd;
int _lineNumber;
String * _lines;
int _firstLineToShow;
txt1-4 sono le righe utilizzate per eseguire un sempice test (di 4 righe)
I pin da RS a D7 sono per comandare l'lcd
Mentre pinBtnUp e pinBtnDown sono rispettivamente per spostare la riga verso l'altro e verso il basso
_lcd è il puntatore alla libreria LiquidCrystal utilizzato per fare le operazioni sull'lcd
_lineNumber è il numero di linee che si stanno utilizzando (nel nostro caso 4)
_lines è l'array di testi che verrà visualizzato
_firstLineToShow è il "puntatore" al numero di linea che verrà visualizzato (sulla linea 1)
void begin(int lineNumber) {
_lineNumber = lineNumber;
_lines = new String[_lineNumber];
for (int i = 0; i < _linenumber; i++) {
_lines[i] = "";
}
}
Per inizializzare la gestione delle linee ho creato un metodo chiamato begin il quale prende in ingresso il numero massimo di linee che si vogliono visualizzare, lo salva nella variabile _lineNumber, crea l'array e lo inizializza con stringhe vuote
void setLine(int lNumber, String txt) {
if (lNumber >= 0 && lNumber < _lineNumber) {
_lines[lNumber] = txt;
}
}
Per settare le righe ho creato il metodo setLine. La variabile di ingresso lNumber dopo un piccolo check sull'overflow (deve essere compreso tra 0 e il numero massimo di linee settato nel metodo begin), viene utilizzato come indice dell'array _line dove viene settata la stringa txt.
void showLine(int line) {
_firstLineToShow = line;
String l1 = "";
String l2 = "";
_lcd.clear();
if (_firstLineToShow >= 0 && _firstLineToShow < _lineNumber) {
l1 = _lines[_firstLineToShow];
}
if ((_firstLineToShow + 1) >= 0 && (_firstLineToShow + 1) < _lineNumber) {
l2 = _lines[(_firstLineToShow + 1)];
}
_lcd.setCursor(0, 0);
_lcd.print(l1);
_lcd.setCursor(0, 1);
_lcd.print(l2);
}
showLine è il metodo principale di tutto il programma, è leggermento più complicato rispetto a tutti gli altri. In ingresso riceve il numero di linea dovrà essere posta come prima linea sull'lcd, la prima istruzione che viene eseguita è il set della variabile globale _firstLineToShow che terrà traccia dell'ultima linea da visualizzare richiesta; successivamente vengono create (e inizializzate) due variabili l1 e l2 che verranno successivamente settate con le righe richieste ed infine visualizzate._lcd.clear() serve per dare una pulita allo schermo. ATTENZIONE! la variabile _lcd prima di essere utilizzata deve essere istanziata, per maggior chiarezza sto presentado prima i metodi funzionali core del programma.
Per recuperare il testo della riga da visualizzare _lines[_firstLineToShow] faccio un controllo della variabile indice, che ovviamente deve essere maggiore di 0 e non deve superare il numero massimo di linee dichiarate precedentemente. Come accennato qualche riga sopra il valore di _lines[_firstLineToShow] viene messo nella variabile l1.
Lo stesso discorso vale per la seconda linea che ovviamente avrà come indice (_firstLineToShow + 1).
Se i controlli non soddisfano i requisiti l1 e l2 manterranno il valore di inizializzazione: stringa vuota.
Le ultime righe servono per stampare sull'lcd le righe calcolate, con il comando _lcd.setCursor(0, 0) sposto il cursore sulla prima colonna e prima riga (valore 0, 0) e con l'istruzione _lcd.print(l1) stampo il testo.
Le stesse operazione vengono fatte sulla secondo linea settando il cursore sulla prima colonna e seconda riga.
void goUp() {
if (_firstLineToShow + 1 < _lineNumber) {
_firstLineToShow++;
}
}
void goDown() {
if (_firstLineToShow > 0) {
_firstLineToShow--;
}
}
Ora del due funzioni goUp e goDown non fanno altro che incrementare o decrementare _firstLineToShow.ed infine i metodi standard Arduino:
void setup() {
_lcd = new LiquidCrystal(RS, RW, D4, D5, D6, D7);
_lcd.begin(16, 2);
_firstLineToShow = 0;
pinMode(pinBtnUp, INPUT);
pinMode(pinBtnDown, INPUT);
begin(4);
setLine(0, txt1);
setLine(1, txt2);
setLine(2, txt3);
setLine(3, txt4);
showLine();
}
Nel metodo setup viene istanziato LiquidCrysyal e inizializzato (16 il numero di catteri per linea e 2 il numero di linee), viene inizializzata _firstLineToShow a 0 in modo da incominciare a visualizzare la prima riga e vengono settati i pin (INPUT) per i bottoni. Le istruzioni successive servono per inizializzare la parte che gestirà il controller delle linee: si setta il numero di linee che si intende visualizzare, vengono settate le linee con stringhe (dalla posizione 0 alla 3) e successivamente si da un primo comando di visualizzazione linee (che visualizzerà la linea 1).
void loop() {
if (digitalRead(pinBtnUp) == HIGH) {
goDown();
showLine();
delay(300);
}
if (digitalRead(pinBtnDown) == HIGH) {
goUp();
showLine();
delay(300);
}
}
il metodo loop risulta molto semplice, se uno dei due bottoni viene premuto, si richiameranno le funzioni che spostano di una liena il puntatore delle linee e con showLine si effettua un refresh delle linee da visualizzare. Infine per evitare che il singolo push di un bottone venga percepito più di una volta, ho aggiunto un delay di 300 millisecondi.Qui il codice completo dello skatch
#include "LiquidCrystal.h"
//test vars
String txt1 = "this is 1st line";
String txt2 = "this is 2nd line";
String txt3 = "this is 3rd line";
String txt4 = "this is 4th line";
//PINS
int RS = 12;
int RW = 11;
int D4 = 5;
int D5 = 4;
int D6 = 3;
int D7 = 2;
int pinBtnUp = 9;
int pinBtnDown = 8;
//Internal variables
LiquidCrystal _lcd;
int _lineNumber;
String * _lines;
int _firstLineToShow;
void setup() {
_lcd = new LiquidCrystal(RS, RW, D4, D5, D6, D7);
_lcd.begin(16, 2);
_firstLineToShow = 0;
pinMode(pinBtnUp, INPUT);
pinMode(pinBtnDown, INPUT);
begin(4);
setLine(0, txt1);
setLine(1, txt2);
setLine(2, txt3);
setLine(3, txt4);
showLine();
}
void loop() {
if (digitalRead(pinBtnUp) == HIGH) {
goDown();
showLine();
delay(300);
}
if (digitalRead(pinBtnDown) == HIGH) {
goUp();
showLine();
delay(300);
}
}
// MULTILINE FUNCTIONS
void begin(int lineNumber) {
_lineNumber = lineNumber;
_lines = new String[_lineNumber];
for (int i = 0; i < _linenumber; i++) {
_lines[i] = "";
}
}
void setLine(int lNumber, String txt) {
if (lNumber < _lineNumber) {
_lines[lNumber] = txt;
}
}
void showLine() {
showLine(_firstLineToShow);
}
void showLine(int line) {
_firstLineToShow = line;
String l1 = "";
String l2 = "";
_lcd.clear();
if (_firstLineToShow >= 0 && _firstLineToShow < _lineNumber) {
l1 = _lines[_firstLineToShow];
}
if ((_firstLineToShow + 1) >= 0 && (_firstLineToShow + 1) < _lineNumber) {
l2 = _lines[(_firstLineToShow + 1)];
}
_lcd.setCursor(0, 0);
_lcd.print(l1);
_lcd.setCursor(0, 1);
_lcd.print(l2);
}
void goUp() {
if (_firstLineToShow + 1 < _lineNumber) {
_firstLineToShow++;
}
}
void goDown() {
if (_firstLineToShow > 0) {
_firstLineToShow--;
}
}
Ecco il video:
Nessun commento:
Posta un commento