Display LCD TFT per il monitoraggio di temperatura e umidità con DHT22

Introduzione

Benvenuti in questa esplorazione pratica del mondo dei display LCD TFT e del monitoraggio ambientale con ESP32. In questo articolo, ci immergeremo nell’universo dei display TFT, esplorando le loro caratteristiche, le librerie e le potenzialità offerte, mentre ci addentreremo nell’implementazione di un sistema di monitoraggio ambientale in tempo reale.

Partendo dalla base, approfondiremo il funzionamento e le capacità del display LCD TFT da 2.8″, con particolare attenzione alle sue specifiche tecniche. Analizzeremo anche il ruolo chiave dell’ESP32 nella gestione del display e nel trasferimento dei dati, esplorando le sue funzionalità e le potenzialità offerte nell’ambito dell’Internet delle Cose (IoT).

Successivamente, integreremo il sensore di temperatura e umidità DHT22 nell’ambiente di sviluppo ESP32, discutendo le modalità di collegamento e le tecniche di acquisizione dati. Utilizzeremo le librerie TFT_eSPI e TFT_eWidget per creare un’interfaccia utente intuitiva e personalizzata, permettendo di visualizzare in tempo reale i dati ambientali con chiarezza e precisione.

Esploreremo anche le funzionalità avanzate offerte dalle librerie, come la creazione di widget dinamici e l’implementazione di funzionalità interattive, che consentono di adattare il sistema alle esigenze specifiche del progetto.

Come al solito, per lo sviluppo del progetto, useremo l’ottimo IDE PlatformIO.

Cos’è ILI9341 Display LCD TFT SPI 2.8″?

Il ILI9341 Display LCD TFT SPI 2.8″ è un tipo di schermo a cristalli liquidi (LCD) a colori ad alta risoluzione progettato per fornire un’interfaccia visiva in progetti elettronici. Comunica col microcontrollore tramite interfaccia SPI dedicata. Oltre alla visualizzazione a colori, dispone di un touchscreen resistivo che consente l’interazione diretta con l’utente (tramite interfaccia SPI dedicata), e di uno slot per schede SD (Secure Digital) che consente di memorizzare e accedere facilmente ai dati (tramite interfaccia SPI dedicata).

Caratteristiche tecniche:

Dimensioni dello schermo: 2.8 pollici (diagonale)
Risoluzione: 320 x 240 pixel
Controller: ILI9341, un popolare controller per display TFT che supporta la comunicazione tramite SPI (Serial Peripheral Interface)
Interfaccia: SPI (Serial Peripheral Interface) per la comunicazione con microcontrollori e altri dispositivi
Touchscreen: resistivo, che consente l’interazione diretta con l’utente attraverso la pressione
Slot per schede SD: per l’accesso a schede di memoria SD tramite l’interfaccia SPI, consentendo la memorizzazione e l’accesso ai dati
Colori: supporta la visualizzazione di 65.536 colori (16-bit)
Angolo di visione: buono, con una visione chiara da diverse angolazioni
Retroilluminazione: retroilluminazione a LED per una luminosità uniforme e regolabile
Compatibilità: compatibile con una vasta gamma di microcontrollori e schede di sviluppo

Funzionalità e utilizzo: il ILI9341 Display LCD TFT SPI 2.8″ con touchscreen resistivo e alloggio per SD card può essere utilizzato in una varietà di applicazioni, tra cui:

  • Creazione di interfacce utente interattive per dispositivi embedded e progetti IoT
  • Visualizzazione di testo, grafici e immagini con la possibilità di interazione tramite touchscreen
  • Implementazione di sistemi di registrazione dati che utilizzano lo slot per schede SD per archiviare e accedere ai dati
  • Realizzazione di dispositivi multimediali portatili, come lettori video e visualizzatori di immagini, con la possibilità di memorizzare i file multimediali sulla scheda SD

Vantaggi:

  • Interazione utente: il touchscreen resistivo consente un’interazione diretta e intuitiva con l’interfaccia utente.
  • Memorizzazione esterna: lo slot per schede SD offre la possibilità di memorizzare una grande quantità di dati esternamente al dispositivo principale (per esempio immagini da usare come sfondo o come icone).
  • Versatilità: grazie alla sua interfaccia SPI e alle sue caratteristiche tecniche avanzate, è adatto a una vasta gamma di applicazioni nell’ambito dell’elettronica e dell’informatica embedded.

Limitazioni:

  • Complessità della programmazione: Potrebbe richiedere una certa familiarità con la programmazione embedded e le librerie grafiche per sfruttare appieno le sue funzionalità.
  • Dimensioni limitate dello schermo: Le dimensioni del display potrebbero essere limitate per alcune applicazioni che richiedono una visualizzazione più ampia.

In sintesi, il ILI9341 Display LCD TFT SPI 2.8″ con touchscreen resistivo e alloggio per SD card è una scelta versatile per progetti embedded che richiedono una visualizzazione a colori di alta qualità, interazione utente e capacità di memorizzazione esterna. Con le sue caratteristiche avanzate e la compatibilità con una vasta gamma di microcontrollori, è ideale per una varietà di applicazioni nell’ambito dell’elettronica e dell’informatica embedded.

Le librerie grafiche utilizzate: TFT_eSPI e TFT_eWidget

Libreria TFT_eSPI: La libreria TFT_eSPI è una libreria grafica altamente ottimizzata progettata per fornire un’interfaccia semplice e potente per la gestione dei display TFT a colori con microcontrollori basati su architettura ESP8266 e ESP32. Ecco alcune delle caratteristiche principali della libreria TFT_eSPI:

  • Compatibilità: supporta una vasta gamma di display TFT con controller compatibili con SPI, tra cui il popolare controller ILI9341 utilizzato nei display TFT da 2.8″.
  • Alta velocità: sfrutta le funzionalità hardware dei microcontrollori ESP8266 e ESP32 per ottenere prestazioni elevate e tempi di aggiornamento rapidi dello schermo.
  • Risparmio di memoria: è progettata per occupare meno spazio in memoria possibile, consentendo l’utilizzo di altre risorse del microcontrollore per funzionalità aggiuntive.
  • Supporto touchscreen: integra funzionalità di gestione del touchscreen resistivo, consentendo l’interazione utente tramite tocchi e pressioni sul display.
  • Gestione avanzata del colore: offre un’ampia gamma di funzionalità per la gestione dei colori, inclusa la visualizzazione di immagini a colori, la creazione di grafici e molto altro ancora.
  • Libreria di grafica: fornisce una varietà di funzioni e metodi per disegnare forme geometriche, testo e altri elementi grafici sul display TFT.

Libreria TFT_eWidget: La libreria TFT_eWidget è una libreria aggiuntiva progettata per semplificare ulteriormente lo sviluppo di interfacce utente interattive sui display TFT utilizzando la libreria TFT_eSPI. Ecco alcune delle caratteristiche principali della libreria TFT_eWidget:

  • Componenti UI predefiniti: fornisce una vasta gamma di componenti di interfaccia utente (UI), come pulsanti, barre di scorrimento, caselle di testo e molto altro ancora, che possono essere facilmente integrati nei progetti.
  • Personalizzazione avanzata: consente una personalizzazione completa dei componenti UI, inclusa la modifica del colore, delle dimensioni e dello stile per adattarsi alle esigenze specifiche del progetto.
  • Facile integrazione: grazie alla sua interfaccia intuitiva e ai metodi di programmazione semplici, consente un’integrazione rapida e senza problemi dei componenti UI nei progetti esistenti.
  • Supporto touchscreen: gestisce automaticamente l’interazione utente tramite il touchscreen resistivo, consentendo l’utilizzo intuitivo dei componenti UI attraverso tocchi e pressioni sul display.

In sintesi, le librerie TFT_eSPI e TFT_eWidget offrono un’esperienza di sviluppo completa e potente per la creazione di interfacce utente interattive su display TFT con microcontrollori ESP8266 e ESP32. Con le loro caratteristiche avanzate e la facilità d’uso, sono ideali per una vasta gamma di applicazioni nell’ambito dell’elettronica embedded e dell’IoT.

Con queste librerie possiamo ottenere grafiche di questo tipo:

Display in funzione

Interfaccia SPI

Il display, il touchscreen e il lettore SD card usano ciascuno delle interfacce SPI dedicate. Esso è un protocollo seriale di comunicazione a 4 fili comunemente utilizzato in progetti embedded. Questi quattro fili sono:

  1. MISO (Master In Slave Out): questo è il pin attraverso il quale il modulo riceve dati dal dispositivo master, che di solito è l’Arduino o un altro microcontrollore.
  2. MOSI (Master Out Slave In): questo è il pin attraverso il quale il modulo invia dati al dispositivo master.
  3. SCK (Serial Clock): questo è il pin del clock che sincronizza la trasmissione dei dati tra il modulo e il dispositivo master.
  4. CS (Chip Select): questo pin viene utilizzato per selezionare il modulo RFID e inizializzare le operazioni di invio/ricezione dei dati.

Cos’è il DHT22

Il DHT22 è un sensore digitale di temperatura e umidità progettato per misurare con precisione questi parametri ambientali. Esso utilizza un sensore di umidità capacitivo e un termistore per misurare rispettivamente l’umidità e la temperatura dell’ambiente circostante. Quando viene alimentato, il sensore acquisisce i dati e li converte in segnali digitali che possono essere letti da un microcontrollore o da un altro dispositivo elettronico.
Il DHT22 è caratterizzato da una buona precisione e stabilità nelle misurazioni di temperatura e umidità. Ha un’ampia gamma di temperatura operativa e una precisione dichiarata nelle misurazioni. Il range di temperature misurate va da -40°C a +80°C (con risoluzione di 0.1°C) mentre quello di umidità relativa va da 0% a 100% (con risoluzione dello 0.1%). Inoltre il DHT22 è in grado di effettuare una misura completa in circa 2 secondi.
Il sensore ha solitamente tre pin per l’interfacciamento: uno per l’alimentazione, uno per la massa e uno per la trasmissione dei dati digitali. Utilizza un protocollo seriale di comunicazione per trasmettere le letture al dispositivo di controllo. I dati sono direttamente digitali quindi non c’è necessità di acquisirli con un convertitore analogico-digitale.
Il DHT22 è ampiamente utilizzato in progetti di monitoraggio ambientale, sistemi di controllo del clima, stazioni meteo fai-da-te e altri dispositivi che richiedono la misurazione precisa della temperatura e dell’umidità.

Vantaggi: Tra i vantaggi del DHT22 ci sono le sue dimensioni compatte, la facilità di utilizzo, la bassa potenza richiesta e la relativa economicità rispetto ad altri sensori simili.

Limitazioni: Anche se preciso, il DHT22 può essere soggetto a leggere fluttuazioni di misurazione in ambienti con elevate variazioni di temperatura o umidità. Inoltre, la sua interfaccia digitale può richiedere una certa attenzione nella programmazione e nell’interpretazione dei dati letti.

Di che componenti abbiamo bisogno?

La lista dei componenti non è particolarmente lunga:

  • una breadboard per connettere la NodeMCU ESP32 agli altri componenti
  • alcuni fili DuPont (maschio – maschio, maschio – femmina, femmina – femmina)
  • un resistore da 4.7kΩ
  • un sensore DHT22
  • un ILI9341 Display LCD TFT SPI 2.8″
  • e, ovviamente, una NodeMCU ESP32 !

Il modello di ESP32 scelto per questo progetto è quello dell’azienda AZ-Delivery.

Realizzazione del progetto

Lo schema elettrico

Prima di realizzare il circuito vero e proprio diamo un’occhiata al pinout della board:

Pinout della ESP32
Pinout della ESP32
Pinout del display lcd tft: sul lato sinistro ci sono i collegamenti (in alto) per il touchscreen e (in basso) per il display. Sul lato destro i collegamenti per il modulo SD card
Pinout del display lcd tft: sul lato sinistro ci sono i collegamenti (in alto) per il touchscreen e (in basso) per il display. Sul lato destro i collegamenti per il modulo SD card

Il pinout del sensore DHT22:

Pinout del DHT22
Pinout del DHT22

Useremo il GPIO 21 per collegare il DHT22 all’ESP32.

I collegamenti tra il display e il modulo ESP32 seguiranno le indicazioni di questa tabella:

DISPLAYESP32
MISOGPIO19
LED3.3V
SCKGPIO18
MOSIGPIO23
D/CGPIO04
RESETGPIO22
CSGPIO05
GNDGND
VCC5V
Tabella dei collegamenti fra il display e l’ESP32

In questo progetto non useremo nè il touchscreen nè il modulo SD card incorporato nel display.

Nell’immagine seguente è visibile lo schema elettrico realizzato con Fritzing:

Schema elettrico realizzato con Fritzing
Schema elettrico realizzato con Fritzing

Per chi lo preferisse, di seguito vediamo lo schema elettrico realizzato tramite EasyEda:

Schema elettrico realizzato con EasyEda
Schema elettrico realizzato con EasyEda

Lo sketch

Creiamo il progetto PlatformIO

Abbiamo già visto la procedura di creazione di un progetto PlatformIO nell’articolo Come creare un progetto per NodeMCU ESP8266 con PlatformIO.

Anche se si riferisce alla board ESP8266, la procedura è simile.
Semplicemente, nella scelta della piattaforma, dovrai scegliere la AZ-Delivery ESP-32 Dev Kit C V4.

Delle librerie indicate installa solo la libreria DHT sensor library for ESPx by Bernd Giesecke come indicato nel tutorial.

Ora modifica il file platformio.ini per aggiungere queste due righe:

monitor_speed = 115200
upload_speed = 921600

in modo che il file abbia un aspetto del genere:

[env:az-delivery-devkit-v4]
platform = espressif32
board = az-delivery-devkit-v4
monitor_speed = 115200
upload_speed = 921600
framework = arduino

Le librerie rimanenti (TFT_eSPI e TFT_eWidget) le possiamo installare direttamente modificando il file platformio.ini nel modo seguente:

[env:az-delivery-devkit-v4]
platform = espressif32
board = az-delivery-devkit-v4
framework = arduino
monitor_speed = 115200
upload_speed  = 921600
lib_deps = bodmer/TFT_eSPI@^2.5.43
           bodmer/TFT_eWidget@^0.0.6
           beegee-tokyo/DHT sensor library for ESPx@^1.19

Per finire dobbiamo anche sostituire un file nella libreria TFT_eSPI dopo che è stata installata. Si tratta del file User_Setup.h che puoi scaricare dal link qui sotto:

e, una volta scompattato, mettere nella cartella di progetto NOME_DEL_PROGETTO/.pio/libdeps/az-delivery-devkit-v4/TFT_eSPI/ questo file scaricato (dopo magari aver rinominato il vecchio file come User_Setup.h_OLD giusto per conservarlo).

NOTA BENE: il path NOME_DEL_PROGETTO/.pio/libdeps/az-delivery-devkit-v4/TFT_eSPI/ è lo stesso sia per Linux che per Windows.

Puoi scaricare il progetto dal link seguente:

decomprimerlo, prendere il file main.cpp e sostituirlo al posto di quello che hai nel progetto precedentemente creato.

Vediamo ora come funziona lo sketch.

Inizialmente vengono incluse le librerie necessarie:

#include <SPI.h>
#include <TFT_eSPI.h>     // Hardware-specific library
#include <TFT_eWidget.h>  // Widget library
#include "DHTesp.h"

Poi viene istanziato l’oggetto tft che gestirà il display:

TFT_eSPI tft  = TFT_eSPI();      // Invoke custom library

Di seguito vengono istanziati i due indicatori per la temperatura e pe l’umidità:

MeterWidget   hum  = MeterWidget(&tft);
MeterWidget   temp = MeterWidget(&tft);

Poi viene definito l’oggetto dht che gestisce il sensore DHT22, viene definito il GPIO 21 a cui è collegato e viene definito il tempo di misurazione (una misura ogni 3 secondi). È bene non scendere sotto questo valore in quanto il DHT22 riesce a fare misure ogni 2 secondi.

DHTesp dht;
#define  DHT22_PIN 21  

#define LOOP_PERIOD 3000 // Display updates every 3000 ms

Incontriamo poi la funzione mapValue che mappa gli indici dei due indicatori di temperatura e umidità sulle loro scale graduate:

float mapValue(float ip, float ipmin, float ipmax, float tomin, float tomax)
{
  return tomin + (((tomax - tomin) * (ip - ipmin))/ (ipmax - ipmin));
}

Incontriamo poi la funzione setup.

Inizialmente viene attivata la seriale e impostato il display:

  Serial.begin(115200); // For debug
  delay(2000);

  tft.init();
  tft.setRotation(2);

Poi vengono definite, per entrambi gli indicatori, le zone colorate sulle scale graduate (in verde, giallo, arancio e rosso):

// Colour zones are set as a start and end percentage of full scale (0-100)
// If start and end of a colour zone are the same then that colour is not used
//            --Red--  -Org-   -Yell-  -Grn-
hum.setZones(75, 100, 50, 75, 25, 50, 0, 25); 
// Meter is 239 pixels wide and 126 pixels high
hum.analogMeter(0, 190, 100.0, "%", "0", "25", "50", "75", "100");    

// Colour draw order is red, orange, yellow, green. So red can be full scale with green drawn
// last on top to indicate a "safe" zone.
//             --Red--  -Org-   -Yell-  -Grn-
temp.setZones(75, 100, 50, 75, 25, 50, 0, 25);
temp.analogMeter(0, 0, 100.0, "C", "0", "25", "50", "75", "100"); // 

Infine viene attivato il sensore DHT22:

dht.setup(DHT22_PIN, DHTesp::DHT22); // Connect DHT sensor to GPIO 21

Nella funzione loop troviamo il solito blocco if che fa effettuare le operazioni di misura e visualizzazione sugli indicatori ogni LOOP_PERIOD ms:

float humidity_f = dht.getHumidity();
float temperature_f = dht.getTemperature(); 


Serial.println(temperature_f);
Serial.println(humidity_f);


float humidity = mapValue(humidity_f, (float)0.0, (float)100.0, (float)0.0, (float)100.0);
// Serial.print("I = "); Serial.print(humidity);
hum.updateNeedle(humidity_f, 0);


float temperature = mapValue(temperature_f, (float)0.0, (float)50.0, (float)0.0, (float)50.0);
// Serial.print("   T = "); Serial.println(temperature);
temp.updateNeedle(temperature, 0);

Video del funzionamento

Di seguito possiamo vedere il nostro display all’opera:

Newsletter

Se vuoi essere aggiornato sui nuovi articoli, iscriviti alla newsletter. Prima dell’iscrizione alla newsletter leggi la pagina Privacy Policy (UE)

Se ti vuoi disiscrivere dalla newsletter clicca sul link che troverai nella mail della newsletter.

Inserisci il tuo nome
Inserisci la tua email
0 0 votes
Valutazione articolo
guest
2 Commenti
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Peter
Peter
13 giorni fa

Ottimo articolo, didatticamente molto efficace. Un piccolo appunto: oltre allo schema di montaggio con fritzing, uno schema elettrico sarebbe piu’ indicativo. Comunque un plauso e un grazie ai collaboratori di questo blog per il loro impegno e la loro professionalita’.

2
0
Would love your thoughts, please comment.x
Torna in alto