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.
Circuito elettrico
- 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.
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.
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.
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”.
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.
Possiamo testare la bontà del nostro progetto avvicinando un accendino e rilasciando il gas per un paio di secondi.
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.
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/
Aggiornamento al 19/10/2024
Blynk Legacy utilizzava il protocollo di Google Cloud Messaging (GCM) poi deprecato e
successivamente da Firebase Cloud Messaging (FCM) per l’invio delle notifiche sulla relativa applicazione
A Giugno 2024 Google ha cominciato a rimuovere FCM per migrare a sistemi più sicuri.
Per ulteriori approfondimenti potete leggere:
https://github.com/Peterkn2001/blynk-server/blob/master/server/notifications/push/src/main/resources/gcm.properties
e https://firebase.google.com/docs/cloud-messaging/migrate-v1?hl=it