ESP8266 e DHT11: monitoraggio umidità e temperatura e invio dei dati ad un DB MySql remoto

Il progetto realizza una stazione di monitoraggio dell'umidità e della temperatura basata su una scheda ESP8266 NodeMCU interfacciata con il sensore DHT11. La scheda, collegata ad Internet tramite il modulo WiFi integrato, invia i dati rilevati ad un database MySql remoto

schemagenerale

  • La scheda, ad intervalli regolari di tempo (ad esempio ogni 15 minuti), tramite il sensore DHT11 rileva l'umidità H e la temperatura T ed invia i dati, con un richiesta HTTP GET, ad uno script PHP del server remoto (applicazione Web Client Arduino Ide 'rileva_ht.ino')
  • Sul server, lo script PHP destinatario della richiesta recupera i valori inviati da ESP8266 NodeMCU e li inserisce in un database MySql remoto ('registra_ht.php')
  • Una pagina web sul server remoto, accessibile da qualsiasi parte del mondo, legge i dati memorizzati nel database e li presenta sotto forma di tabelle e grafici ('displaydati_ht.php')

Scarica il progetto completo

Vai alla pagina dei downloads Categoria: Arduino ESP8266 IoT

 

Codice sketch Arduino Ide rileva_ht.ino

/* Prof. Mauro De Berardis 2021
 * ----------------------------------------------------------------------------------------- 
 * Il progetto realizza una stazione di monitoraggio basata su una scheda ESP8266 NodeMCU 
 * interfacciata con un sensore  DHT11. La scheda, collegata ad Internet
 * tramite il modulo WiFi integrato al suo interno,  ad intervalli regolari di tempo rileva  umidità H  
 * e temperatura T  e invia i valori letti ad un database MySql remoto. 
 */
#include <ESP8266WiFi.h> //permette la connessione della scheda  alla rete WiFi 
#include <ESP8266HTTPClient.h> 
 
#include <DHT.h>      //libreria necessaria per utilizzare il sensore DHT11
#define sensorePin D3 
// pin di ESP8266 NodeMCU collegato all'uscita (pin OUT) del sensore DHT11
#define tipoDHT DHT11
/* definisce il tipo di sensore della famiglia DHT:  in questo caso viene selezionato   
   DHT11, ma esistono sono altri sensori quali DHT21 e DHT22 
*/
DHT dht(sensorePin,tipoDHT);  //Istanzia l'oggetto dht della classe DHT    
float h;          //umidità   
float t;         //temperatur
#define Led1 D1       // Led verde
#define Led2 D2       // Led rosso
//***Configurazione WiFI: impostazione delle credenziali di rete
const char* ssid = "mySSID";        //Inserire qui l'SSID
const char* password = "myPassword"; //Inserire qui la password WiFi
//WiFiClient  client;
 
unsigned long time_last = 0;        // time ultima rilevazione
unsigned long time_current;         // time corrente
const long interval = 900000;           
// fisso l'intervallo tra una rilevazione e l'altra ad esempio a 15 minuti
// 900000ms = 9000s=15 minuti 
 
 
void setup() 
{
  delay(1000);
 
  pinMode(Led1,OUTPUT);
  pinMode(Led2,OUTPUT);
 
  // apre una connessione seriale. A scopo di debug inviamo messaggi al monitor seriale
  Serial.begin(115200); 
  WiFi.begin(ssid, password);   //Si connette al router WiFi
  Serial.println("Connessione al WiFi in corso..");
  while (WiFi.status() != WL_CONNECTED) 
  {
      delay(500);
      Serial.print(".");
  }
  Serial.println("");
  Serial.print("ESP8266 NodeMCU connessa alla rete WiFI: ");
  Serial.print(ssid);
  Serial.print("  con il numero IP : ");
  Serial.println(WiFi.localIP());//l'IP di ESP8266 viene assegnato dal DHCP
  Serial.println();
  digitalWrite(Led1, 1); // si accende il led 1 che indica che il Wifi è attivo 
  delay(500);
  rileva_invia();
  // chiamata alla funzione che rileva umidità H e temperatura T  e invia i dati allo script 
  // PHP  del server remoto con una richiesta HTTP GET
 
} //----chiude setup()------------------------------------------------------------------
 
void loop()
{
  time_current = millis();
  if (time_current - time_last >= interval) // se è trascorso il tempo impostato in interval  
  {
    time_last = time_current; // aggiorno il time ultima rilevazione   
    rileva_invia(); 
    // chiamata alla funzione che rileva umidità H e temperatura T  e invia i dati allo script 
    // PHP  del server remoto con una richiesta HTTP GET
 
    // il led 2 si accende per 2 secondi  segnalando che è stata fatta una lettura
      digitalWrite(Led2, 1);  
      delay(2000);
      digitalWrite(Led2, 0);
  }
}
 
void rileva_invia()
{
   // faccio 3 letture in modo che i valori letti dal sensore DHT11 , che non è velocissimo,      
   // si stabilizzino 
   for(int i=0;i<3;i++)
    { 
        h = dht.readHumidity();     // Lettura dell'umidità  
        t = dht.readTemperature();  // Lettura della temperatura in gradi Celsius 
        delay(300);
    } 
    if (isnan(h) || isnan(t))  //Verifica se  si presenta un errore di lettura   
    {  
          Serial.println("Errore di lettura...");  
          h=0.0;
          t=0.0;
    }    
    String s="Umidità= "+String(h)+"     Temperatura="+String(t);
    Serial.println(s);
    String s2=String(h)+"#"+String(t)+"#";
    HTTPClient http;    //Dichiara l'oggetto http della classe HTTPClient
    String  richiestaHTTP, link,risposta;
    richiestaHTTP = "?h=" + String(h)+"&t="+String(t); 
    // querystring da inviare nell'URL della richiesta HTTP GET
 
    // utilizzo un server di hosting remoto ad esempio www.maurodeberardis.it
    // link= "http://www.maurodeberardis.it/CodiciPHP/registra_ht.php"+richiestaHTTP;
 
     // utilizzo un server WAMP su un pc con IP 192.168.1.3
       link = "http://192.168.1.3/prove/registra_ht.php"+richiestaHTTP; 
 
      http.begin(link);           //Specifica la destinazione della richiesta HTTP GET
 
      int httpCode = http.GET();  //Invia la richiesta HTTP GET
 
      if (httpCode==HTTP_CODE_OK) 
      {
 
          risposta= http.getString(); //Ottiene la risposta dal Server
          Serial.print("HTTP code: ");
          Serial.println(httpCode);
          Serial.println("Dati salvati correttamente sul DB remoto"); 
 
      }
      else 
      {
          Serial.println("Errore");
          Serial.print("HTTP code: ");
          Serial.println(httpCode);
          Serial.println(link);
          Serial.println();
      }   
}