Come costruire un sensore di gas per rilevare alcol, etanolo e fumo nell'aria con un MQ-3 e un ESP32, ESP8266 o Raspberry Pi Pico W per Alexa

In questa sezione ti guidiamo nella costruzione di un sensore di gas con un ESP32, Raspberry Pi Pico W o ESP8266. Potrai poi monitorare la concentrazione di alcol nell’aria tramite Amazon Alexa e ricevere notifiche push nell’app Sinric Pro quando il sensore rileva un determinato livello.

Prerequisiti :

  1. ESP32, ESP8266 x 1.
  2. MQ-3 x 1.
  3. Cavetti jumper.

Sinric Pro MQ-3 alcohol gas sensor

Breve introduzione all’MQ-3

L’MQ-3 è un sensore di gas a semiconduttore usato in svariate applicazioni per rilevare la concentrazione di alcol nell’aria. È un sensore economico, molto sensibile e facile da usare. L’MQ-3 si basa sul principio di rilevamento dei gas tramite il semiconduttore biossido di stagno (SnO2). Quando nell’aria sono presenti molecole di alcol, queste vengono adsorbite sulla superficie dell’SnO2. L’adsorbimento fa variare la conducibilità dell’SnO2, e questa variazione può essere misurata come segnale elettrico. L’MQ-3 è sensibile a un’ampia gamma di concentrazioni di alcol, da 0.05 ppm a 5000 ppm. È sensibile anche ad altri gas, come ammoniaca, benzene e toluene, ma soprattutto all’alcol.

Il sensore MQ3 richiede un’alimentazione a 5V e consuma circa 800mW. L’uscita digitale può essere collegata a un ESP32, ESP8266 o Pico W per misurare la concentrazione di alcol.

Come si calibra il sensore ?

Lascialo alimentato per 24-48 ore per il rodaggio e la stabilizzazione.

Scheda tecnica: MQ-3

Cablaggio

Sinric Pro esp8266 MQ-3 wiring

MCU Pin A0 Pin VCC
ESP32 34 (Analog ADC1_CH6) 5V
ESP8266 A0 5V/VIN
Pico W GP26 (ADC0) 5V

Nota: su ESP32, l’ADC2 (GPIO04, GPIO02, GPIO15) è instabile quando è in uso il Wi-Fi.

Verifichiamo che il sensore sia cablato correttamente e funzioni.

#if defined(ESP8266)
  const int adcPin = A0;  
#elif defined(ESP32) 
  const int adcPin = 34;  
#elif defined(ARDUINO_ARCH_RP2040)
  const int adcPin = 26;  
#endif

int sensorVal;

void setup() {
 Serial.begin(9600);
 Serial.println("warming up for 20 seconds ..!");
 delay(20000);
}

void loop() {
 sensorVal = analogRead(adcPin);
 Serial.printf("value: %d\r\n", sensorVal);
 delay(2000); // delay 2s
}

Vedi questo codice su GitHub Gist

Lettura senza esposizione all’alcol (circa 760):

Sinric Pro MQ3 test reading

Con esposizione a Jack Daniel’s Single Barrel Tennessee Whiskey (circa 850):

Sinric Pro MQ3 test reading

Passo 1 : Connettiti a Sinric Pro

Passo 1.1 : Crea un tipo di dispositivo personalizzato per il sensore di gas.

Sinric Pro non ha un tipo di dispositivo predefinito per il sensore di gas, quindi ne creeremo uno personalizzato con la funzione Device Template.

  1. Alcol rilevato/non rilevato.

Nota: per evitare di creare l’intero modello puoi usare la funzione di importazione dei modelli di dispositivo descritta più sotto.

Sinric Pro gas ensor device template

Qui dobbiamo selezionare le funzioni del nostro sensore di gas. Vogliamo sapere se l’alcol è rilevato o non rilevato. Trasciniamo quindi una capability Mode e una Push Notification.

Sinric Pro custom device type for gas sensor

Fai clic sul pulsante Configure e imposta le due capability come qui sotto.

Sinric Pro moisture sensor template mode and range settings

Fai clic su Save per salvare.

Sinric Pro moisture sensor template mode and range settings

Fai clic su Save per salvare il modello.

Ora puoi vedere il modello appena creato.

Importare un modello esistente?

Se non hai voglia di impostare tutti i valori dei Mode, puoi usare la funzione di importazione.

Sinric Pro gas sensor import template

Incolla questo modello:

{
  "name": "Gas Sensor",
  "description": "Gas Sensor",
  "deviceTypeId": "654d7ef928f14e9ac82ad57d",
  "capabilities": [
    {
      "id": "5ff0b41b994fd31b7d5e8961",
      "mode": {
        "instanceId": "modeInstance1",
        "locale": "en-US",
        "modeName": "Alcohol",
        "nonControllable": true,
        "modeValues": [
          "Detected",
          "Not-Detected"
        ]
      }
    },
    {
      "id": "62a707bd9e2f39090569e2d3"
    }
  ]
}

Vedi questo codice su GitHub Gist

Sinric Pro create device alexa

Sinric Pro copy device id

Sinric Pro copy device id

Passo 2 : Connettiti a Sinric Pro

Passo 2.1 Installa la libreria Sinric Pro

Sinric Pro install SinricPro library

2.2 Codice completo

GasSensor.h

#ifndef _GASSENSOR_H_
#define _GASSENSOR_H_

#include <SinricProDevice.h>
#include <Capabilities/ModeController.h>
#include <Capabilities/PushNotification.h>

class GasSensor 
: public SinricProDevice
, public ModeController<GasSensor>
, public PushNotification<GasSensor> {
  friend class ModeController<GasSensor>;
  friend class PushNotification<GasSensor>;
public:
  GasSensor(const String &deviceId) : SinricProDevice(deviceId, "GasSensor") {};
};

#endif

sinricpro-mq4-sensor.ino

// Uncomment the following line to enable serial debug output
//#define ENABLE_DEBUG

#ifdef ENABLE_DEBUG
  #define DEBUG_ESP_PORT Serial
  #define NODEBUG_WEBSOCKETS
  #define NDEBUG
#endif

#include <Arduino.h>
#ifdef ESP8266
  #include <ESP8266WiFi.h>
#endif
#ifdef ESP32
  #include <WiFi.h>
#endif

#include <SinricPro.h>
#include "GasSensor.h"

#define WIFI_SSID         ""   // Your WiFI SSID name 
#define WIFI_PASS         ""   // Your WiFi Password.

#define APP_KEY           ""   // Should look like "de0bxxxx-1x3x-4x3x-ax2x-5dabxxxxxxxx" (Get it from Portal -> Secrets)
#define APP_SECRET        ""   // Should look like "5f36xxxx-x3x7-4x3x-xexe-e86724a9xxxx-4c4axxxx-3x3x-x5xe-x9x3-333d65xxxxxx" (Get it from Portal -> Secrets)
#define DEVICE_ID         ""   // Should look like "5dc1564130xxxxxxxxxxxxxx" (Get it from Portal -> Devices)

#define BAUD_RATE         115200              // Change baudrate to your need (used for serial monitor)
#define EVENT_WAIT_TIME   60000               // send event every 60 seconds

#if defined(ESP8266)
  const int adcPin = A0;  
#elif defined(ESP32) 
  const int adcPin = 34;  
#elif defined(ARDUINO_ARCH_RP2040)
  const int adcPin = 26;  
#endif

#define BAUD_RATE         115200              // Change baudrate to your need (used for serial monitor)
#define EVENT_WAIT_TIME   60000               // send event every 60 seconds

const int GAS_DETECTED_THRESHOLD = 850;       // Change accordingly

GasSensor &gasSensor = SinricPro[DEVICE_ID];
int sensorVal;
String sensorState = "";
String lastSensorState = "";

// ModeController
void updateMode(String mode) {
  gasSensor.sendModeEvent("modeInstance1", mode, "PHYSICAL_INTERACTION");
}

// PushNotificationController
void sendPushNotification(String notification) {
  gasSensor.sendPushNotification(notification);
}

void setupSinricPro() {
  SinricPro.onConnected([]{ Serial.printf("[SinricPro]: Connected\r\n"); });
  SinricPro.onDisconnected([]{ Serial.printf("[SinricPro]: Disconnected\r\n"); });
  SinricPro.begin(APP_KEY, APP_SECRET);
}

 void handleM3Sensor() {
  if (SinricPro.isConnected() == false) {
    return; 
  }

  static unsigned long last_millis;
  unsigned long        current_millis = millis();
  if (last_millis && current_millis - last_millis < EVENT_WAIT_TIME) return;
  last_millis = current_millis;
    
  sensorVal = analogRead(adcPin);
  Serial.printf("Sensor value: %d\r\n", sensorVal); 

  if (sensorVal > GAS_DETECTED_THRESHOLD) { // "Detected" or "Not-Detected" (from ModeController mode values)
    sensorState = "Detected"; 
  } else {
    sensorState = "Not-Detected";
  }

  if(sensorState != lastSensorState) {
    /* update server with "detected" / "Not-Detected" status */
    updateMode(sensorState); 

    /* send a push notification when gas detected */
    if(sensorState == "Detected") {
      sendPushNotification("Gas Detected!!!");
    }    
  } 

  lastSensorState = sensorState;  // save to compare next time.
}

void setupWiFi() {
  #if defined(ESP8266)
    WiFi.setSleepMode(WIFI_NONE_SLEEP); 
    WiFi.setAutoReconnect(true);
  #elif defined(ESP32)
    WiFi.setSleep(false); 
    WiFi.setAutoReconnect(true);
  #endif

  WiFi.begin(SSID, PASS);
  Serial.printf("[WiFi]: Connecting to %s", SSID);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.printf(".");
    delay(250);
  }
  Serial.printf("connected\r\n");
}

void setup() {
  Serial.begin(BAUD_RATE);
  setupWiFi();
  setupSinricPro();
}

/********
 * Loop *
 ********/

void loop() {
  handleM3Sensor();
  SinricPro.handle();
}

Vedi questo codice su GitHub Gist

Ora dovresti vedere lo stato di rilevamento dell’alcol in Alexa e nell’app Sinric Pro

Alexa, qual è l’alcol (nome del mode) di Gas Sensor (nome del dispositivo)

Sinric Pro Alexa gas sensor

Sinric Pro Portal gas sensor portal

### Passo 3 : Annunci vocali!

✅ Come funziona:

1️⃣ Aggiungi uno Switch in SinricPro (il tuo trigger segreto!)

2️⃣ Crea una routine Alexa che pronuncia il tuo messaggio, ad esempio “Il sensore di gas ha rilevato del gas!”, quando lo Switch viene acceso

3️⃣ Dal tuo codice, invia un evento di stato di alimentazione per accendere quello Switch

void triggerVoiceAnnouncement() {
    SinricProSwitch& mySwitch = SinricPro[SWITCH_ID];
    mySwitch.sendPowerStateEvent(true);
}

Risoluzione dei problemi

  1. Google Home e SmartThings non sono supportati.

  2. Per maggiori dettagli consulta la nostra pagina Risoluzione dei problemi.

Tutorial correlati

Questo documento è open source. Hai trovato un errore? Crea una issue