Misurazione di temperatura e umidità con Arduino
Questa risorsa è stata scritta dagli studenti dell'Istituto ITIS "Enrico Mattei" di Urbino, della classe 3A/EN (Andrea P., Matteo C., Thomas P., Daniel G., Sasha M.) nell'a.s. 2020/2021, all'interno del corso di Sistemi automatici per le superiori 1.
Per favore, prima di apportare modifiche, attendi sino alla fine dell'anno scolastico (termina il 30 giugno 2021) oppure contatta il docente di riferimento Giacomo Alessandroni nel caso venissero rilevati contenuti non in linea con le linee guida della comunità. Se leggi questo avviso ad anno scolastico concluso puoi rimuoverlo. |
Realizzazione con display LCD
[modifica]Il progetto che segue è pensato per la realizzazione di un termometro digitale, composto da uno schermo LCD in grado di mostrare la temperatura e l'umidità di un determinato luogo tramite l'utilizzo di un sensore di umidità e temperatura DHT11.
Descrizione del progetto
[modifica]Il sistema è composto da:
- sensore di temperatura DHT-11, che acquisisce temperatura e umidità dall'esterno.
- display LCD 16x2, con integrato I2C, che mostra i valori ottenuti dal sensore sul display illuminato
Schema di montaggio
[modifica]Di seguito lo schema di montaggio
Qui un'immagine del circuito realizzato.
Si noti che l'interfaccia I2C (che consente il numero dei cavi con il microcontrollore) nello schema di montaggio è integrata nel display LCD, mentre nella realizzazione di laboratorio e inserita a parte.
Codice
[modifica]Il codice utilizzato è il seguente:
#include <DHT.h> // Libreria per il controllo del sensore
#include <LiquidCrystal_I2C.h> // Libreria per la gestione del driver I2C
int pinLed = 4;
DHT dht(3, DHT11); // Pin del sensore e dello schermo LCD
LiquidCrystal_I2C lcd(0x27, 16, 2); // Formato display LCD
Includo le librerie del sensore DHT11 e del display LCD e dichiaro i pin.
void setup() {
dht.begin(); // inizializzazione del sensore DHT11
lcd.init(); // inizializzazione del display LCD
lcd.backlight(); // abilitazione della retroilluminazione del display
pinMode(pinLed, OUTPUT) // definiamo la retroilluminazione come OUTPUT
analogWrite(pinLed, 10) // mandiamo il segnale PWM con un valore da 0 a 255
}
Inizializziamo il sensore e il display, retro illuminiamo il display (lcd.backlight) e mandiamo il segnale PWM con un valore 10 ( compreso tra 0 e 255).
void loop() {
delay(1000); // Si esegue un'acquisizione ogni secondo
int t = dht.readTemperature(); // Lettura della temperatura e umidità relativa
int h = dht.readHumidity();
lcd.clear(); // Reset del display
lcd.setCursor(0,0); // Cursore a riga 0, colonna 0
lcd.print("Temp: " + String(t) + Char(0xDF) + "C"); // Scrittura della temperatura
lcd.setCursor(0,1); // Cursore a riga 1, colonna 0
lcd.print("Umid: " + String(h) + "%"); // Scrittura dell'umidità relativa
}
Dopo aver letto la temperatura e l'umidità, i due valori vengono stampati sulla prima e sulla seconda riga del display LCD, con l'aggiunta del simbolo del grado centigrado (°C) e della percentuale (%).
Realizzazione con display a 7 segmenti
[modifica]Il progetto che segue è pensato per la realizzazione di un termometro digitale, realizzato col supporto del microcontrollore Arduino, che attraverso il sensore di temperatura e umidità DHT11, mostra il valore della temperatura dell'ambiente su un display a 7 segmenti.
Descrizione del progetto
[modifica]Il funzionamento del circuito può essere riassunto in 3 punti:
- Il sensore DHT11 effettua la misurazione della temperatura;
- Il valore della temperatura viene poi elaborato dal microcontrollore Arduino che lo converte in stringa;
- Arduino invia la stringa al display, il quale illumina i segmenti per comporre le cifre derivanti dal valore iniziale;
Schema di montaggio
[modifica]componente | quantità |
---|---|
Arduino | 1 |
Display a 7 segmenti a 4 cifre | 1 |
sensore DHT11 | 1 |
Codice
[modifica]#include <SimpleDHT.h>
//Dichiaro delle variabili
const unsigned int DHT = 2;
const int cifra1 = 3;
const int cifra2 = 4;
const int cifra3 = 5;
const int a = 7;
const int b = 8;
const int c = 9;
const int d = 10;
const int e = 11;
const int f = 12;
const int g = 13;
const int dp = 6;
const int ritardo = 500;
SimpleDHT11 dht11(DHT);
Nella prima parte includiamo e inizializziamo la libreria simpleDHT, che ci permette di leggere i dati del sensore di temperatura. Si creano le costanti per gestire i vari pin che si andranno poi a usare.
void setup() {
Serial.begin(9600);
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);
pinMode(dp, OUTPUT);
pinMode(cifra1, OUTPUT);
pinMode(cifra2, OUTPUT);
pinMode(cifra3, OUTPUT);
}
Nel setup (la parte di codice che viene eseguita quando si avvia il microcontrollore e alla pressione del tasto di reset) si impostano i modi di funzionamento dei pin del display come output.
void loop() {
float temp = rilevaTemperatura();
float n = 05.0;
stampa(temp);
}
Nella funzione loop (la parte di codice che viene eseguita in modo ciclico dal microcontrollore), si rilevare la temperatura, mediante la funzione rivelaTemperatura() e la si memorizza in una variabile. In seguito si utilizza questa variabile per visualizzare la temperatura stessa (estraendo le singole cifre di interesse dal numero).
void stampa(float n) {
// Scompone il numero n nelle sue cifre
int cifre[3] = {};
cifre[0] = n / 10;
cifre[1] = n - cifre[0] * 10;
cifre[2] = (n * 10) - (cifre[0] * 100) - (cifre[1] * 10);
for(int i = 0; i < sizeof(cifre); i++) {
int stampa = cifre[i];
// Inizializzazione
digitalWrite(cifra1, HIGH);
digitalWrite(cifra2, HIGH);
digitalWrite(cifra3, HIGH);
digitalWrite(dp, LOW);
// Determina quale cifra stampare
switch(i) {
case 0:
digitalWrite(cifra1, LOW);
delay(ritardo);
break;
case 1:
digitalWrite(cifra2, LOW);
delay(ritardo);
break;
case 2:
digitalWrite(cifra3, LOW);
digitalWrite(dp, HIGH);
delay(ritardo);
break;
}
// Stampa la singola cifra
switch(stampa) {
case 0:
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, LOW);
break;
case 1:
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
break;
case 2:
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
break;
case 3:
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
break;
case 4:
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case 5:
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case 6:
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case 7:
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
break;
case 8:
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case 9:
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
default:
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
break;
}
}
}
La funzione stampa() converte un numero decimale e lo scompone in cifre, che poi saranno inviate singolarmente al display a sette segmenti a quattro cifre.
float rilevaTemperatura() {
byte temperature = 0;
byte humidity = 0;
int err = SimpleDHTErrSuccess;
if ((err = dht11.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
return 999;
}
Serial.print("Temperatura " + String(temperature) + " °C\n");
return(float(temperature));
}
La funzione rivelaTemperatura(), come suggerisce il nome va a rilevare la temperatura dal nostro sensore, riportando la temperatura con un valore decimale.
Espansioni suggerite
[modifica]La realizzazione di questo circuito permette, grazie al display, di visualizzare in tempo reale la temperatura in una determinata stanza o in un determinato ambiente, con un'approssimazione al grado centigrado. Il circuito può rivelarsi particolarmente utile negli ambienti chiusi per poter verificare costantemente la temperatura, come nelle serre.
Con l'introduzione di un modulo Wi-Fi sarà anche possibile conosce la temperatura di un ambiente da remoto ed, eventualmente, attivare impianti di riscaldamento o refrigerazione.