Dopo qualche realizzazione pratica con Raspberry Pi, iniziamo a “smanettare” con Arduino.
Il progetto che andiamo a trattare riguarda un semplice termostato “di fortuna” realizzato in non più di 20 minuti utilizzando un Arduino, un display (compatibile HD44780) e un sensore di temperatura/umidità DHT11.
Avevo l’esigenza di accendere e spegnere una caldaia quando la temperatura ambientale scendeva sotto i 17 gradi…non volendo comprare un termostato nuovo…ho recuperato un display e ho cercato di visualizzare sopra tutti i dati rilevati.
Iniziamo con i collegamenti ….
Il display si collega così …
Il sensore si collega così …
Il relè per l’attivazione della caldaia va al pin 13….in questo progetto non e’ connesso perché e’ parte integrante dell’impianto di riscaldamento preesistente….testeremo il funzionamento con il led presente sulla scheda Arduino.
Prima di iniziare a scrivere il codice vi rimando a due pagine dove troverete le librerie per LCD e DHT11
Ecco il codice….realizzato scopiazzando tra i vari esempi già presenti nell’IDE di Arduino:
// carico le librerie #include <LiquidCrystal.h> #include "DHT.h" // definisco il pin del sensore #define DHTPIN 8 // definisco il tipo di sensore #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); // definisco a quali pin è connesso il display LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // definisco che il pin 13 è quello a cui è connesso il led const int ledPin = 13; void setup() { // setto il tipo di display (colonne, righe) lcd.begin(20, 2); // scrivo sul display le parole fisse lcd.print("Temperatura"); lcd.setCursor(0,1); lcd.print("Umidita'"); lcd.setCursor(16,0); lcd.print("Cald"); pinMode(ledPin, OUTPUT); } void loop() { int t = dht.readTemperature(); int h = dht.readHumidity(); // posiziono il cursore alla colonna 12 e riga 0 lcd.setCursor(12, 0); lcd.print(t); lcd.setCursor(12, 1); lcd.print(h); // setto il limite di temperatura minore o uguale a 17 gradi if (t <= 17) { // digitalWrite(ledPin, HIGH); lcd.setCursor(16, 1); lcd.print("Acc"); } else { // turn LED off: digitalWrite(ledPin, LOW); lcd.setCursor(16, 1); lcd.print("Spe"); } }
Tutto ciò che trovate dopo le // lo potete eliminare…sono solo commenti per farvi capire cosa succede in quel punto preciso del programma….
Una volta caricato il tutto….compariranno sul display temperatura e umidità dell’ambiente. Se la temperatura e’ inferiore o uguale a 17°C si accenderà il led…e quindi il relè ad esso connesso (tramite un transistor di potenza). Su display comparirà la scritta “Acc” che sta per Acceso.
Superati i 17°C il led si spegne e sul display compare la scritta “Spe”… che sta per spento!
Ecco un video…
Termostato con Arduino e DHT11 from danilo larizza on Vimeo.
Se volete aumentare o diminuire la temperatura di intervento basta modificare il valore nella riga :
if (t <= 17)
Buon lavoro….
ciao , ho provato a fare il tutto ma compare un errore nella compilazione, potresti ricontrollarlo ?
grazie
Non ho mai programmato (ancora) arduino, ma mi sembra che “lcd.begin(16, 2);” dovrebbe essere “lcd.begin(20, 2);” in quanto il display è da 20 colonne 😉
Ciao
Hai ragione, infatti ho appena modificato.
Ma alla fine come puoi notare funziona lo stesso. Infatti il codice e’ copiato direttamente dal programma Arduino.
Grazie per aver notato l’errore…e per essere stato sul blog 🙂
ciao,
uso il dht-11 non su arduino, ma su un altra schedina….
ho rilevato che la temperatura segna giusto, ma l’umidità sta sempre sui 37 38%, il dato che mi da il dht è giusto perchè il crc coincide…..
a voi come funziona il sensore?? si muove l’umidità??
grazie
Ciao luca,
Ne ho un paio e funzionano egregiamente…sia per temperatura che per umiditá…
La tensione che lo alimenta é stabilizzata??
Lasci passare qualche secondo per farlo stabilizzare?
da copia incolla in fase di compilazione mi da errore in : DHT dht(DHTPIN, DHTTYPE); riga 8
error: ‘DHT’ does not name a type
Giacomo devi installare le librerie per il dht.
Cercale su google e segui le istruzioni per installarle
le librerie sono copiate nella cartella ma non c’e verso. puoi indicarmi una guida?
Per vedere se le librerie sono installate bene dovresti avere nella sezione esempi del programma arduino una sezione dhttest con dei programmini per testare il sensore
probabilmente ho la libreria sbagliata!! hai un link da dove scaricarla?
grazie infinite
Usa questa guida
http://playground.arduino.cc/main/DHT11Lib
Ciao,
innanzitutto complimenti per l’ottimo lavoro =), sto facendo un progetto in cui uso un pic 18f4550 e vorrei acquisire i dati dal dht. Menre in arduino è già più o meno tutto pronto con il pic il lavoro è un pò diverso. Le mia domanda è: sul datasheet c’è scritto che il dht comunica in modo seriale- quindi non devo usare una porta analogica sul pic giusto? ; il mio dht è solo il pezzo blu di plastica con i 4 piedini non ha la schedina- cambia qualcosa?
Ciao Alessandro,
si … come dici tu puoi connettere il tutto via digitale (non proprio seriale)…più precisamente Single-Wire Two-Way. Niente uscite analogiche. Se vuoi usare una porta analogica dovresti usare l’LM35 ma ti da solamente la temperatura. Per quanto riguarda la piedinatura….no problem…forse nella schedina c’e’ solo una resistenza…mi sembra tra i pin 1 e 2. magari fai una piccola ricerca e troverai tutto.
Ci sono molti progetti basati su pic…..buona Gooogleata e Buon lavoro 🙂
Grazie 🙂 , si infatti ho visto … Mi sembra un po’ complicato ma dovrei farcela 🙂
dipende da quello che devi fare….procedi un passo alla volta….
buon lavoro
Ciao a tutti, ho installato la libreria dht11 da http://playground.arduino.cc/main/DHT11Lib e la libreria LiquidCristal, compilando mi da un errore ‘DHT’ does not name a type sulal riga “DHT dht(DHTPIN, DHTTYPE);”
non capisco perche in riga 3 l’include e con gli ” ” mentre in riga 2 e con , ma anche cambiandolo mi da errore.
In cosa sbaglio qualcuno può darmi una dritta?
Grazie mille
Un saluto
Andrea
Salve, mi sto apprestando a comprare e iniziare a smanettare con arduino. Il primo progetto sarebbe comporre questo termostato. Una domanda, probabilmente ovvia, ma preferisco averne la certezza: hai impostato il set up della temperatura a 17 °C. Io allo stesso modo potrei dare un set up anche per l’umidità e far scattare un relè? Come potete immaginare io ho anche un sistema di controllo umidità e vorrei gestire sia riscaldamento sia RH da arduino
Grazie!
Daniele, con arduino ci puoi fare di tutto..quindi anche far scattare il relé con l’umiditá
CIAO HO PROVATO A FARE QUESTO TERMOSTATO MA NONOSTANTE IO ABBIA CARICATO LE LIBRERIE MI DA ERRORE QUALCHE IDEA?
sketch_jun21b.ino:3:17: error: DHT.h: No such file or directory
sketch_jun21b:8: error: ‘DHT’ does not name a type
sketch_jun21b.ino: In function ‘void loop()’:
sketch_jun21b:25: error: ‘dht’ was not declared in this scope
Ciao Gianluca,
purtroppo sono entrato in modalità esitiva e non ho con me un arduino per verificare l’errore.
Protrebbero aver modificato la libreria e quindi le chiamate devono essere fatta in modo differente.
Puoi comunque fare una prova….
Se hai installato la libreria in modo corretto tra gli esempi dell’ide di arduino dovresti trovarti un esempio per testare il sensore.
Vedi se c’e’ (primo segno che la libreria e’ installata correttamente) e compilalo…per testare il sensore.
fammi sapere
ciaoo
Ciao, anch’io avevo il problema di gianluca. Ho risolto caricando la libreria giusta. Mi sono accorto che nel listato la libreria inclusa è la DHT.h e non la DTH11.h che abbiamo scaricato tutti quanti.
Questa libreria “DHT.h” è sviluppata dalla adafruit e si trova qui
https://github.com/adafruit/DHT-sensor-library
Con questa la compilazione va a buon fine…
Bye
Ciao ,non trovavo un programma che usava il displey 16×2 primo tipo e il sensore dht11.
In più hai aggiunto l’attivazione del pin 13 alla temperatura voluta .copia e incolla e partito al primo colpo.
Si riuscirà a cambiare la temperatura di impostazione con il solo displey e qualche pulsante?
Ciaoo
Tutto si può fare ma si dede capire che tastierino si usa e in che modo i dati vengono visualizzati sul display.
Se cerchi su google troverai molti progetti in merito.
Ciao Danilo
Io ho un problema però.. sia con il dht11 sia con il dht22
Il mio progetto è una serra automatizzata dove il telo (motore passo passo comandato dalla scheda l298n) si chiude o si apre in base alla temperatura pioggia e luce
Però siccome il sensore legge i dati ogni due secondi ho visto.. il motore ogni due secondi si blocca.. come un delay in pratica..
Ci sono soluzioni?
Ciao Michele, mi sa che c’e’ da mettere mano al programma. Senza entrare nello specifico….puoi vedere in quanto tempo il motore apre o chiude il telo….e fare un delay che aspetta che il telo sia completamente aperto o chiuso….poi rilegge la temperatura.
Naturalmente c’e’ da mettere dei margini nelle temperature in alto o in basso…perchè se stabilisci per esempio che a 20 gradi si deve aprire ..e a 21 si deve chiudere…..rischi di avere il telo sempre in movimento.
Hello. And Bye.
Salve, ho realizzato il progetto facendo accendere un led quando la temperatura scende sotto una certa soglia ma ho un anomalia: invece che accendere quando scende sotto la soglia accende e quando la temperatura sale spegne. La stringa è questa:
If (DHT.temperature<=21) {
digitalWrite (13, HIGH);
}
else{
digitalWrite (13, LOW);
Sapete dirmi come mai accade questa inversione? Grazie