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.
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
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:
- #include <LiquidCrystal.h>
- #include <EEPROM.h>
- #include "DHT.h"
- #define DHTPIN 8
- // 8 è il pin di Arduino a cui collego il sensore di temperatura
- #define DHTTYPE DHT11
- // dht11 è il tipo di sensore che uso
- DHT dht(DHTPIN, DHTTYPE);
- LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
- // connessione display (pin)
- const int reset = 10;
- int statoreset = 0;
- byte MIN;
- byte MAX;
- // dichiarazione variabili
- void setup() {
- lcd.begin(16, 2);
- // imposto il tipo di display (colonne, righe)
- 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(14, 1);
- lcd.print(MAX);
- // scrittura dati sul display
- delay(100);
- }
e inserirla nella cartella "libraries" di Arduino.
Se avete domande chiedete pure, ciao!
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.
RispondiEliminaHo 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.
Ciao, intanto grazie mille per i complimenti :)
EliminaIl progetto che vuoi realizzare è molto interessante, ti assicuro che mi metterò al più presto al lavoro :)
Non so come ringraziarti!!!
RispondiEliminaIl 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... ;)
Questo è un primo step, è solo un termometro con un lm335, sto facendo delle prove per capire come funziona.
Eliminahttp://www.danielealberti.it/2014/03/arduino-termometro-kelvin-e-celsius-con.html
Una richiesta da profano.
RispondiEliminaHo 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
Ciao, interesserebbe anche a me una cosa del genere, sia temperatura che umidità
EliminaCiao Daniele, bel progetto!
RispondiEliminaAvrei 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
Ciao Stefano,
Eliminai dati di minima e massima vengono salvati al momento del superamento del valore precedente, non nel momento del reset.
Ciao!
Questo commento è stato eliminato dall'autore.
RispondiEliminaCiao e complimenti.
RispondiEliminaCome 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
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.
RispondiEliminaGrazie mille e ancora complimenti per il sito
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
RispondiEliminaCiao, 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.
EliminaCiao!
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
EliminaCiao Sergio,
EliminaProbabilmente, una volta alimentate, ti forniscono una tensione proporzionale alla temperatura rilevata. Quindi con il comando "analogRead" puoi andare a leggere questo valore di tensione.
ok grz provero' prima con il dht sigillato in una provetta poi se non dovesse funzionare provero' con le sonde per liquido
RispondiEliminaciao 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....
RispondiEliminaCiao Daniele,il tuo progetto è molto bello.
RispondiEliminaHo 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);
}
Scusami hai risolto? perchè avrei anche io lo stesso problema...
Eliminascusami le prime 4 righe sono :
RispondiElimina#include
#include
#include "DHT.h"
#include