Come leggere la temperatura ambientale con Arduino – parte seconda

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.

I componenti che ci serviranno per la realizzazione:

  • Una scheda Arduino compatibile ESP8266, clicca sul link per vedere le offerte aggiornate su Amazon,
  • Un sensore di temperatura e umidità DHT11,
  • Una Breadboard per il prototipo, per approfondire leggi qui,
  • Connettori vari o Jumpers.

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.

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.


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.

 
#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);
        }
      }
    }
  }
}

il file credentials.h dove inserire le password:

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.

Codice del lettore di temperatura per DHT11:


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:

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. Ti interessa questo articolo e vuoi scoprire a costo zero tutti i segreti della elettronica digitale?