Arduino: Termostato / Igrostato regolabile con display

Questo progetto ci consente di gestire, ad esempio, una teca contenente delle piante tropicali o delle tartarughe, controllandone temperatura e umidità direttamente su un display tramite dei pulsanti.

La realizzazione nasce dalla richiesta di un lettore, Giorgio, di controllare una cella di lievitazione. Per fare questo è stata necessaria l'aggiunta al progetto termometro igrometro digitale della possibilità di impostare dei set point senza collegare nuovamente il pc all'Arduino.
Ad esempio impostando una temperatura di 30 gradi ed essendo la temperatura ambiente a 25, scatterà un relè, al quale potremo collegare un riscaldatore.
Raggiunta la temperatura impostata il riscaldatore si staccherà automaticamente.
Lo stesso è ripetuto per l'umidità.

Ecco il video di esempio, considerate che al posto dei due led ci siano collegati i relè.


Per realizzarlo iniziamo dalla parte hardware:



Qui di seguito lo schema, è un po' più complesso del solito, se avete problemi chiedete pure:


Essendo a corto di porte digitali ho usato le porte A0 e A1, basta dichiararle come 14 e 15.

Ecco lo schema elettrico:


Nel video si vede accendere un led al superamento della soglia, ma voi probabilmente avrete bisogno di un relè come disegnato nello schema.
Per ulteriori info sui relè guarda qui

Ed infine ecco lo sketch:

  1. #include <LiquidCrystal.h>
  2. #include "DHT.h"
  3. #define DHTPIN 8
  4. // 8 è il pin di Arduino a cui collego il sensore di temperatura
  5. #define DHTTYPE DHT11
  6. // dht11 è il tipo di sensore che uso
  7. DHT dht(DHTPIN, DHTTYPE);
  8. LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
  9. // connessione display (pin)
  10. const int tsu = 6;
  11. const int tgiu = 7;
  12. const int hsu = 9;
  13. const int hgiu = 10;
  14. const int tout = 14;
  15. const int hout = 15;
  16. //dichiarazione pulsanti
  17. int statotsu = 0;
  18. int statotgiu = 0;
  19. int statohsu = 0;
  20. int statohgiu = 0;
  21. int tempimpostata = 0;
  22. int umidimpostata = 0;
  23. void setup() {
  24. lcd.begin(16, 2);
  25. // imposto il tipo di display (colonne, righe)
  26. lcd.print("TEMP");
  27. lcd.setCursor(10,0);
  28. lcd.print("SET");
  29. lcd.setCursor(0,1);
  30. lcd.print("UMID");
  31. lcd.setCursor(10,1);
  32. lcd.print("SET");
  33. pinMode(tout, OUTPUT);
  34. pinMode(hout, OUTPUT);
  35. }
  36. void loop() {
  37. statotsu = digitalRead (tsu);
  38. if( statotsu == HIGH)
  39. {tempimpostata++;}
  40. statotgiu = digitalRead (tgiu);
  41. if( statotgiu == HIGH)
  42. {tempimpostata--;}
  43. statohsu = digitalRead (hsu);
  44. if( statohsu == HIGH)
  45. {umidimpostata++;}
  46. statohgiu = digitalRead (hgiu);
  47. if( statohgiu == HIGH)
  48. {umidimpostata--;}
  49. int t = dht.readTemperature();
  50. int h = dht.readHumidity();
  51. // posiziono il cursore alla colonna 12 e riga 0
  52. lcd.setCursor(5, 0);
  53. lcd.print(t);
  54. lcd.setCursor(14, 0);
  55. lcd.print(tempimpostata);
  56. lcd.setCursor(5, 1);
  57. lcd.print(h);
  58. lcd.setCursor(14, 1);
  59. lcd.print(umidimpostata);
  60. if (tempimpostata > -1 && tempimpostata < 10)
  61. { lcd.setCursor (15, 0);
  62. lcd.print (" ");}
  63. if (umidimpostata > -1 && umidimpostata < 10)
  64. { lcd.setCursor (15, 1);
  65. lcd.print (" ");}
  66. if ( t < tempimpostata )
  67. {digitalWrite ( tout, HIGH );}
  68. else {digitalWrite (tout, LOW);}
  69. if ( h < umidimpostata )
  70. {digitalWrite ( hout, HIGH );}
  71. else {digitalWrite (hout, LOW);}
  72. }


Per poter compilare lo sketch è necessario scaricare la libreria dht.h.
dopo averla scricata dovete estrarla e metterla nella cartella "libraries" di Arduino.
Per qualsiasi dubbio o problema non esitate a scrivere, grazie. =)

Segui Daniele Alberti su Google+

63 commenti:

  1. Hi Daniele
    Sorry that i can not write in italian, therefore i write in english.
    Thanks for posting the sketch on your blog. I want like to where do you get the arduino simulator program. Is it freeware?
    Greetings
    Gerard

    RispondiElimina
    Risposte
    1. Hi! Thank you for read my blog! I usually don't use a simulator, but i have tried this
      http://virtronics.com.au/Simulator-for-Arduino.html
      The most important limitation of the freeware version is the waiting time before run the sketch. But for me is better try directly the sketch in che complete circuit!
      Sorry for my bad english! :)

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

    RispondiElimina
    Risposte
    1. Ciao, grazie per i complimenti!
      Prova così,
      Cancella le righe dalla 38 alla 40 e scrivici questo:

      int statoprectsu = statotsu;
      statotsu = digitalRead (tsu);
      if(statoprectsu =! statotsu)
      { if(statotsu == HIGH)
      {tempimpostata++;}}

      Questo riguarda solo il pulsante per aumentare la soglia della temperatura, per gli altri 3 pulsanti devi modificarli seguendo lo stesso stile.
      Fammi sapere se funziona o se ci sono problemi, ciao!

      Elimina
    2. Scusa Daniele, per sbaglio ho eliminato il commento. Lo riprendo per chi legge:
      Ho un problema con il pulsante che invece di far incrementare i valori impostati di una unità, procede a passi variabili da qualche unità a qualche decina. Se invece tengo premuto il pulsante per alcuni secondi, la situazione torna normale e l'incremento risulta regolare. Ora provo la tua soluzione e ti aggiorno.
      Grazie per la tua disponibilità!

      Elimina
    3. Niente, ora non incrementa i valori. Provo domani a mente fresca e ti aggiorno.
      Grazie ancora per la grande disponibilità e la cortesia.
      Ciao

      Elimina
    4. Ciao Daniele, ho messo un delay (150); alla fine del loop ed ora sembra funzionare.
      Quindi credo si tratti di un problema sulla gestione del tempo di pressione del pulsante.
      Cosa ne pensi?

      Elimina
    5. Si hai ragione, non ci avevo pensato.. l'obiettivo di quello che ti ho scritto ieri era diverso.
      Volevo far si che ad ogni ciclo Arduino tenesse conto dello stato del pulsante al ciclo precedente.
      Se il pulsante era già premuto, non intervenire, altrimenti fai quello che devi fare.
      Probabilmente però in quello che ti ho scritto ieri c'era qualcosa di sbagliato, in ogni caso va benissimo anche la tua soluzione. Ciao e grazie!

      Elimina
  3. Ciao Daniele mi chiamo Aldo, visto che sono alla prima esperienza con arduino mi manderesti lo sketch aggiornato con le varie modifiche (termoigrostato regolabile anche tramite pulsanti) visto che per il momento non sono in grado di poterlo aggiornare da me. Grazie in anticipo e complimenti per tutti i progetti che hai pubblicato.
    E-Mail aldo.tammaro@libero.it

    RispondiElimina
    Risposte
    1. Ciao, scusa ma ho notato il commento solo ora, puoi spiegarti meglio, cosa intendi per "sketch aggiornato"?
      Lo sketch fa già quello che chiedi..

      Elimina
  4. Buongiorno Daniele e complimenti, è grazie a persone come te che persone come possono tentare di iniziare a fare qualcosa con arduino.
    Come avrai intuito sono abbastanza alle prime armi con arduino e con l'elettronica.
    Ti vorrei chiedere alcune cose riguardo al progetto proposto che vorrei provare a replicare:
    Potresti inviarmi per cortesia la lista dei componenti da usare perchè ho alcuni dubbi sui seguenti passaggi:
    - la resistenza collegata al display è da 2,2k o 22k?
    - che tipo di transistore npn posso impiegare? può andare un 2N3906?
    - dal video ho visto che i tuoi collegamenti non finiscono alla board arduino ma ad un integrato? che tipo di integrato è e come lo interfaccio ad arduino?
    Aspetto fiducioso una tua risposta in merito e se fosse possibile, ti pregherei di inviarmi lo sketch con le correzioni sopra descritte.
    Nell'attesa colgo l'occasione per ringraziarti.
    Ciao Francesco.
    uciafu@gmail.com
    Aspetto fiducioso una tua risposta in merito

    RispondiElimina
  5. P.S.
    per quanto riguarda i transistor ho preso un abbaglio ho dei BC 237B NPN possono andare bene?

    RispondiElimina
    Risposte
    1. Ciao e grazie per i complimenti!! :)
      ti rispondo per punti:
      - la resistenza è da 2,2KOhm, che si può anche scrivere 2k2
      - il 2n3906 è un PNP e non va bene come giustamente hai detto anche tu, mentre il bc 237b dovrebbe andare bene
      - l'integrato che vedi nel video è l'Atmega328, che è anche montato sulla scheda Arduino Uno, si può anche usare da solo come puoi vedere qui:
      http://www.danielealberti.it/2013/06/arduino-standalone.html
      se hai una scheda Arduino puoi collegare direttamente i componenti come mostrato nello schema elettrico di questo post, io l'ho utilizzato solo perchè non avevo più "Arduini" a disposizione.
      Per lo sketch va già bene quello del post.
      Se c'è qualcosa che non è chiaro dimmi pure, ciao!

      Elimina
    2. Ok grazie, se incontrerò problemi ti verrò a bussare di nuovo. Ciao e grazie ancora!

      Elimina
  6. ciao volevo chiederti ma questo schema comanda 2 rele (2 out) riferite alla temperatura?

    RispondiElimina
  7. Questo commento è stato eliminato dall'autore.

    RispondiElimina
  8. Ciao Daniele, questo progetto è proprio quello che stavo cercando ! Premesso che sono un neofita di Arduino e di elettronica, potresti spiegarmi come mai non hai utilizzato lcd con interfaccia i2c che ti avrebbero permesso di semplificare lo schema e risparmaire pin ? Grazie

    RispondiElimina
    Risposte
    1. Semplicemente perché avevo solo questo tipo di display a disposizione, comunque nulla ti vieta di usarne uno i2c :)

      Elimina
  9. Ciao Daniele bel blog e bel progetto visto la mia incompetenza in materia, anche se con Arduino ho provato a litigarci anch'io, ti volevo chiedere se e come modificare lo sketch affinché sia possibile far abbassare umidità e temperatura raggiunti 2 valori di riferimento
    grazie per la pazienza

    RispondiElimina
  10. Ciao! Non ti serve cambiare nulla nello sketch, semplicemente basta usare l'altro contatto dei relè.

    RispondiElimina
  11. Grazie per la risposta ma mi sono spiegato male io dovrei per esempio mantenere la temperatura di una serra a 28 gradi C quindi se t scende sotto i 27 gradi dovrei accendere un riscaldatore se invece la temperatura sale sopra ai 29 dovrei accendere una ventola per riportarla ai 28 spero di aver reso l'idea. Ciao ed ancora grazie!

    RispondiElimina
    Risposte
    1. No anzi ti eri spiegato bene, ti ripeto che non serve cambiare lo sketch :)
      Il relè in uscita ha 3 pin, uno è il comune, uno è normalmente chiuso (con relè a riposo) e l'altro è normalmente aperto (si chiude quando Arduino glielo "dice".
      Quindi tu devi usare tutti i pin, sul comune gli metti il positivo (se la tua ventola e il riscaldatore sono in continua, altrimenti metti la fase..) sul normalmente chiuso metti il riscaldatore, e sul normalmente aperto metti la ventola.
      Dimmi pure se qualcosa non è chiaro, ciao!

      Elimina
  12. ciao come si può far per far si che arduino tenga in memoria la temperatura e l umidità impostata anche in seguito allo spegnimento? si può scrivere sulla eprom?E' possibile stabilire dei valori massimi per i set?
    grazie mille e complimenti per il progetto

    RispondiElimina
  13. Ciao, per la EEPROM puoi guardare qui:
    http://www.danielealberti.it/2014/01/memorizzare-un-valore-in-arduino.html?m=0
    Invece in questo post avevo fatto qualcosa di simile con la temperatura minima e massima:
    http://www.danielealberti.it/2014/01/arduino-termometro-con-temperatura.html?m=0

    RispondiElimina
  14. Ciao Daniele grazie per la rapida risposta,sto già lavorando per studiare una soluzione con la eeprom, per quanto riguarda la temperatura intendevo che la temperatura e l'umidità non hanno un range definito, io vorrei porre una soglia inferiore ed una superiore al SET cosi com'è ora è possibile impostare un qualsiasi valore alle due variabili.
    Come posso ovviare al problema?
    grazie mille

    RispondiElimina
    Risposte
    1. Semplicemente al posto di "tempimpostata" crei 2 variabili diverse (es. "tempimpostata1" e "tempimpostata2") e crei 2 "if". Quindi scrivi, se "t" è minore di "tempimpostata1" energizza il relè. Nell'altro metti se "t" è maggiore di "tempimpostata2" deenergizzalo.

      Elimina
    2. ciao Daniele ho risolto la questione della eeprom aggiungendo
      int tempimpostata = EEPROM.read(1);
      int umidimpostata = EEPROM.read(3);
      byte datotemperatura;
      byte datoumidita;

      e nel loop

      if( statosalva == LOW)
      {EEPROM.write(1, datotemperatura); //salva il dato nello slot 1 della eeprom
      delay(50);
      EEPROM.write(3, datoumidita); //salva il dato nello slot 3 della eeprom
      lcd.setCursor(13,4);
      lcd.print("SALVATO");
      delay(1000);}

      il discorso della temperatura è questo la temperatura e l'umidità possono essere impostate da -255 a +255 °C tramite i pulsanti tsu e tgiu lo stesso vale per l'umidità io voglio limitare il range impostabile tra 0 e + 30°C,l'umidità da 30 a 100% come posso limitare le variabili int tempimpostata int umidimpostata?

      saluti

      Elimina
    3. prova a cambiare questo blocco da questo:

      statotsu = digitalRead (tsu);
      if( statotsu == HIGH)
      {tempimpostata++;}

      a questo:

      statotsu = digitalRead (tsu);
      if (( statotsu == HIGH ) && ( tempimpostata < 30))
      {tempimpostata++;}

      di conseguenza cambia anche gli altri 3 blocchi!
      fammi sapere

      Elimina
    4. Ciao Daniele grazie funziona alla perfezione! Avevo trovato una soluzione ma era molto più macchinosa quando alla fine bastava semplicemente fare come dicevi te.Ho dovuto mettere 31 anzichè 30 gradi perchè per assurdo non faceva impostare 30. è possibile farlo diventare un termostato igrostato differenziale? ho inserito:

      if ( t > tempimpostata+2 )
      {digitalWrite ( tfout, HIGH );
      digitalWrite ( ventole, HIGH );
      digitalWrite ( ledfreddo, HIGH );
      lcd.setCursor(0,4);
      lcd.print("RAFFREDDA ");}
      else {digitalWrite (tfout, LOW);

      Ma cosi facendo scatta si due gradi sopra quella impostata ma si ferma appena arriva alla tempimpostata+2 °C io invece vorrei che scatti a 2 gradi sopra e si fermi alla tempimpostata.
      Hai qualche idea?

      Saluti

      Elimina
    5. Mi fa piacere che funzioni,
      quest'ultima richiesta non l'ho ben capita invece.. Vorresti creare un'isteresi? Cioè un range di 2 gradi in cui lo stato dei rele rimanga quello che era prima?

      Elimina
    6. ciao Daniele, si praticamente ora come ora il termostato agisce alla minima variazione della temperatura e dell umidità, io invece vorrei dirgli questo,ti faccio un esempio

      TEMPERATURA IMPOSTATA 20°C

      Riscalda quando la temperatura letta dalla sonda è piu bassa di 2°C rispetto al set, in questo caso accendi il relè a 18°C ed arrestalo a temperatura impostata 20°C, questo fa sì che il termostato non pendoli in continuazione ma che vada a riscaldare solo quando si trova 2 gradi sotto l'impostazione finchè non raggiunge il set.
      Questo trasformerebbe il termostato in un termostato con isteresi a tutti gli effetti, il problema è che non riesco a trovare una condizione giusta nel mio sketch che ti riporto sotto il relè non riscalda fino al set ma fino alla tempimpostata -2

      if ( t < tempimpostata-2 )
      {digitalWrite ( tfout, HIGH );
      digitalWrite ( ventole, HIGH );
      digitalWrite ( ledfreddo, HIGH );
      lcd.setCursor(0,4);
      lcd.print("RISCALDA ");}

      Hai qualche idea?
      grazie per i preziosi consigli

      Elimina
    7. Scusa se ti ho fatto aspettare un po', spero tu abbia già risolto, in caso contrario prova questo:

      if ( t < tempimpostata-2 )
      {digitalWrite ( tfout, HIGH );
      digitalWrite ( ventole, HIGH );
      digitalWrite ( ledfreddo, HIGH );
      }

      if ( t > tempimpostata)
      {digitalWrite ( tfout, LOW );
      digitalWrite ( ventole, LOW );
      digitalWrite ( ledfreddo, LOW );
      }

      Elimina
  15. Ciao Daniele ho provato la tua soluzione ma purtroppo nel mio caso non va bene perchè il termostato umidostato che sto costruendo prevende anche altre variabili ed il tutto mi si sovrappone, per il momento ho risolto cosi,

    quando la temperatura è più bassa di due gradi scrivo sulla eeprom 1
    quando la temperatura è uguale scrivo sulla eeprom 0

    questo è il codice, solo che vorrei risparmiare la eeprom visto che il valore cambierà spesso potrebbe durare poco, come si può fare per risparmiarla?C'è qualche tipo di variabile che posso utilizzare al posto di scrivere il dato sulla eeprom?

    if (( t < tempimpostata-2) && (ritenutacaldo != 1))
    {EEPROM.write( 5, 1 );
    }

    if (( t == tempimpostata ) && (ritenutacaldo != 0))
    {EEPROM.write( 5, 0 );
    }

    if ( ritenutacaldo == 1 )
    {digitalWrite ( tout, HIGH );
    digitalWrite ( ventole, HIGH );
    digitalWrite (ledcaldo, HIGH );
    digitalWrite ( tfout, LOW );
    lcd.setCursor(0,4);
    lcd.print("RISCALDA ");}

    if (( t > tempimpostata+2 ) && (ritenutafreddo != 1))
    {EEPROM.write( 7, 1 );
    }

    if (( t == tempimpostata ) && (ritenutafreddo != 0))
    {EEPROM.write( 7, 0 );
    }

    if ( ritenutafreddo == 1 )
    {digitalWrite ( tfout, HIGH );
    digitalWrite ( ventole, HIGH );
    digitalWrite ( ledfreddo, HIGH );
    digitalWrite ( tout, LOW );
    lcd.setCursor(0,4);
    lcd.print("RAFFREDDA ");}



    if ((t <= tempimpostata+2 && t >= tempimpostata-2) && (ritenutacaldo == 0 && ritenutafreddo == 0)){ //se la temperatura è uguale a quella impostata deumidifica se è necessario
    if ( h > umidimpostata+5 )
    {digitalWrite ( tfout, HIGH );
    digitalWrite ( tout, HIGH );
    digitalWrite ( ventole, HIGH );
    lcd.setCursor(0,4);
    lcd.print("DEUMIDIFICA");}
    else if( h <= umidimpostata )
    {
    lcd.setCursor(0,4);
    lcd.print("PAUSA ");
    digitalWrite ( ventole, LOW );
    digitalWrite ( tfout, LOW );
    digitalWrite ( tout, LOW );
    }

    grazie mille!

    RispondiElimina
    Risposte
    1. Ciao!
      La Eeprom ha il solo vantaggio di conservare i dati anche se togli alimentazione ad Arduino.
      Ma se questo non è il tuo caso puoi usare una semplice variabile, in questo modo:

      scrivi questo all'inizio dello sketch:

      int pippo;

      cambia la tua parte con questa

      if (( t > tempimpostata+2 ) && (ritenutafreddo != 1))
      {pippo=1;
      }

      if (( t == tempimpostata ) && (ritenutafreddo != 0))
      {pippo=0;
      }

      fammi sapere!

      Elimina
  16. E' giusto!
    Grazie mille Daniele funziona alla perfezione

    RispondiElimina
  17. Ciao Daniele,il termostato/umidostato va alla grande!grazie mille per i preziosi consigli,avrei un altro quesito per te,siccome ho costruito da un vecchio frigo una macchina che controlla sia con il caldo che con il freddo temperatura ed umidità, ho necessità di sbrinare ogni 4 ore, ho inserito il contatore che ogni 4 ore ferma il frigo per 15 minuti per far si che sbrini, ma vorrei farlo sbrinare con una resistenza che al raggiungimento della temperatura di 10°C con un apposita sonda interrompa lo sbrinamento.hai qualche idea? attualmente ho inserito uno switch con più casi ma questo ferma e basta non controlla la temperatura.

    switch (seconds)

    {
    case (3600):
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print(" SBRINAMENTO 1 ");
    digitalWrite ( tfout, LOW );
    digitalWrite ( ventole, LOW );
    digitalWrite ( tout, LOW );
    delay(900000);
    lcd.clear();
    break;

    RispondiElimina
    Risposte
    1. Buongiorno saresti così gentile da condividere il tuo termoigrostato per cella di stagionatura?

      Elimina
  18. Ciao Daniele,
    una domanda, dei 3 sensori DHT11 a mia disposizione, di nessuno riesco a leggere il valore decimale (leggo sempre 0), il DHT11 restituise i decimi di gradi ? (da datasheet parrebbe di si...mah)
    D'accordo che con una precisione di +o- 2.0 gradi leggere i devimali potrebbe non essere utile... ma se ci sono perche non leggerli ?

    grazie
    Roberto B.

    RispondiElimina
    Risposte
    1. Ciao!
      A me dal datasheet pare che mandi solo i gradi e non i decimali..
      Dice "resolution 1°C"

      Elimina
    2. accidenti hai ragione.. mi ero focalizzato sul fatto che nella trasmissine siano possibili i decimali...
      Data format:
      8bit integral RH data + 8bit decimal RH data + 8bit integral T data + 8bit decimal T
      data + 8bit check sum
      Grazie!

      Elimina
    3. Si l'ho notata anch'io quella parte, però non ho ben capito a cosa serva in questo sensore.. Non so magari è uno standard x sensori piu precisi..

      Elimina
  19. Complimenti vivissimi per il tuo blog, sempre utilissimo. Grazie

    RispondiElimina
  20. Ciao Daniele,
    complimenti per il tuo blog (che ho scoperto per caso), ormai non mi perdo un progetto e, anche se sono un neofita, cerco di capire come lo hai realizzato e cosa hai utilizzato! Veramente consigli eccezionali e utili!
    Guardando il progetto con l'igrometro e il termometro con i set di attivazione a un valore impostato hai realizzato parte di una mia idea! Io vorrei fare una pagina web (quindi raggiungibile da qualsiasi parte nel mondo, ho un server web) dove ho lo schema di casa e vengono evidenziate le varie stanze. Vorrei fare in modo che il progetto da te realizzato, mi permetta di leggere temperatura e umidità in ogni stanza e riporti i valori corrispondenti, al centro della stanza realizzata sulla pagina web. Quindi il primo step per me sarebbe quello di mettere insieme più sensori (quattro nello specifico) in modo da leggere i valori per ogni stanza. Questo perché avendo le camere da letto a nord e la cucina (con il termostato) a sud, ho dei valori sfalsati nella lettura della temperatura e quindi devo sempre agire manualmente sulla caldaia per riscaldare anche le camere da letto. Ho già le termovalvole ai termosifoni, il secondo step sarebbe mettere delle elettrovalvole ai collettori dei termosifoni per accendere i termosifoni nella stanza dove ritengo ci sia più freddo e quindi risparmiare anche sul costo di energia. Il terzo step che vorrei realizzare, sarebbe l'attivazione automatica di tutto questo: cioè quando il sensore rileva una temperatura sotto la soglia, accende la caldaia e porta la stanza a temperatura. Contemporaneamente se il sensore di umidità rileva un aumento di valore (se la temperatura aumenta si genera dentro la stanza un differenziale tra il caldo interno e un freddo esterno e genera umidità/condensa) potrebbe accendere o il deumidificatore o lo scambiatore d'aria. Ovviamente tutto modificabile anche in maniera manuale, agendo magari con un tablet sui tastini di aumento e riduzione set, attivi sulla pagina web.
    Cosa ne pensi? E' una cosa fattibile anche per un neofita come me?!
    Spero di essere stato chiaro....
    Io attualmente ho arduino e per completare almeno il primo step, vorrei comprare i 4 sensori per verificare la fattibilità della lettura, stanza per stanza, con output direttamente sulla pagina web.
    Hai consigli? Suggerimenti? Tutto sarà prezioso!
    Grazie ancora per la tua disponibilità e per la tua condivisione, non è da tutti. Scusa per la lungaggine del post.

    RispondiElimina
  21. ciao daniele io ho provato a fare un test con il tuo sketck su un arduino nano
    funziona pero i valori del set mi si spostano soli e con i tasti non sempre funzionano
    mi sapresti dare qualche spiegazione
    grazie attendo una tua risp

    RispondiElimina
    Risposte
    1. Ciao Angelo, verifica il collegamento dei tasti, hai un altro Arduino su cui provare?

      Elimina
  22. Daniele, grazie per il tuo progetto, mi interessa perchè vorrei sostituire un classico controller di umidoità mh13001 che ha (tutti lo hanno) problemi di calibrazione quando si imposti una correzione negativa (togliendo alimentazione inserisce valori casuali nelle correzione)...Mi chiedevo, hai pensato alla possibilità di inserire un valore di correzione della lettura del sensore?
    Grazie ancora

    RispondiElimina
    Risposte
    1. ciao, é sufficiente sommare la correzione alla variabile che contiene il valore di umidità.

      Elimina
  23. buongiorno Daniele, mi chiamo Mauro e stò provando a realizzare questo interessantissimo progetto pre la mia serra. ho fatto tutto, scaricato la libreria come da istruzioni tue, scompattata, rinominato la cartella in DHT, e copiate nella cartella libraries ma quando compilo ( Arduino Vers. 1.6.13 )micompare inesorabilmente questo messaggio di errore Arduino:1.6.13 (Windows 7), Scheda:"Arduino/Genuino Uno"

    In file included from C:\Users\Mauro\Documents\Arduino\libraries\DHT\DHT_U.cpp:22:0:

    C:\Users\Mauro\Documents\Arduino\libraries\DHT\DHT_U.h:25:29: fatal error: Adafruit_Sensor.h: No such file or directory

    #include

    ^

    compilation terminated.

    exit status 1
    Errore durante la compilazione per la scheda Arduino/Genuino Uno.

    Mi puoi aiutare..... Grazie in anticipo.

    RispondiElimina
    Risposte
    1. ciao, forse hai scompattato una cartella dentro l'altra sotto "libraries". nel senso che hai 2 cartelle DHT una dentro l'altra. oppure puó esserci un'incompatibilità tra versioni di Arduino (io ho usato la 1.0.5 , la trovi sul sito arduino.cc tra le vecchie versioni) fammi sapere, ciao!

      Elimina
    2. Risolto..... Grazie. ho scaricato la versione 1.0.5 e ora funziona, devo però mettere un Delay alla fine del Loop come Ivan Lelli per lo stesso suo problema. Grazie ancora.

      Elimina
  24. ciao io vorrei eseguire questo progetto ma purtroppo o un display a matrice come posso fare

    RispondiElimina
  25. Ciao Daniele, questo progetto è proprio quello che stavo cercando ! Premesso che sono un neofita di Arduino e di elettronica, potresti aiutarmi,ho fatto tutto, scaricato la libreria come da istruzioni tue, scompattata, rinominato la cartella in DHT, e copiate nella cartella libraries ma quando compilo ( Arduino Vers. 1.0.5 )mi da :
    Errore durante la compilazione.
    In file included from C:\arduino-1.0.5-r2\libraries\DHT\DHT_U.cpp:22:
    C:\arduino-1.0.5-r2\libraries\DHT\/DHT_U.h:35: error: expected class-name before '{' token
    C:\arduino-1.0.5-r2\libraries\DHT\/DHT_U.h:38: error: 'sensors_event_t' has not been declared
    C:\arduino-1.0.5-r2\libraries\DHT\/DHT_U.h:39: error: 'sensor_t' has not been declared
    C:\arduino-1.0.5-r2\libraries\DHT\/DHT_U.h:47: error: expected class-name before '{' token
    C:\arduino-1.0.5-r2\libraries\DHT\/DHT_U.h:50: error: 'sensors_event_t' has not been declared
    C:\arduino-1.0.5-r2\libraries\DHT\/DHT_U.h:51: error: 'sensor_t' has not been declared
    C:\arduino-1.0.5-r2\libraries\DHT\/DHT_U.h:73: error: 'sensor_t' has not been declared
    C:\arduino-1.0.5-r2\libraries\DHT\/DHT_U.h:74: error: 'sensor_t' has not been declared
    C:\arduino-1.0.5-r2\libraries\DHT\DHT_U.cpp:35: error: variable or field 'setName' declared void
    C:\arduino-1.0.5-r2\libraries\DHT\DHT_U.cpp:35: error: 'sensor_t' was not declared in this scope
    C:\arduino-1.0.5-r2\libraries\DHT\DHT_U.cpp:35: error: 'sensor' was not declared in this scope



    Mi puoi aiutare..... Grazie in anticipo.

    RispondiElimina
    Risposte
    1. Molto strano, prova ad installare la libreria con la funzione del menu di Arduino. Ciao!

      Elimina
    2. Scusa Daniele per il disturbo sono due giorni che sto provando ,forse ho sbagliato qualche passaggio ,mi potresti spiegare come intendi installare la libreria del menu di arduino.
      Se provo fare il test dh11 non mi da problema non capisco perchè quando coppio lo sketch che hai postato mi dia quel problema.

      grazie e scusa del disturbo.

      Elimina
  26. Buonasera mi chiamo Marco,complimenti per il sito, molto utile, avrei bisogno di costruire questo interessante progetto,che sarebbe per uno scaldino fatto con del filo resistivo con temperatura controllata tramite relè con un min e max con un paio di gradi di margine,quindi questo progetto credo dovrebbe fare il caso mio,vorrei sapere se quel sensore temp/umidità non avendo bisogno di misurare l'umidità ma solo la temperatura puo essere usato lo stesso,con lo skecth da lei proposto se cosi non fosse potrebbe illuminarmi?grazie anticipatamente.

    RispondiElimina
  27. Buonasera Daniele,
    testando lo sketck si presenta questo errore (essendo neofita nn saprei come risolvere:
    ////////
    C:\Users\pietr\Documents\Arduino\prog_salame\sketch_salame_1\sketch_salame_1.ino: In function 'void loop()':

    sketch_salame_1:36: error: 'tsu' was not declared in this scope

    statotsu = digitalRead (tsu);

    ^

    exit status 1
    'tsu' was not declared in this scope

    ////////////

    Saprebbe darmi qualche suggerimento? Abbiamo realizzato il circuito ma lo sketch nn gira.
    Grazie

    RispondiElimina
  28. Ciao, l'errore indica che non hai dichiarato la variabile "tsu" che stai utilizzando.

    RispondiElimina
  29. Caro Daniele,
    Vorrei utilizzare il tuo sketch per regolare la temperatura e umidità nel mio rettilaio ma dato che questo è il mio primo progetto con Arduino e vorrei inserire degli altri sensori mi farebbe comodo risparmiare qualche pin.
    Potresti dirmi cosa devo cambiare???
    Grazie!!!

    RispondiElimina
  30. Ciao Daniele,
    Grazie per aver condiviso questa interessante applicazione. Volevo chiederti nel caso in cui venga a mancare la corrente in rete (supponendo di alimentare Arduino con un trasformatore ) e poi ritorni cosa succede alla temperatura impostata? Eventualmente quale sarebbe il modo più semplice affinché il dispositivo, una volta tornata la rete, riprenda il valore di temperatura di quando è saltata? Forse una regolazione di T set tramite potenziometro?...attendo tuoi preziosi consigli.
    Grazie
    Ciao
    Alen

    RispondiElimina
    Risposte
    1. Ciao Alen, spegnendo la temperatura impostata si resetta, potresti memorizzare il dato nella EEPROM di Arduino, una memoria che non si resetta spegnendo la scheda.

      Ciao,
      Daniele

      Elimina
  31. ciao daniele, stavo provando a fare questo progetto usando un lcd keypad, ma non riesco a definire i pulsanti...potresti aiutarmi?

    RispondiElimina
  32. ciao Daniele.ho un problema con il tuo progetto.sembra che ogni volta che arduino legge la temperatura i set si azzerino.hai qualche dritta?grazie e complimenti.

    RispondiElimina

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

Altri Post