Come leggere la temperatura ambientale con Arduino - parte seconda

Jun 14, 2020

Lo leggi in 7 minuti

Seconda parte del post su come monitorare la temperatura con Arduino e creare il vostro primo prodotto commerciale, da installare prezzo terzi con profitti interessanti.

Come leggere la temperatura ambientale con Arduino - parte seconda


In questo post vedremo come collegare una scheda ESP8266 alla rete Wifi e come inviare una email di avviso in modo automatico.

I componenti che ci serviranno per la realizzazione:

Per questo prodotto dovrai usare la versione “Wifi” di Arduino, commercialmente ESP8266. La useremo insieme alla eccellente libreria ESP8266WiFi che ne permette una facile connessione alle reti wireless.


Come avrai notato, noi insistiamo molto sulla parte “profittevole” dei progetti, perchè vogliamo avvicinare le persone alla domotica non solo per farne un hobby, ma soprattutto per aiutarle a costruire una professione moderna e redditizia.

Ricorda che grazie ad Arduino puoi sempre fare pagare la tua assistenza fisica, mentre se vuoi occuparti solo di software, il tuo lavoro è sempre più minacciato dai maxi call center attrezzati con teleassistenza.

I costi dei call center si abbassano continuamente per la presenza di lavoratori di paesi extra UE, poco qualificati ma con basse retribuzioni; produrre e assistere solo “software” vuol dire lanciarsi in una corsa al ribasso sui prezzi.



Ma torniamo a bomba al nostro progetto fisico: ti consiglio sempre di usare un contenitore professionale o un Arduino blindato come mostriamo in questa questa pagina del blog e ciò per motivi di immagine e di sicurezza. I costi non solo alti ma per il primo prototipo potresti ricavare il box da una scatola di derivazione elettrica, con il sensore DHT11 o DHT12 incollato con colla a caldo sull’esterno. La connessione dei componenti è infatti semplicissima:




Per iniziare la costruzione segui il semplice schema in figura, collega alimentazione e massa e ricorda che il DHT11 deve fornire il segnale alla porta 7 di Arduino. Dai potenza solo dopo avere controllato tutte le connessioni e quindi collega Arduino alla porta USB del PC. Se non sai come installare l’IDE di Arduino leggi questo post del blog.
Per funzionare il nostro programma ha bisogno di usa serie di dati sensibili che non possiamo condividere su github.com e per questo dovrai creare manualmente un file di appoggio.

Fai “NUOVO” sull’IDE di Arduino e incolla il codice qua sotto e poi aggiornalo con i valore reali di Wifi, email, etc.

il file credentials.h dove inserire le password:

#define WIFI_SSID          "Nome della rete Wifi";
#define WIFI_PASSWD        "Password della rete wifi";
#define EMAIL_MITTENTE     "La mail che usi per inviare";
#define PASSWORD_EMAIL     "La password del tuo account email";
#define EMAIL_DESTINATARIO "La email cui arrivano gli avvisi";

Se usi GMAIL ricorda di non usare mai il tuo account personale e neppure quello del tuo Android: è consigliabile crearne uno solo per la domotica e per fare sperimentazioni. Devi solo modificare i valori le virgolette “” e ricordare che: non devi chiedere la password della email del cliente. Ti serve solo sapere a quale indirizzo devono arrivare gli allarmi della temperatura.

La password del cliente deve restare segreta ed rigidamente in possesso del cliente, pena possibili denunce per violazione della privacy.


Superato questo lavoretto preliminare devi aprire una altra tacca sull’IDE di Arduino e incollarci il contenuto del file sottostante. Non ti consiglio di fare per ora alcuna variazione, al massimo potrai personalizzare la riga 119 con il nome esatto del locale.

Codice del lettore di temperatura per DHT11:

/* 
  Lettore di temperatura con l'utilizzo del sensore DHT11
  Robotdazero - https://www.robotdazero.it
    
  Il circuito:
  - pin 1 (Vcc)  del sensore collegato alla alimentazione
  - pin 2 (DATA) del sensore collegato al Pin 7 di Arduino
  - pin 4 (GND)  del sensore collegato alla massa di Arduino
   creato     12 Maggio   2018
  modificato 11 Febbraio 2020
  by sebadima 
 
  - This example code is in the public domain.
  - Questo programma viene fornito gratuitamente 
    anche per usi commerciali.
*/

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <Hash.h>
#include <ESPAsyncTCP.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <EMailSender.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>

#include "credentials.h"
const char ssid[]               = WIFI_SSID;
const char password_wifi[]      = WIFI_PASSWD;
const char email_mittente[]     = EMAIL_MITTENTE;
const char password_email[]     = PASSWORD_EMAIL;
const char email_destinatario[] = EMAIL_DESTINATARIO;

#define DHTPIN 5         // corrisponde al Pin #1 dell ESP8266
#define INTERVALLO 360   // 360*10 = 3600 secondi (una ora) tra due allarmi
#define EMAIL_LIMITE 7   // numero massimo di email inviabili
#define TEMP_LIMITE 22   // temperatura limite per fare scattare allarme
#define DHTTYPE    DHT11 // DHT 11
//#define DHTTYPE  DHT22 // DHT 22 (AM2302)
//#define DHTTYPE  DHT21 // DHT 21 (AM2301)

uint8_t  contatore_warning  = 0;
uint8_t  contatore_email    = 0;
uint8_t  connection_state   = 0;
uint16_t reconnect_interval = 10000;

EMailSender emailSend(email_mittente, password_email);
DHT dht(DHTPIN, DHTTYPE);
 

uint8_t WiFiConnect(const char* nSSID = nullptr, const char* nPassword = nullptr)
{
    static uint16_t attempt = 0;
    Serial.print("In collegamento... ");
    if(nSSID) {
        WiFi.begin(nSSID, nPassword);
        Serial.println(nSSID);
    }
 
    uint8_t i = 0;
    while(WiFi.status()!= WL_CONNECTED && i++ < 50)
    {
        delay(200);
        Serial.print(".");
    }
    ++attempt;
    Serial.println("");
    if(i == 51) {
        Serial.print("Connessione: TIMEOUT al tentativo: ");
        Serial.println(attempt);
        if(attempt % 2 == 0)
            Serial.println("Controlla il router wifi, oltre a login e password\r\n");
        return false;
    }

    Serial.println("Connessione: Riuscita!");
    Serial.print("Con questo indirizzo IP: ");
    Serial.println(WiFi.localIP());
    return true;
}

 
void Awaits()
{
    uint32_t ts = millis();
    while(!connection_state)
    {
        delay(50);
        if(millis() > (ts + reconnect_interval) && !connection_state){
            connection_state = WiFiConnect();
            ts = millis();
        }
    }
}
 

float t = 0.0;
float h = 0.0;
unsigned long previousMillis = 0;    // will store last time DHT was updated
const long interval = 10000;  


void setup(){
  
  Serial.begin(115200);
  dht.begin();
   connection_state = WiFiConnect(ssid, password_wifi);

  if(!connection_state) 
      Awaits();        

  if (WiFi.status() == WL_CONNECTED) 
  {
  }

  EMailSender::EMailMessage message;
  message.subject = "Inizio monitoraggio";
  message.message = "Sto controllando la temperatura del locale XXX";
  EMailSender::Response resp = emailSend.send(email_destinatario, message);

  Serial.println("Status invio: ");
  Serial.println(resp.status);
  Serial.println(resp.code);
  Serial.println(resp.desc);
    
  WiFi.begin(ssid, password_wifi);
  Serial.println("In connessione al WiFi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println(".");
  }

  Serial.println(WiFi.localIP());
}

 
void loop(){  

  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    float newT = dht.readTemperature();
    if (isnan(newT)) {
      Serial.println("Non riesco a leggere il sensore DHT!");
    }
    else {
      t = newT;
      Serial.println(t);
    }
    float newH = dht.readHumidity();
    if (isnan(newH)) {
      Serial.println("Non riesco a leggere il sensore DHT!");
    }
    else {
      h = newH;
      Serial.println(h);
    }

    
    if (t <= TEMP_LIMITE) {
      contatore_warning++;
      Serial.println(contatore_warning);
      if (contatore_warning % INTERVALLO == 0) {
        if (contatore_email < EMAIL_LIMITE) {
          contatore_email++;
          Serial.println("sto inviando una email di avviso!");
          EMailSender::EMailMessage message;
          message.subject = "Avviso temperatura!";
          message.message = "Rilevata Temperatura di " + String(t) + " gradi, inferiore o uguale alla temperature limite di " + String(TEMP_LIMITE) + " gradi.";
          EMailSender::Response resp = emailSend.send(email_destinatario, message);
        }
      }        
    }
  }
}

source

source

Clicca sulla icona di Github per il codice originale oppure clicca
sulla icona più a destra per scaricare il file dal nostro canale #Slack



Fatto l’upload del programma e dopo che la scheda ESP8266 avrà smesso di lampeggiare apri il monitor seriale con: <CTRL>SHIFT> + M e controlla il funzionamento: all’inizio la scheda dovrebbe connettersi alla rete Wifi e dare un segnale di Ok, e solo dopo inviare la email di inizio monitoraggio. Se non arriva nulla entro un minuto ricontrolla le password della rete Wifi e della email.

Nella versione standard in programma controlla che la temperatura non scenda al di sotto della TEMP_LIMITE di 22 gradi per più di una ora. In caso di sforamento: invia una mail, resetta il contatore e aspetta che ci siano altri 60 minuti al di sotto dei 22 gradi.

Il motivo di questa scelta è evitare troppi allarmi ravvicinati che indurrebbero il cliente ad mettere tutto nello SPAM. Il programma standard non invia più di sette email come specificato nella riga 37:
#define EMAIL_LIMITE 7

Se vuoi cambiare il comportamento del programma ti basta modificare le righe 36/37/38 senza toccare il resto della procedura.

le righe che puoi modificare:

#define INTERVALLO 360
#define EMAIL_LIMITE 7
#define TEMP_LIMITE 22

Per portare l’INTERVALLO a 2 ore scrivi 720 (360*2), per portarlo a 6 ore scrivi 2160 (360*6) e così via. Come EMAIL_LIMITE all’inizio lascia tutto com’è, dopo il collaudo potrai fissare un valore arbitrario molto più alto (es. 100). Raggiunto il tetto delle email di allarme il cliente dovrebbe controllare la causa degli sforamenti e resettare la scheda ESP8266.

In un prossimo post vederemo come costruire un contenitore con un “tastino di reset” usando una stampante 3d Open Source. Per resettare la scheda basta comunque staccare il cavetto Micro USB dal PC e attendere pochi secondi.

Iscriviti ora alla nostra newsletter e dopo avere confermato la tua iscrizione troverai ogni 15 gg nella tua mail un argomento o un progetto pratico da seguire, con la lista dei componenti e il software necessario.

newsletter