Misurazione di temperatura e umidità con Arduino

laboratorio
laboratorio
Misurazione di temperatura e umidità con Arduino
Tipo di risorsa Tipo: laboratorio
Materia di appartenenza Materia: Sistemi automatici per le superiori 1
Avanzamento Avanzamento: laboratorio completa al 100%
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
 
Sensore di temperatura e umidità DHT-11

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
 
Display LCD 16x2

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.

 
immagine del circuito completo

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.

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
 
Schema di collegamento di un singolo display a 7 segmenti
 
I componenti utilizzati nel circuito sono:
componente quantità
Arduino 1
Display a 7 segmenti a 4 cifre 1
sensore DHT11 1
#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
 
Foto del circuito

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.