Nodemcu (Esp8266) e DHT22 (am2302) : Sensore di temperatura e umidità wifi con server web

In questo articolo faremo dialogare il nostro NodeMcu con il sensore di temperatura e umidità DHT22.
I dati raccolti verranno mostrati in una semplice pagina web, ma prima dovremo configurare il NodeMcu in modo da collegarsi ad un Access point.

NodeMcu + Dupont + dht22 am2302 + breadboardCosa ci serve:

  • Modulo Esp8266 con Firmware NodeMcu
  • Sensore di temperatura e umidità DHT22 (chiamato anche AM2302)
  • Breadboard
  • Dupont wire maschio-maschio

Supponiamo di volerci connettere ad un Access Point con questa configurazione:

  • Nome rete (SSID): CASA
  • Password di rete: PassSegreta

 

Il DHT22

Il DHT22 è un sensore di temperatura e umidità molto versatile, infatti a tensione di alimentazione va da 3.3 a 5v.
Questo dispositivo permette di rilevare valori di umidità relativa da 0 a 100% con risoluzione dello 0.1% e temperature che vanno da -40 a +80°C con risoluzione di 0.1°C
Il DHT22 utilizza solo un filo per comunicare con il microcontrollore (lungo fino a 100m), sono necessari tuttavia altri 2 fili per alimentarlo.

 

Collegare il DHT22 al NodeMcu

Passiamo ai collegamenti, disponiamo il NodeMcu e DHT22 come in figura.
Completiamo quindi il circuito elettrico collegando con i dupont maschio-maschio sempre come in figura:

NodeMcu + DHT22

Iniziamo a programmare lo script in Lua

Dichiariamo che collegheremo il pin D2 del NodeMcu al pin Data del DHT22.
Quindi configuriamo la connessione alla wifi impostando il NodeMcu in modalità Station, passando i parametri di connessione alla wireless e richiedendo un indirizzo Ip. Creiamo un file chiamato init.lua e incolliamoci il codice che segue:
(init.lua è il file che viene lanciato in automatico all’avvio del microcontrollore)

-- Collego a D2 = GPIO 4 il pin Data del DHT22
pin = 2

-- setto il modulo wifi in station mode
print("AVVIO WIFI")
wifi.setmode(wifi.STATION)
-- setto i parametri di connessione alla rete
wifi.sta.config("CASA","PassSegreta")

-- Verifico connessione, poi stampo in seriale info rete
tmr.alarm(0, 5000, 1, function()
   if wifi.sta.getip() == nil then
      print("Connessione alla Wifi...\n")
   else
      ip, netmask, gateway=wifi.sta.getip()
      print("Info Rete: \nIP: ",ip)
      print("Netmask: ",netmask)
      print("Gateway: ",gateway,'\n')
      tmr.stop(0)
   end
end)

Una spiegazione dettagliata sulla connessione alla Wifi è disponibile qui: Come collegare Nodemcu (Esp8266) alla wifi

Procediamo quindi alla creazione di un webserver che accetti una connessione da un browser e ne restituisca i dati di temperatura e umidità rilevati dal DHT22



 -- Avvio di un server web
srv=net.createServer(net.TCP)
srv:listen(80,function(conn)
    conn:on("receive",function(conn,payload)
    -- mostro richiesta del browser nella seriale del NodeMcu (Debug)
    print(payload)
    -- Chiedo al DHT22 temperatura e Umidità 
    status,temp,humi,temp_decimial,humi_decimial = dht.readxx(pin)
    if( status == dht.OK ) then
        print( "\nDati ricevuti dal DHT:\nTemperatura:"..temp.."."..temp_decimial); 
        print( "\nUmidita:"..humi.."."..humi_decimial);
        conn:send("<h1>Dati ricevuti dal DHT:</h1> &ltp>Temperatura:"..temp.."."..temp_decimial.."°C</p> <p>Umidita:"..humi.."."..humi_decimial.."%</p>")
    elseif( status == dht.ERROR_CHECKSUM ) then
        print( "DHT Errore Checksum" );
        conn:send("<h1> Hello, NodeMCU!!! </h1>")
    elseif( status == dht.ERROR_TIMEOUT ) then
        print( "DHT Time out." );
	 conn:send("<h1> Hello, NodeMCU!!! </h1>")
    end
  
  end)
  conn:on("sent",function(conn) conn:close() end)
end)

Alla fine otterremo dalla seriale un output simile a questo:

AVVIO WIFI
> Info Rete: 
IP: 	192.168.123.4
Netmask: 	255.255.255.0
Gateway: 	192.168.123.254

quindi apriamo un browser e inseriamo l’indirizzo ip dato dal NodeMcu:

Il browser invierà una richiesta al NodeMcu.
Il NodeMcu grazie all’istruzione di debug print(payload) ci restituirà la struttura della chiamata:

GET / HTTP/1.1
Host: 192.168.123.4
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: it-IT,it;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Cache-Control: max-age=0

Il NodeMcu reagirà alla richiesta del browser interrogando il DHT22 che restituirà il valore di temperatura e umidità sia in seriale

Dati ricevuti dal DHT:
Temperatura:22.700
Umidita:45.500

che sul browser in forma grafica:

browser outpt nodemcu wifi dht22

Riguardo Matteo Dalle Feste

Web Designer e Developer presso una nota testata giornalistica sul turismo. Appassionato di domotica, nel tempo libero, cura la realizzazione sia hardware che software di piccoli progetti domotici fai da te.

Guarda anche

Codice sorgente

Come generare un firmware custom per Nodemcu (esp8266)

Ecco una semplice guida che spiega in pochi passi come generarci un firmware ad-hoc per …

25 Commenti

  1. Salve, complimenti per l’ articolo, premetto ch non ci capisco niente, io ho un dht11 al posto del 22 , per farlo funzionare basta che sostituisca questo numero nello script o c’è’ qualche altro dato da modificare? Sto cercando di imparare per arrivare a costruire un comando di accensione e spengimento per la caldaia tramite un relè e che una volta eccitato il relè mi venga restituito sul altro piedino del ESP l’ informazione dell’ avvenuta commutazione. non so se mi può’ aiutare comunque la ringrazio per il suo lavoro che mi è’ molto interessante e spiegato bene.

    • Salve Luciano e grazie a te per avermi scritto, fa piacere avere un feedback 🙂
      Il manuale del Nodemcu, sotto la libreria DHT spiega che è collegabile uno di questi sensori:
      DHT11, 21, 22, 33, 44

      Link al manuale: https://nodemcu.readthedocs.io/en/dev/en/modules/dht/
      quindi proverei a caricare lo script dell’articolo con collegato il DHT11, dovrebbe funzionare!
      Per la commutazione di relè cercherò di fare un articolo a breve, comunque per impostare un pin come output e pilotarne lo stato basta usare questo pezzetto di codice:

      
      -- Seleziono il pin
      pin=1
      -- dichiaro il pin come output
      gpio.mode(pin, gpio.OUTPUT)
      -- imposto il valore del pin
      gpio.write(pin, gpio.HIGH)

      A presto
      Matteo

  2. Ciao Matteo, volevo chiederti un aiuto per quanto riguarda il nodemcu e il dht22, mi potresti dare una mano? Grazie

  3. giuseppe traversa

    Buon giorno sono un neofita,ma appassionato di arduino da un anno,ho settantanni e ho voglia di imparare.
    Comunque complimenti per l’articolo è molto interessante e sto cercando di seguire questo questo progetto.Ho un nodemcu(Esp8266) e un dht11 ,il mio problema è non so come caricare lo script al nodemcu.Con arduino compilavo lo sketch e lo caricavo tramite cavetto usb e conoscendo la com a cui è collegato mentre lo script in lua come dovrei lanciarlo se la console di lua non mi dice la porta a cui è collegato il nodemcu.Spero di essere stato chiaro. Vi ringrazio per una vostra risposta. Giuseppe

    • Buongiorno Giuseppe!
      Per quanto riguarda lo scripting in LUA è possibile usare “ESPlorer” o “NodeMcu Studio”
      Esiste un’ulteriore strada ed è quella di usare l’IDE di Arduino che è già abituato ad usare (in questo caso sarà necessario riscrivere il codice LUA in linguaggio “C” ).

      Prossimamente farò una guida proprio sulla configurazione dell’IDE di Arduino per scrivere gli ESP8266 / NodeMcu

  4. giuseppe traversa

    salve sono ancora io,ho riscontrato un altro ostacolo,stavo compilando lo script e alla dicitura :wifi.setmode(wifi.STATION) ottengo errore :attempt to index a nil value (global wifi). Mi può aiutare a risolvere questo dilemma? Grazie

  5. giuseppe traversa

    grazie per le risposte, io ho un PC con sistema operativo a 32 bit e navigando ho letto che ESPlore è a 64 bit non so NodeMCU STUDIO se va bene al caso mio.Continuerò a seguire le sue guide.Ancora grazie

  6. giuseppe traversa

    Salve Matteo,ho ancora qualcosa da chiedere, ho installato i firmware che hai proposto, ho installato anche ESPlorer ,ma quando collego il nodemcu al pc e apro ESPlorer non mi riconosce la porta com a cui è collegato il mcu.Ho fatto qualche errore? ho eseguito alla lettera il procedimento di installazione.Per favore aiuto!!!
    Grazie

  7. giuseppe traversa

    Salve Matteo, ho risolto il mio problema era una impostazione sbagliata di esplorer.Quindi tutto ok , i risultati di temperatura e umidità si evidenziano.
    Approfitto per chiederti se posso sostituire il dht con sensore di corrente tipo sch013 e come memorizzare i dati su una pagina web e se c’è qualche link su cui posso studiare e informarmi.Grazie Giuseppe

    • Salve Giuseppe, sono contento che abbia trovato la soluzione autonomamente. Per il sensore di corrente bisogna usare l’ADC dell’ esp8266 e adattare il segnale in ingresso (esp8266 accetta segnali da 0 a 1v, mentre il NodeMcu dovrebbe avere un partitore che permette di gestire segnali da 0 a 3.3v).
      Per spedire i dati potrebbe essere lanciata una chiamata di tipo GET verso un sito es. test.com/registra.php?temp=12.0&humid=89.7
      la pagina registra.php dovrebbe ricevere i parametri e creare una query che scrive i valori in un database.
      Una pagina tipo vedi.php potrebbe fare una query e mostrare una tabella con i valori registrati.

      Magari faccio un articolo prossimamente!

  8. giuseppe traversa

    magari sarà interessante.Grazie

  9. ciao
    mi piacerebbe sviluppate un piccoli progetto tra due esp8266 dove il primo schiaccio un interruttore e l altro accendo un led
    potete aiutarmi
    grazie mille

    • Ciao Marco,
      ci sono diversi modi di creare questo progetto.
      Hai due esp8266 e puoi configurarli cosi:

      Opzione A)
      gli esp8266 si appoggiano a un access point e per semplificare imposti degli indirizzi statici ai dispositivi.

      Opzione B)
      configuri un esp come stazione e l’altro come client wifi, anche qui potresti valutare un indirizzo statico per semplificare

      poi in entrambi i casi il trasmettitore potrebbe rilevare la pressione di un tasto e inviare una chiamata GET al dispositivo ricevente che la elabora e fa scattare un eventuale relè

  10. salve, ottimo articolo! sono riuscito a fare tutto, solo che ho un poccolo problemino:
    a me esce Temperatura, come posso nascondere “” ?
    sarebbe possibile far avviare automaticamente lo script all’accensione dell’ esp?
    grazie!

    • Salve Attilio,
      Per far avviare in automatico uno script bisogna chiamare il file init.lua
      Se non esce il valore della temperatura verifica i collegamenti, esegui un reset, attindi qualche minuto.
      Che sensore di temperatura stai usando? DHT22 o altri?

  11. Buongiorno. Articolo utile, sono interessato a controllare la temperatura e l’umidità di diverse camere come dovrei fare? Inoltre vorrei anche avere un sensore wi-fi di finestra aperta, per ogni camera come fare e quale mi suggerisci? Grazie.

    • Buongiorno Salvatore.
      Dove intende visualizzare i dati raccolti? perchè se l’utilizzo è domotico ci sono diverse opzioni più o meno complesse.
      Partendo come base di partenza un Raspberry con OpenHab installato (Installare OpenHab su RaspberryPi) si può:
      1) costruire un dispositivo RFLink Gateway e collegarlo al Raspberry (vedi link Installare RFLink Gateway) e farsi trasmettere le info da dispositivi via radio a 433Mhz. Nella lista dei dispositivi compatibili ho trovato dei modelli della Kerui che trasmettono sia l’apertura che la chiusura di una porta.
      2) per una versione WIFI del progetto potrebbe essere utile seguire questa guida CiaoBit Home e adattare il codice alla sua necessità, quindi monitoraggio ambientale e sensore porta (con i sensori magnetici classici)

      • Grazie per la risposta immediata. L’idea è un controllo di temperature ed umidità per ogni camera con esp8266 wifi con indicato per ogni camera se la finestra è aperta. Il tutto da visualizzare su pc, tablet e iphone, così dovunque mi trovo posso visualizzare i dati. Da utilizzare poi con un controllo caldaia per riscaldamento con valvole termostatizzabili per ogni termosifone da controllare con iphone sigolarmente. Spero di essere stato chiaro. Si accettano consigli e critiche. Grazie.

        • Quindi serve un sistema che raccoglie e presenta i dati anche all’esterno della rete domestica. Andrei di OpenHab e una delle 2 opzioni descritte qui sopra.

          • Quindi con lo stesso nodemcu di una camera, posso inviare alla rete domestica i dati (temperatura e umidità), insieme al segnale “finestra aperta”? Quale sensore “finestra aperta” senza fili mi consigli?

          • Ad un solo NodeMcu puoi far fare piú cose. Dai un occhio ai link che ti ho mostrato nel post precendente. Per quanto riguarda invece i sensori già fatti (soluzione alternativa)
            quelli che dialogano via 433Mhz (non wifi) puoi cercare i kerui D026 che fanno parte di alcuni sistemi di allarme cinese.

  12. Complimenti Matteo, sto cominciando ad interessarmi un po a questi argomenti ed ho trovati i tuoi articoli veramente istruttivi: chiari, semplici ed essenziali. Avrei una curiosità in merito a questo progetto: è possibile secondo te collegare più sensori dht22 allo stesso esp8266 e se si, come?
    Mi rendo conto che l’argomento qui è stato trattato diverso tempo fa (forse arrivo un po in ritardo :-)) ma se vorrai rispondermi te ne sarei grato.
    Complimenti ancora.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *