DHT11 e Arduino: Termometro con temperatura minima e massima



Questo progetto è una versione modificata del più semplice termometro / igrometro digitale
L'obiettivo è di ottenere un termometro con indicazione di temperatura minima e massima.
Continuando a leggere potrai realizzarlo anche tu!



Durante la costruzione del termometro ho fatto delle prove con la memoria EEPROM di Arduino, in questo modo sono riuscito a far si che i dati di minima e massima vengano memorizzati fino al reset manuale con un apposito pulsante.
Infatti, se togliamo tensione all'Arduino, i dati rimarranno salvati in memoria e compariranno nuovamente ad una accensione successiva.

Ecco un video che dimostra il funzionamento:



Nel video le temperature sono molto vicine, ma se lo lasciate acceso in una stanza per tutto il giorno potrete vedere l'escursione termica che si verifica.

Questo è il circuito da realizzare:



Questo è lo schema elettrico:



E questo è lo sketch da caricare, sono presenti alcuni commenti per facilitarne la comprensione:


  1. #include <LiquidCrystal.h>
  2. #include <EEPROM.h>
  3. #include "DHT.h"
  4. #define DHTPIN 8
  5. // 8 è il pin di Arduino a cui collego il sensore di temperatura
  6. #define DHTTYPE DHT11
  7. // dht11 è il tipo di sensore che uso
  8. DHT dht(DHTPIN, DHTTYPE);
  9. LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
  10. // connessione display (pin)
  11. const int reset = 10;
  12. int statoreset = 0;
  13. byte MIN;
  14. byte MAX;
  15. // dichiarazione variabili
  16. void setup() {
  17. lcd.begin(16, 2);
  18. // imposto il tipo di display (colonne, righe)
  19. lcd.print("TEMP ATTUALE");
  20. lcd.setCursor(0,1);
  21. lcd.print("MIN");
  22. lcd.setCursor(9,1);
  23. lcd.print("MAX");
  24. //scrivo sul display i caratteri fissi
  25. pinMode(reset, INPUT);
  26. digitalWrite(10, HIGH);
  27. MIN = EEPROM.read(1);
  28. MAX = EEPROM.read(2);
  29. // MIN e MAX assumono i due valori contenuti nella memoria EEPROM
  30. }
  31. void loop() {
  32. int t = dht.readTemperature();
  33. if (t > MAX)
  34. {MAX = t;
  35. EEPROM.write(2, t);}
  36. // se la temperatura supera il dato MAX allora modifico il dato MAX
  37. // scrivo questo dato anche nella eeprom
  38. if (t < MIN)
  39. {MIN = t;
  40. EEPROM.write(1, t);}
  41. // se la temperatura è minore del dato MIN allora modifico il dato MIN
  42. // scrivo questo dato anche nella eeprom
  43. statoreset = digitalRead (reset);
  44. if( statoreset == LOW)
  45. {MIN = t;
  46. MAX = t;}
  47. // premendo il tasto reset porto MIN e MAX al valore di temp attuale
  48. lcd.setCursor(14, 0);
  49. lcd.print(t);
  50. lcd.setCursor(5, 1);
  51. lcd.print(MIN);
  52. lcd.setCursor(14, 1);
  53. lcd.print(MAX);
  54. // scrittura dati sul display
  55. delay(100);
  56. }

Dato che la libreria "dht.h" non è presente in Arduino, per poter utilizzare lo sketch è necessario scaricarla da qui https://github.com/adafruit/DHT-sensor-library
e inserirla nella cartella "libraries" di Arduino.
Se avete domande chiedete pure, ciao!


Seguimi sulle mie pagine per rimanere sempre aggiornato sui nuovi post!

20 commenti:

  1. Ciao Daniele, non ti nascondo che il tuo blog è diventato un punto di riferimento fondamentale per lo studio di arduino e per questo ti ringrazio tantissimo.
    Ho eseguito con grande soddisfazione molti dei tutorial da te pubblicati, ma quello che mi attrae di più è il tutorial sul termometro e ti spiego perchè: sto cercando da tempo di costruire una efficiente incubatrice per uova e da quando ho scoperto arduino ho deciso di sfruttare l'elettronica digitale. In parole povere voglio utilizzare arduino per la realizzazione di un termostato che dovrà essere molto preciso ed al tal fine vorrei utilizzare due sensori LM335Z (10mV/°K) posizionati agli estremi dell'incubatrice (uno in basso ed uno in alto) e quindi utilizzare un valore medio delle due letture rilevate sperando di non aumentare l'errore standard del sensore in questione. Il mio problema è riuscire a stilare un codice che riesca proprio a gestire questi due sensori. Sono perfettamente consapevole di star chiedendo troppo, infatti mi scuso anticipatamente... Grazie mille comunque.

    RispondiElimina
    Risposte
    1. Ciao, intanto grazie mille per i complimenti :)
      Il progetto che vuoi realizzare è molto interessante, ti assicuro che mi metterò al più presto al lavoro :)

      Elimina
  2. Non so come ringraziarti!!!
    Il progetto finale prevede anche la gestione delle letture dei valori dell'umidità, allarmi per segnalare variazioni dannose delle condizioni ( T troppo bassa/alta), voltauova, etc... A poco a poco riuscirò ad assemlare il tutto! Utilizzerò il tuo tutrorial per poter impostare i valaori di temperatura senza dover coollegare arduino al pc. Grazie, grazie, grazie... ;)

    RispondiElimina
    Risposte
    1. Questo è un primo step, è solo un termometro con un lm335, sto facendo delle prove per capire come funziona.
      http://www.danielealberti.it/2014/03/arduino-termometro-kelvin-e-celsius-con.html

      Elimina
  3. Una richiesta da profano.
    Ho letto l'articolo sul termometro a massima e minima e mi ha interessato molto. Io mi occupo di modelazione climatica e vorrei suggerire un progetto o perlomeno avere una risposta im merito. Premetto che ho scarsissime conoscenze di Arduino e sono a livello principiante. Perciò chiedo ai letori del blog un consiglio su ciò che vorrei realizzare. In praticava benissimo un termometro a amssima e minima come quello illustrato, tuttavia i soli valori di temperatura dicono poco e non hanno utilità nella modellazione degli andamenti climatici. Vorrei sapere se con la stessa semplicità si possono registrare gli istanti in cui i due valori TMAX e TMIN si verificano nelle 24 ore. Diciamo che occorrerebbero i due tempi (in secondi o minuti o fraziondi ora) che possiamo indicarecon tmax e tmin. Con la conoscenza di questi soli quattro dati si può costruire la curva oraria delle temperature senza dover fare lunghe misurazioni. So bene che esistono i data logger di diverso tipo ma io vorrei realizzare una cosa molto più immediata. Nei procedimenti analitici esistono diversi algoritmi di analisi armonica per costruire con due tree più armoniche una curva giornaliera di temperatura.Naturalmente trascorse le 24 ore dall'inizio delle misure l'apparato dovrebbe azzerarsi e casomai memorizzare i dati immagazzinati nella memoria. Ho cercato se sul mercato esistono apparechi economici on queste capacità.
    Chiedo a voi esperti se pensate che sia un progetto fattibile.
    Sul Web c'è molto pressapochismo nel'uso dei termometri a massima e minima....e ad esempio non si considerano gli effetti di marittimità e continentalità e nemmeno le correzioni altimetriche della temperatura (ma questo casomai sarebbe un discorso successivo). Io sono disponibile a daretutte le informazioni sulla potenzialità di un apparecchio di questo tipo. Una per tutte il calcolo reale dei cosiddetti "Gradi Giorno" che attualmente hanno solo un riferimento burocratico non realistico. Qualcuno sarebbe interessato al progetto? Vi ringrazio se vorrete rispondermi anche in senso negativo. Eduardo

    RispondiElimina
    Risposte
    1. Ciao, interesserebbe anche a me una cosa del genere, sia temperatura che umidità

      Elimina
  4. Ciao Daniele, bel progetto!
    Avrei una domanda da fare però,
    la domanda è: se dopo che si resettano i valori del massimo e minimo sul display anche la EEPROM salva quei valori, opppure se una volta resettati se si toglie corrente alla scheda continuerà a dare i valori salvati prima del reset. Questo te lo chiedo in quanto non vedo nella funzione del reset un comando che dica alla EEPROM di salvare i nuovi dati.

    Grazie, Stefano

    RispondiElimina
    Risposte
    1. Ciao Stefano,
      i dati di minima e massima vengono salvati al momento del superamento del valore precedente, non nel momento del reset.
      Ciao!

      Elimina
  5. Questo commento è stato eliminato dall'autore.

    RispondiElimina
  6. Ciao e complimenti.
    Come faccio a visualizzare anche i decimi di grado?
    Premetto che ho modificato lo sketch per poter visualizzare via seriale a monitor PC, e per usare la sonda DS18B20

    perchè quando parte la temp max è sempre a 85° ?

    Grazie, ciao

    RispondiElimina
  7. Ciao, sarebbe troppo complicato fare il tutto su di una 24LC256 esterna? volevo creare un progetto di temperatura e umidità ma se possibile salvati su eeprom esterna.

    Grazie mille e ancora complimenti per il sito

    RispondiElimina
  8. ciao, sono alla realizzazione del mio primo progetto con Arduino e pensavo di realizzare questo. Ma mi servirebbe avere temperatura max e min di un liquido. Domanda: il sensore DHT 11 è sommerglbile in acqua? per trasformarlo in sonda potrei inserirlo in una provetta sigillata? potrei utilizzare una sonda specifica per liquidi e in tale caso quale e che modifiche dovrei fare al progetto sia hardware che software grazie

    RispondiElimina
    Risposte
    1. Ciao, il DHT non è resistente all'acqua, però come hai detto potresti inserirlo in un contenitore sigillato. Tieni conto che in questo modo ci vorrà un po' di tempo prima che la temperatura dell'aria attorno al sensore diventi uguale a quella del liquido. Sonde di temperatura immergibili non ne ho mai utilizzate, ma su eBay immagino ci sia molto materiale di questo tipo.
      Ciao!

      Elimina
    2. grazie per la risposta e scusa se mi presento come unknown ma non ho capito come si mette il nome :)di sonde sommergibili ne ho trovate ma non ho idea come cambi il software e l' hardware , cosa dovrei guardare per sostituire la sonda? grz

      Elimina
    3. Ciao Sergio,
      Probabilmente, una volta alimentate, ti forniscono una tensione proporzionale alla temperatura rilevata. Quindi con il comando "analogRead" puoi andare a leggere questo valore di tensione.

      Elimina
  9. ok grz provero' prima con il dht sigillato in una provetta poi se non dovesse funzionare provero' con le sonde per liquido

    RispondiElimina
  10. ciao Daniele....ho un favore da chiederti...se voglio aggiungere anche i dati dell'umidità...quali dati devo immettere in più...logicamente cambiando display con quello a 4 righe....

    RispondiElimina
  11. Ciao Daniele,il tuo progetto è molto bello.
    Ho copiato molte righe del tuo progetto per la realizzazione di uno mio.Solamente che mi funziona solo l'indicazione della minima,mentre la massima è sempre uguale alla temperatura attuale.Sto uscendo pazzo:
    #include
    #include
    #include "DHT.h"
    #include


    LiquidCrystal_I2C lcd(0x27, 20, 4);
    #define DHTPIN 2
    #define DHTTYPE DHT11
    DHT dht(DHTPIN, DHTTYPE);

    const int reset = 10;
    int statoreset = 0;
    byte MIN;
    byte MAX;




    void setup(){
    Serial.begin(9600);


    dht.begin();
    lcd.init();
    lcd.backlight();

    lcd.print("TEMP ATTUALE");
    lcd.setCursor(0,1);
    lcd.print("MIN");
    lcd.setCursor(9,1);
    lcd.print("MAX");
    //scrivo sul display i caratteri fissi

    // pinMode(reset, INPUT);
    // digitalWrite(10, HIGH);

    MIN = EEPROM.read(1);
    MAX = EEPROM.read(2);
    // MIN e MAX assumono i due valori contenuti nella memoria EEPROM



    }

    void loop(){

    int t = dht.readTemperature();

    if (t > MAX)
    MAX = t;
    EEPROM.write(2, t);
    // se la temperatura supera il dato MAX allora modifico il dato MAX
    // scrivo questo dato anche nella eeprom

    if (t < MIN)
    MIN = t;
    EEPROM.write(1, t);
    // se la temperatura è minore del dato MIN allora modifico il dato MIN
    // scrivo questo dato anche nella eeprom

    statoreset = digitalRead (reset);
    if( statoreset = LOW)
    MIN = t;
    MAX = t;
    // premendo il tasto reset porto MIN e MAX al valore di temp attuale

    lcd.setCursor(14, 0);
    lcd.print(t);
    lcd.setCursor(5, 1);
    lcd.print(MIN);
    lcd.setCursor(13, 1);
    lcd.print(MAX);
    // scrittura dati sul display

    delay(100);


    }


    RispondiElimina
    Risposte
    1. Scusami hai risolto? perchè avrei anche io lo stesso problema...

      Elimina
  12. scusami le prime 4 righe sono :
    #include
    #include
    #include "DHT.h"
    #include

    RispondiElimina

Lascia un commento qui sotto, ti risponderò il prima possibile!

Altri Post