Visualizziamo un testo su un display LCD
CC BY-SA 4.0 https://creativecommons.org/licenses/by-sa/4.0/
Workspace: Getting-started-with-NUCLEO-F401RE-and-mbedOS
Progetto: stm32nucleof401re_05_lcd
Materiale: Scheda NucleoF401RE - Cavo micro USB - DisplayLCD - Interfaccia I2C - cavi dupont
In questo progetto di esempio, vedremo come visualizzare messaggi su un display LCD.
Utilizziamo la toolchain già vista qui. Apriamo il progetto con un doppio click.
Il progetto contiene la cartella con il codice sorgente mbed-os, il file main.cpp, il nostro file entry-point, ed una libreria aggiuntiva, TextLCD disponibile on line su mbed e realizzata da Simon Ford per il supporto della stampa di messaggi su un display LCD.
Oltre ad includere la libreria mbed
#include "mbed.h"
dobbiamo includere la libreria per il supporto della stampa di messaggi di testo sul display LCD.
#include "TextLCD.h"
In questo esempio supponiamo che il display sia provvisto di una interfaccia hardware I2C come quella in figura.
Il display viene venduto con o senza interfaccia hardware. Le due parti possono anche essere acquistate separatamente ed essere poi saldate.
Il protocollo I2C utilizza due linee, una per il clock che sincronizza la comunicazione tra i due sistemi (SCL), ed una linea dati (SDA).
I pin della scheda Nucleo dedicati al bus I2C, sono PB_9 per SDA, ed PB_8 per SCL.
Quindi dovremo collegare i pin della interfaccia I2C del display serigrafati con SDA ed SCL, rispettivamente con i pin PB_9 e PB_8 della scheda Nucleo.
NucleoF401RE | Interfaccia I2C display |
---|---|
PB_9 | SDA |
PB_8 | SCL |
5V | Vcc |
GND | GND |
Realizzate opportunamente le connessioni, continuiamo ad analizzare il codice sorgente.
Creiamo una istanza del driver I2C di basso livello, passando come parametri le etichette relative ai pin utilizzati.
I2C i2c_lcd(PB_9,PB_8); // SDA, SCL
Creiamo una istanza del driver di più alto livello. A questo, oltre a passare come parametri, il puntatore al driver I2C, dovremo passare l’indirizzo dello slave I2C del display, ed il tipo di display che stiamo utilizzando, nel nostro caso un display LCD16x2, ossia di 16 caratteri per ciascuna delle 2 righe.
TextLCD_I2C lcd(&i2c_lcd,SLAVEADDRESS, TextLCD::LCD16x2); // I2C exp: I2C bus, PCF8574AT Slaveaddress, LCD Type
Per quanto riguarda l’indirizzo, questo è necessario essendo il bus I2C indirizzabile, ossia il master può raggiungere gli slave connessi al bus (SCL, SDA) in base al loro indirizzo.
L’indirizzo che utilizziamo per il nostro display è.
#define SLAVEADDRESS 0x4E
L’indirizzo è codificato dai pin A0,A1,A2 sulla interfaccia secondo le tabelle 4 e 5 disponibili nel datasheet
Può essere necessario regolare il contrasto del display utilizzando il trimmer evidenziato nella seguente figura.
Nella funzione main(), l’entry-point del nostro codice, troviamo l’invocazione di alcuni metodi dell’istanza lcd.
Spegniamo il cursore, non vedremo il cursore lampeggiare.
lcd.setCursor(TextLCD::CurOff_BlkOff);
Puliamo il display, rimuovendo eventuali messaggi precedenti.
lcd.cls();
Stampiamo un messaggio sulla prima riga
lcd.printf(" Welcome to");
Spostiamo il focus sul primo carattere della seconda riga
lcd.setAddress(0, 1);
Stampiamo quindi un secondo messaggio sulla seconda riga. Non avendo ripulito lo schermo vedremo entrambe i messaggi.
lcd.printf("LCD display demo");
A questo punto possiamo passare alla compilazione con un click sull’icona che rappresenta un martello
Se tutto è andato a buon fine, tra i messaggi nella console sarà indicato il path del file binario ottenuto dalla compilazione
Per programmare la scheda Nucleo, dopo averla connessa al PC via USB, copiare il file stm32nucleof401re_05_lcd.bin, nel drive NODE_F401RE.
Una volta programmata la scheda, il messaggio verrà stampato sul display.