[Arduino LAB] Controllo ventilatore con sensore temperatura

 

L’ultimo arduino lab era di qualche tempo fa, ricordate? Quello che viene proposto oggi è concettualmente molto simile, con l’ eccezione che è stato inserito un sensore di temperatura e un ventilatore domestico.

Il pilotaggio avviene sempre attraverso dei relè, che questa volta sono montanti su una apposita shield esterna.

Lo schema del circuito realizzato è il seguente:

I componenti

Il sensore

Il sensore di temperatura utilizzato è un DHT11 a 4 pin montato su una scheda dotata di 1 led e qualche resistenza per adattamento del segnale. Il sensore viene alimentato con una tensione di 3.3 volt recuperabile dal pin 3v3 dell’arduino.

Il pin centrale è adibito alla trasmissione dei dati letti dal sensore.

Il sensore è abilitato a misurare due grandezze fisiche: l’umidità e la temperatura.

 

 

Scheda Relè 

 

La schield dei relè è composta da due relè a contatto sempre chiuso, azionabili da una tensione di 5 volt e alimentati da una tensione pari anch’ essa a 5 Volt.

La tensione consentita per i morsetti sottoposti al controllo è pari a 250 V AC e fino a 10 A di corrente.

Ventilatore

È un comune motore, che per semplicità abbiamo rappresentato nello schema fritzing con il componente “motore DC”, anche se in realtà non si tratta di un motore del genere.

Funzionamento e codice

Superata la temperatura di 30°C l’ arduino aziona il relè portandolo nella sua configurazione di default (sempre chiuso), questo permette l’azionamento del ventilatore collegato all’uscita del relè.

Quando la temperatura rilevata è minore di 30°C l’arduino eccita la bobina del relè che apre il circuito e di conseguenza interrompe l’azionamento del ventilatore.

Nel video si notano degli stacchi temporanei perchè non sono stati valutati possibili ritorni di corrente nelle letture, di conseguenza non stati utilizzati inseguitori per fini pratici.

Il codice  è stato prelevato online e modificato per l’occasione aggiungendo le righe dalla 107 alla 111.

//
// FILE: dht11_test1.pde
// PURPOSE: DHT11 library test sketch for Arduino
//

//Celsius to Fahrenheit conversion
double Fahrenheit(double celsius)
{
return 1.8 * celsius + 32;
}

//Celsius to Kelvin conversion
double Kelvin(double celsius)
{
return celsius + 273.15;
}

// dewPoint function NOAA
// reference: http://wahiduddin.net/calc/density_algorithms.htm
double dewPoint(double celsius, double humidity)
{
double A0= 373.15/(273.15 + celsius);
double SUM = -7.90298 * (A0-1);
SUM += 5.02808 * log10(A0);
SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ;
SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ;
SUM += log10(1013.246);
double VP = pow(10, SUM-3) * humidity;
double T = log(VP/0.61078); // temp var
return (241.88 * T) / (17.558-T);
}

// delta max = 0.6544 wrt dewPoint()
// 5x faster than dewPoint()
// reference: http://en.wikipedia.org/wiki/Dew_point
double dewPointFast(double celsius, double humidity)
{
double a = 17.271;
double b = 237.7;
double temp = (a * celsius) / (b + celsius) + log(humidity/100);
double Td = (b * temp) / (a - temp);
return Td;
}

#include

dht11 DHT11;

#define DHT11PIN 2
#define PIN 12

void setup()
{
pinMode(PIN, OUTPUT);
Serial.begin(9600);
Serial.println("DHT11 TEST PROGRAM ");
Serial.print("LIBRARY VERSION: ");
Serial.println(DHT11LIB_VERSION);
Serial.println();
}

void loop()
{
Serial.println("\n");

int chk = DHT11.read(DHT11PIN);

Serial.print("Read sensor: ");
switch (chk)
{
case DHTLIB_OK:
Serial.println("OK");
break;
case DHTLIB_ERROR_CHECKSUM:
Serial.println("Checksum error");
break;
case DHTLIB_ERROR_TIMEOUT:
Serial.println("Time out error");
break;
default:
Serial.println("Unknown error");
break;
}

Serial.print("Humidity (%): ");
Serial.println((float)DHT11.humidity, 2);

Serial.print("Temperature (oC): ");
Serial.println((float)DHT11.temperature, 2);

Serial.print("Temperature (oF): ");
Serial.println(Fahrenheit(DHT11.temperature), 2);

Serial.print("Temperature (K): ");
Serial.println(Kelvin(DHT11.temperature), 2);

Serial.print("Dew Point (oC): ");
Serial.println(dewPoint(DHT11.temperature, DHT11.humidity));

Serial.print("Dew PointFast (oC): ");
Serial.println(dewPointFast(DHT11.temperature, DHT11.humidity));

delay(2000);

if (DHT11.temperature < 30) digitalWrite(PIN, LOW); else digitalWrite(PIN, HIGH); } // // END OF FILE //

Il video

Vediamo il video:

Scusateci per la scarsa qualità delle riprese! Impariamo in fretta e faremo di meglio 🙂

Alla prossima

Riferimenti

Fonte codice 

Download libreria

[Download not found]

Vincenzo Cicogna on FacebookVincenzo Cicogna on GithubVincenzo Cicogna on LinkedinVincenzo Cicogna on TwitterVincenzo Cicogna on Youtube
Vincenzo Cicogna
Editore e autore di questo blog di notte, sviluppatore software per sistemi embedded di giorno, passa il suo tempo a dilettarsi ed approfondire le dinamiche del mondo.
Appassionato di droni e tuttala, si diletta di tanto in tanto a scattare qualche foto in giro per il mondo o a leggere qualche libro.
Ama viaggiare, fotografare e condividere le sue produzioni.
Tags:
By Vincenzo Cicogna | settembre 18th, 2012 | SHOW COMMENTS (19)

19 Responses

  1. Riccardo says

    Ragazzi e se invece di mettere un set point di temperatura nel FW io volessi variare il setpoint giorno per giorno da un LCD ?? se pò fa ? ….il mio progetto è il seguente: azionare tramite 2 relè due dispositivi a 12V uno per diminuire l’umidità e uno per aumentarla. Questi dispositivi si devono azionare e spegnere sulla base di un set point che vado ad impostare da un LCD. Aspetto vostre indicazioni grazie ragazzi 😀

  2. Dade L'eremita says

    Ciao,
    e se dallo stesso sensore volessi leggere l’umidità e con un certo valore attuare un umidificatore e con un certo altro attuare le stesse ventole che uso per abbassare la temperatura? sono neofita e già con questa semplice cosa vado in pallone…

    • Vincenzo Cicogna says

      Ciao,
      non ho ben capito la tua domanda, vuoi sapere un metodo per modificare l’umidità per tarare tutto il sistema?

      • Dade L'eremita says

        il sensore dht11 ti da due valori: umidità e temperatura. Il discorso temperatura è stato spiegato qui in questo topic; e se volessi leggere il dato umidita e sopra una certa soglia attivare due ventole (che poi sono quelle anche che vengono comandate dal sensore temperatura) in modo da diminuirla e al di sotto attivare un umidificatore. Non sono pratico di arduino e programmazione ma vorrei creare un terrario con umidità, temperatura e luce controllati da arduino, sensori e relè che attuano due ventole, un umidificatore e delle lampade a risparmio.

        • Vincenzo Cicogna says

          Per leggere l’umidità, utilizzando la libreria a cui facciamo riferimento la variabile è la seguente: DHT11.humidity, il comando di lettura Serial.println((float)DHT11.humidity, 2);
          Questo lo stampa sulla seriale e puoi vederlo da un terminale esterno.

          • Dade L'eremita says

            Per il resto uso lo stesso codice che hai scritto qui sopra anche per automatizzare l’umidificatore giusto?

          • Vincenzo Cicogna says

            Si il codice è utilizzabile anche per l’umidificatore.

          • Dade L'eremita says

            Altra domanda…le scritte in corsivo non sono considerare come parte integrante del codice vero?

          • Vincenzo Cicogna says

            Tutto ciò che è preceduto da “//” sì sono solo dei commenti,

          • Dade L'eremita says

            ho provato a copiare ed incollare il tuo codice però quando faccio verifica mi dice “dht11” does not name a type.

          • Vincenzo Cicogna says

            Dovrei verificare il codice, può essere che nelle varie versioni arduino sia cambiato qualcosa.
            Che Arduino hai?

          • Dade L'eremita says

            Arduino uno

  3. didac says

    ciao, ho dato un’occhiata alla fonte del codice , sembra che sia sbagliato.
    Il progetto è bellissimo,sono giorni che cerco su internet, ora che ho trovato questo, peccato, sarebbe stato una svolta per la mia serra, se riuscite ad apportare correzioni sareste dei grandi.
    Ho rifatto il tutto ma continua a non essere assolutamente eseguibile, mi spiace, spero in una vostra risposta a riguardo!!! saluti DIDAC

    • Automazione Open Source
      automazioneos says

      In cosa è sbagliato di preciso il codice? Che errore ti viene riportato? Ho provato a fare la verifica del codice(non ho l’Arduino al momento con me) e, con il codice postato, la libreria allegata all’articolo e la versione dell’IDE che ho sul PC (Arduino 1.0 per Linux) non ho avuto alcun problema….e quali sarebbero i problemi relativi al disegno del circuito?

      • didac says

        ciao sono di nuovo io didac:

        ho ricompilato da capo il codice pubblicato;

        sono sicuro ci sono una miriade di errori, per esempio ..

        int chk = DHT11.read(DHT11PIN );mi dice-error: expected declaration befor’}’ token.

        è tutto cosi’ dall’inizio alla fine, qualcosa l’ho corretto ma ora sono completamente fermo, incapace di proseguire!!!Lascia perdere il circuito che tanto quanto si intuisce(anche se praticamente illeggibile, in quanto ha una definizione bassa e risulta sfuocato) ma chi se ne frega.
        il problema è il codice, ho fatto varie prove di confronto con ad esempio la fonte(che non riesco a capire in quanto setup non è menzionato)come si fa??
        è la prima volta che mi inbatto in un codice cosi’ strano!!!
        aiutoooooooooooooo!!!!!!!!!

      • didac says

        buongiorno,

        io ho un 2560 mega, uso window 7,quando faccio verifica,dice che-if (DHT11.temperature < 30) non è dichiarato il pin?? aprendo il monitor seriale ce solo la scritta error.Premetto che sono un principiante, mi servirebbe aiuto praticamente in tutto! lo schema ha errori nel collegamento del relay ad arduino,

        in cosa sbaglio?
        ha a che fare col fatto che tu usi linux?
        la libreria l'ho scaricata, installata, ma nella compilazione a me risulta sutto in errore!
        cosa debbo fare ? scusa la rottura di scatole,tu te la cavi da dio, mentre io sono un povero ignorante, che posso fare? tu mi dirai- va a vendere patate!!!!!

        • Vincenzo Cicogna says

          Ciao didac, manda un email ad automazioneos@gmail.com, con il tuo codice! Cercheremo di aiutarti.

  4. vincenzo says

    Ciao, dove posso comprare lo shield che usi in questo progetto? io vorrei realizzare un controllo di temperatura per acquario che piloti ventole e riscadatore.
    Ciao e grazie,
    Vincenzo

    • didac says

      ciao, sono un’ utente che ha provato di eseguire il il codice, ma vedo che è totalmente sbagliato!
      anche il disegno del circuito è sbagliato! cosa si puo fare??
      potete aiutarmi???
      potete rivedere completamente il tutto e ripubblicare da capo???
      grazie, aspetto con ansia una vostra risposta!!!!