«

»

Dic 17

Corso Arduino – Lezione 5 – LCD su Arduino

La gestione di un LCD è una cosa molto più semplice di quanto si possa pensare. Io ho usato un modello retroilluminato blu da 16 caratteri e 2 righe. La gestione avviene tramite 16 pin di cui però 4 non li useremo. Lo schema dell’LCD in mio possesso è molto semplice

1° Pin: GND o VSS

2° Pin: VDD o la 5V di Arduino

3° Pin: V0 o gestione del contrasto, che gestiremo con un trimmer da 10kohm

4° Pin: RS, verrà connesso a un’altro pin di Arduino

5° Pin: RW può essere connesso a massa

6° Pin: E connesso a un altro pin di Arduino

7°,8°,9°,10° Pin: non connessi

11°,12°,13°,14° Pin: connessi a pin in sequenza di Arduino (più per semplicità di gestione nel codice che per un motivo specifico)

15° Pin: gestione della luminosità collegato a un pin analogico o direttamente alla 5 Volt (5 Volt luminosità massima)

16° Pin: connesso a massa (sempre per la luminosità)

Ho dovuto saldare una strip band da 16pin sul display per inserirla nella breadboard.

Fritzing

Potete evincere quanto detto prima dalla schermata Fritzing qui sotto. Come potete notare ho lasciato connessi anche il sensore e il pulsantino! E il codice è strutturato per sfruttare anche questi.

Stazione_meteo_con_pulsantino_e_energy_saving

 

Codice

Il codice è semplice, rimangono le stringhe di gestione del sensore, ma eliminiamo tutti i serial del monitor seriale perché useremo il display questa volta! Questa volta useremo anche la libreria LiquidCrystal per gestire il display e dovremo instanziare un oggetto LiquidCrystal lcd e passare come parametri in sequenza il numero di pin Arduino al quale abbiamo connesso i pin dell LCD (Rs,E,DB4,DB5,DB6,DB7). Ecco il perchè conveniva collegarli in modo sequenziale, è molto più semplice scrivere 4,5,6,7,8,9 invece di dover cercare il numero di ogni pin 😉

L’LCD va inizializzato con lcd.begin(numeroCaratteri, numeroRighe) nel metodo setup! Lo ripuliremo con clear(). Il pin di alimentazione dell’LCD verrà gestito da Arduino così da risparmiare energia e quindi useremo pinMode(pinPowerLCD,OUTPUT) per gestirlo e per accenderlo e spegnerlo come vedete nel metodo setup() useremo digitalWrite(pinPowerLCD, HIGH) o LOW  per spegnere naturalmente.

L’LCD consente anche di stampare caratteri personalizzati, perchè ogni carattere è composto da piccoli sottopixel. La parte di creazione è quella che potete leggere da byte deg[8]= .. lcd.createChar(4). Per scriverlo si lancia il comando lcd.write(4). Per scrivere sull’LCD invece scegliamo la posizione con lcd.setCursor(riga, colonna) e lcd.print(messaggio) o println(messaggio), print(variabileDaStampare). 

Carichiamo il codice seguente e proviamolo!

 

//Creato da Mario Bonofiglio  

#include "LiquidCrystal.h" 
#include "DHT.h"
 
DHT dht(2, DHT22); //Imposta il modello di sensore e il pin di Arduino a cui è collegato
LiquidCrystal lcd(3,4,5,6,7,8); //Imposta i pin di Arduino a quali sono collegati in pin del display (Rs,E,DB4,DB5,DB6,DB7)

int power_pin=9; // il pin del pulsantino
int powerdht_pin=10; // pin di accensione DHT22
int powerLCD_pin=11; // pin di alimentazione dell'LCD

int val=0; // variabile di controllo pressione del pulsante
void setup()
{
 pinMode(power_pin,INPUT); // inizializzo i PIN del pulsantino in input e quelli di dht 
 pinMode(powerdht_pin,OUTPUT); // e lcd in output per accensione tramite arduino alla 
 pinMode(powerLCD_pin,OUTPUT); // pressione del pulsante
 Serial.begin(9600);
 dht.begin(); // avvio sensore DHT
 lcd.begin(16, 2); // imposto il numer di righe e colonne del display
 lcd.clear(); // pulisco lo schermo
 
 //creo il carattere ‘°’ per poter scrivere °C dopo il valore della temperatura
 byte deg[8] =
 {
 0b00011,
 0b00011,
 0b00000,
 0b00000,
 0b00000,
 0b00000,
 0b00000,
 0b00000
 };
 lcd.createChar(4,deg);
 
 //accendo il display e mostro un messaggio di benvenuto
 digitalWrite(powerLCD_pin,HIGH);
 lcd.setCursor(0,0);
 lcd.print("Welcome home!!");
 delay(2000); // attendo che venga letto
 lcd.clear(); // e pulisco lo schermo
 digitalWrite(powerLCD_pin,LOW);
 // spengo il display
}

void loop()
{
 val = digitalRead(power_pin); // leggo il valore del pulsante (PREMUTO = 1, NON PREMUTO = 0)
 Serial.println(val);
 // se è stato premuto
 if(val==HIGH){
 digitalWrite(powerLCD_pin, HIGH); // accendo il display con ARDUINO
 digitalWrite(powerdht_pin, HIGH); // accendo il sensore con ARDUINO
 
 lcd.print("Measuring...."); // messaggio informativo
 delay(1000); // pausa per la lettura
 float h = dht.readHumidity(); // leggi il valore di temperatura
 float t = dht.readTemperature(); // leggi il valore di umidità
 float index = dht.computeHeatIndex(t, h, false); // calcolo la temp percepita
 lcd.setCursor(0,0); // metti il cursore sulla prima riga
 lcd.print("Temp: "); // stampa Temp sul monitor 
 
 if(isnan(t)) // se il valore di temperatura è NaN (Not a Number) 
 lcd.print("Errore!"); // stampo Errore su LCD
 else // altrimenti
 {
 lcd.print(t); // stampo la temperatura su LCD
 lcd.write(4); // stampo il carattere ‘°’
 lcd.print("C"); // e poi stampo 'C'
 }
 
 lcd.setCursor(0,1); // metti il cursore sulla seconda riga
 lcd.print("Umid: "); // stampo Umid su LCD
 
 if(isnan(h)) // se il valore di umidità è NaN (Not a Number)
 lcd.print("Errore!"); // stampo Errore su LCD
 else
 {
 lcd.print(h); // stampo l'umidità su LCD 
 lcd.print(" %"); // stampo il carattere di percentuale '%'
 }
 delay(4000); // attendo che vengano letti i valori
 lcd.clear();
 lcd.print("Temp.Percepita"); // stampo messaggio
 lcd.setCursor(0,1); // mi sposto sul secondo rigo
 lcd.print(index); // stampo la temp. percepita
 lcd.write(4); // stampo il simbolo °
 lcd.print(" C"); // stampo la C di centrigradi
 delay(2000); // attendo lettura
 val=LOW; // imposto il pulsante a 0, non premuto, così da spegnere lo schermo al prossimo loop
 
 lcd.setCursor(0,0); // torno alla prima riga dell'LCD
 lcd.clear(); // pulisco lo schermo LCD
 lcd.print("Bye!! :) :)"); // stampo il messaggio di chiusura 
 delay(1000); // attendo che venga letto
 lcd.clear(); // pulisco lo schermo
 digitalWrite(powerLCD_pin, LOW); // spengo lo schermo
 digitalWrite(powerdht_pin, LOW); // spengo il sensore DHT
 }
}

Nella prossima Lezione comanderemo un relay, o relè che dir si voglia per accendere una luce! Vi aspetto!