Rilevatore di fumi smart

Oggi vedremo come realizzare un rilevatore di fumi smart auto costruito che ci avvisi, tramite una notifica sul nostro smartphone, della presenza di alcune sostanze pericolose presenti nell’aria come fumo, monossido di carbonio, alcool in modo da essere avvisati per poter intraprendere eventuali azioni. Può essere anche usato per capire la qualità dell’aria nella stanza in cui è ubicato. In commercio ci sono questi di tipi di prodotti certificati secondo le normative vigenti e hanno un costo di un centinaio di euro, ma perché non provare a costruirne uno e vedere eventuali differenze? Mettiamoci all’opera.

Lista della spesa:

In qualità di affiliato Amazon io ricevo un guadagno dagli acquisti idonei. A voi non costerà nulla di più ma avrete modo di supportare così il mio lavoro per altri progetti. Grazie.

Sensore MQ2

Il sensore di gas MQ2 funziona a 5 V CC e consuma circa 800 mW. 
Può rilevare concentrazioni di GPL , fumo , alcool , propano , idrogeno , metano e monossido di carbonio 
che vanno da 200 a 10000 ppm (Parti per milione).
Nel caso in cui la concentrazione di gas sia più alta sul pin A0 ci sarà una tensione maggiore, in caso di una concentrazione più bassa ci sarà una tensione minore sul pin A0.

Al primo utilizzo il sensore deve essere completamente riscaldato per 24-48 ore per garantire la massima precisione.

Se il sensore è stato utilizzato di recente, saranno necessari solo 5-10 minuti per riscaldarsi completamente. Durante il periodo di riscaldamento, il sensore in genere legge alto e diminuisce gradualmente fino a quando non si stabilizza.

pinout sensore mq2

Circuito elettrico

Scheda elettrico Rilevatore di Fumi - Lutritech.it
  • VCC del MQ2 al pin 5V del Wemos D1 Mini.
  • GND del MQ2 al pin GND del Wemos D1 Mini.
  • A0 del MQ2 al pin A0 del Wemos D1 Mini.
circuito montato - Lutritech.it
circuito con sensore mq2- Lutritech.it
Case aperto Rilevatore - Lutritech.it
Rilevatore di Fumi Smart - Lutritech.it

trovate il modello 3D da stampare a questo link https://www.thingiverse.com/thing:5895255

Applicazione Blynk per Telefono

Vi condivido il codice QR del mio progetto in modo affinchè lo possiate usare per importare l’app già configurata.

QR code rilevatore di fumo - Lutritech.it

Se tutto è andato bene dovreste ritrovarvi tutto già configurato come nella figura qui sotto.
Ci sono 3 indicatori di livello: uno per il GPL, uno per Monossido di Carbonio e uno per il Fumo.
Ho aggiunto anche un datastream che memorizza tutte le misurazioni del Fumo in modo da averne così una cronologia.

App su Blynk - Lutritech.it

Sketch da utilizzare

Per realizzare il rilevatore di fumi smart ho deciso di utilizzare una libreria del sensore MQ2 per visualizzare le ppm relative a GPL, Monossido di Carbonio e il fumo.
Per installarla andiamo sull’Ide di Arduino–> Gestione Librerie e cercate mq2; sul primo risultato cliccate su “Installa”.

Libreria MQ2 IDE Arduino - Lutritech.it

Ho utilizzato la libreria WifiManager di tzapu https://github.com/tzapu/WiFiManager in modo da configurare la rete wifi facilmente senza caricare tutte le volte un nuovo firmware per cambiare le credenziali della rete wifi, davvero molto comodo e utile.
Per questo progetto ho utilizzato il mio server privato di Blynk Legacy, se volete crearne uno voi in modo gratuito visitate l’articolo https://www.lutritech.it/blynk-energia-gratuita/

Ecco lo sketch che dovete personalizzare con i dati della vostra rete wifi e il vostro token di Blynk.

//https://www.lutritech.it/rilevatore-di-fumi-smart/
//https://www.youtube.com/@lutritech
//
//ponticellando D4 con GND si entra in modalità configurazione wifi
//ponticellando D4 con GND per più di 5 secondi si cancellano le configurazioni delle rete wifi salvate
//
#include <MQ2.h>

#define BLYNK_PRINT Serial

#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <WiFiUdp.h>

#include <time.h>
#include <Timezone.h>    // https://github.com/JChristensen/Timezone
#include <WiFiManager.h> //https://github.com/tzapu/WiFiManager

#define BLYNK_PRINT Serial  // Comment this out to disable prints and save space
#define TRIGGER_PIN D4  //Pin da usare per avviare la configurazione del wifi

char auth[] = "XXXXXXXXXXXXXXXXXXXXXXXXXXX"; //Enter Authentication code sent by Blynk
SimpleTimer timer;

int pin = A0;
int soglia = 400; //ppm
float lpg, co, smoke;

MQ2 mq2(pin);

// wifimanager can run in a blocking mode or a non blocking mode
// Be sure to know how to process loops with no delay() if using non blocking
bool wm_nonblocking = false; // change to true to use non blocking

WiFiManager wm; // global wm instance
WiFiManagerParameter custom_field; // global param ( for non blocking w params )

void setup() {
  WiFi.mode(WIFI_STA); // explicitly set mode, esp defaults to STA+AP
  Serial.begin(115200);
  Serial.setDebugOutput(true);
  delay(3000);
  Serial.println("\n Starting");

  pinMode(TRIGGER_PIN, INPUT);

  if (wm_nonblocking) wm.setConfigPortalBlocking(false);

  // add a custom input field
  int customFieldLength = 40;


  // test custom html(radio)
  const char* custom_radio_str = "<br/><label for='customfieldid'>Custom Field Label</label><input type='radio' name='customfieldid' value='1' checked> One<br><input type='radio' name='customfieldid' value='2'> Two<br><input type='radio' name='customfieldid' value='3'> Three";
  new (&custom_field) WiFiManagerParameter(custom_radio_str); // custom html input

  wm.addParameter(&custom_field);
  wm.setSaveParamsCallback(saveParamCallback);

  // custom menu via array or vector
  std::vector<const char *> menu = {"wifi", "info", "param", "sep", "restart", "exit"};
  wm.setMenu(menu);

  // set dark theme
  wm.setClass("invert");
  wm.setConfigPortalTimeout(30); // auto close configportal after n seconds
  bool res;
  res = wm.autoConnect("AutoConnectAP"); // anonymous ap
  if (!res) {
    Serial.println("Failed to connect or hit timeout");
    // ESP.restart();
  }
  else {
    //if you get here you have connected to the WiFi
    Serial.println("connected...yeey :)");
  }

  // calibra il sensore
  mq2.begin();

  Blynk.begin(auth, WiFi.SSID().c_str(), WiFi.psk().c_str(), "VostroServer.ddns.net", 8080); //inserire il vostro server
  timer.setInterval(5000, getSendData);
}

void checkButton() {
  // check for button press
  if ( digitalRead(TRIGGER_PIN) == LOW ) {
    // poor mans debounce/press-hold, code not ideal for production
    delay(50);
    if ( digitalRead(TRIGGER_PIN) == LOW ) {
      Serial.println("Button Pressed");
      // still holding button for 5000 ms, reset settings, code not ideaa for production
      delay(5000); // reset delay hold
      if ( digitalRead(TRIGGER_PIN) == LOW ) {
        Serial.println("Button Held");
        Serial.println("Erasing Config, restarting");
        wm.resetSettings();
        ESP.restart();
      }

      // start portal w delay
      Serial.println("Starting config portal");
      wm.setConfigPortalTimeout(120);

      if (!wm.startConfigPortal("OnDemandAP", "password")) {
        Serial.println("failed to connect or hit timeout");
        delay(3000);
        // ESP.restart();
      } else {
        //if you get here you have connected to the WiFi
        Serial.println("connected :-)");
      }
    }
  }
}


String getParam(String name) {
  //read parameter from server, for customhmtl input
  String value;
  if (wm.server->hasArg(name)) {
    value = wm.server->arg(name);
  }
  return value;
}

void saveParamCallback() {
  Serial.println("[CALLBACK] saveParamCallback fired");
  Serial.println("PARAM customfieldid = " + getParam("customfieldid"));
}

void loop() {
  if (wm_nonblocking) wm.process(); // avoid delays() in loop when non-blocking and other long running code
  checkButton();
  // put your main code here, to run repeatedly:
  timer.run(); // Initiates SimpleTimer
  Blynk.run();
  /*
     read the values from the sensor, it returns
     an array which contains 3 values.
     0 : LPG in ppm
     1 : CO in ppm
     2 : SMOKE in ppm
  */
  float* values = mq2.read(true); //set it false if you don't want to print the values to the Serial

  lpg = mq2.readLPG();
  co = mq2.readCO();
  smoke = mq2.readSmoke();

  if (lpg > soglia or co > soglia or smoke > soglia )
  {
    Blynk.notify("Superata Soglia: Attenzione!");
  }
}


void getSendData()
{
  Blynk.virtualWrite(V2, lpg); // Blynk INPUT Connect V2 Pin
  Blynk.virtualWrite(V3, co); // Blynk INPUT Connect V3 Pin
  Blynk.virtualWrite(V4, smoke); // Blynk INPUT Connect V4 Pin
}

Prova sul campo

Andando sul monitor seriale, se tutto è andato bene, dovreste vedere una schermata simile a quella sottostante.
Vi ricordo che affinché le letture risultino affidabili il sensore si deve scaldare una ventina di minuti.

Monitor Seriale IDE- Lutritech.it

Possiamo testare la bontà del nostro progetto avvicinando un accendino e rilasciando il gas per un paio di secondi.

Rilevato GAS - Lutritech.it

Vediamo che il nostro rilevatore è riuscito ad identificare la presenza del gas, non è arrivata nessuna notifica infatti la lettura del valore è sotto la soglia configurata. Successivamente possiamo provare a mettere dell’alcool rosa su un panno e sistemarlo vicino al nostro sensore.

Notifica su Blynk - Lutritech.it

In questo caso riceviamo subito una notifica sul nostro telefono che ci avvisa che la soglia è stata superata.

Ottimo! Ricapitolando abbiamo visto come realizzare un rilevatore di fumi smart capace di identificare vari tipi di gas pericolosi avvisandoci tramite una notifica sul nostro telefono senza spendere cifre estremamente alte.
Naturalmente questo progetto non vuole sostituirsi ai prodotti commercializzati certificati DIN EN 14604.

Ho creato un altro sketch in cui utilizzo un bot di telegram per ricevere le notifiche, se sei interessato visita questo articolo https://www.lutritech.it/bot-telegram-con-esp8266/

Condivi sui Social

Lascia un commento

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

6 commenti su “Rilevatore di fumi smart”

  1. Buongiorno Giuseppe
    comodissima il WiFiManager…
    ma se avessi la necessità di cambiare WiFi, come posso fare?
    è possibile una volta configurato, cambiare il SSid WIFI?
    grazie per la tua disponibilità.

    1. Ciao Massimo,
      ho aggiornato lo sketch inserendone uno nuovo.
      Questo ha una versione avanzata del wifimanager.
      Al primo avvio la scheda andrà in configurazione e utilizzerà la rete AutoConnectAP.
      Una volta scelta la rete wifi e inserita la sua pw, il programma leggerà dal sensore e invierà i dati al server.
      Se per qualsiasi motivo dovessi cambiare per un’altra rete wifi allora ponticella D4 con GND per più di 5 secondi.
      Facendo così vengono cancellate tutte le reti salvate e la scheda va in modalità configurazione sempre con la rete AutoConnectAP.
      Se ponticelli per meno di 5 secondi si attiva la rete OnDemandAP e puoi scegliere una seconda rete wifi da configurare.
      Mi sembra un modo pratico.
      un saluto.
      Giuseppe

Torna in alto