Sensor BME680 para Gas, Temp., Hum. y Presión Atmosferica

           El BME680 es un sensor de  medición de temperatura, humedad, presión barométrica y compuestos orgánicos volátiles (VOC). Detectar gases como monóxido de carbono, butano, etanol, acetona etc. No detecta directamente CO2.
           El sensor puede medir la suma de contaminantes VOC en el aire circundante, como de pintura, muebles o desechos, altos niveles de VOC de cocinar y el aire exhalado o la sudoración.
           El sensor mide solo 3x3mm con consumos de pocos µA y esta pensado para ser integrado en teléfonos móviles.
           La comunicación se realiza a través de SPI o I²C (address 0x76) que uso en este montaje.
           Está conectado a un esp8266 a 3,3v. He usado la librería de Adafruit que mide los cuatro parámetros antes mencionados y también puede calcular el Air Quality Index (IAQ) que yo no he usado porque solo me interesaba la detección de gases inflamables.
           También es posible emplear la librería de Bosch. Es algo más compleja que la de Adafruit, y proporciona más valores del sensor como, por ejemplo, la estimación de CO2 equivalente.
            Con la idea de tener una alarma en el móvil he empleado un esp8266. Aparte del BMP680 uso una pantalla de 0,96'' y un zumbador.
            Sensor y pantalla están conectados en paralelo por I²C. Así, el circuito es muy simple.
 
          Decir que los valores del sensor de gas no son fijos ni estables. Por ello no puede ponerse un valor fijo de "disparo"
          Cuando detecta gas se produce una disminución de su resistencia en KOhms. Así, la alarma la he determinado cuando hay una disminución del 5% sobre el valor anteriormente medido. En ese momento suena el zumbador durante unos segundos y envía una llamada a la URL de Telegram que a su vez puede mandarme una notificación o en este caso una llamada con aviso por voz.
//www.jopapa.me  2023
//Nodemcu d1 mini  D1---SCL  D2---SDA  D7---Buzzer
//Sensor BME680
//Display OLED 128x64

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
#include <Wire.h>
#include "Adafruit_BME680.h"
#include <Adafruit_SSD1306.h>

Adafruit_BME680 bme; // I2C
#define ANCHO_PANTALLA 128 // ancho pantalla OLED
#define ALTO_PANTALLA 64 // alto pantalla OLED
Adafruit_SSD1306 display(ANCHO_PANTALLA, ALTO_PANTALLA, &Wire, -1);

const char* ssid = "Jopapa";
const char* password = "xxxxxxxxxxxxxxxx";
int gasA=0; int gasN=0; int gasB = 0;

//Mi Domain name with URL path or IP address para Telegram en https://www.callmebot.com/
//Llamada de teléfono
String serverName = "http://api.callmebot.com/start.php?user=@XXXXXXXXXXXX&text=Mensaje+por+alarma+de+gas+en+cocina&lang=es-ES-Standard-B&rpt=5";
//o por mensage Telegram
//String serverName = "http://api.callmebot.com/text.php?user=XXXXXXXXXXX&text=Alarma+por+gas+en+la+cocina";

void setup() {
  Serial.begin(9600);
  delay(100);
  WiFi.begin(ssid, password);
  while(WiFi.status() != WL_CONNECTED){ delay(500);}
  if (!bme.begin()){Serial.println("Not se encuentra BME680");}
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);   // Pantalla OLED en dirección 0x3C

  // Set up oversampling and filter initialization
  bme.setTemperatureOversampling(BME680_OS_8X);
  bme.setHumidityOversampling(BME680_OS_2X);
  bme.setPressureOversampling(BME680_OS_4X);
  bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
  bme.setGasHeater(320, 150); // 320*C for 150 ms

  display.setTextSize(2);  //Tamaño texto
  display.setTextColor(SSD1306_WHITE);
  pinMode(D7, OUTPUT);  //Para el Buzzer
  Serial.println("Temp Hum Gas");
  delay(20000); //estabiliza un poco el sensor de gas
}

void loop() {
  if (! bme.performReading()){ Serial.println("Fallo de lectura:("); return;}
  display.clearDisplay();
  display.setCursor(0, 0);   

//  Serial.print("Temperatura");
  Serial.print(bme.temperature);
  Serial.print(",");
  display.print(bme.temperature); display.print(" ");
  display.cp437(true); display.write(248);
  display.println("C");

//  Serial.print("Humedad"); 
  Serial.print(bme.humidity);
  Serial.print(",");
  display.print(bme.humidity);
  display.println(" %"); 

//  Serial.print("Presión");
  display.print(int((bme.pressure/100.0))+2);
  display.println(" hPa");

//  Serial.print("Gas");
  gasB = gasA-(gasA*0.05);  //Para detecta una caida del 5% de resistividad
  gasN = (bme.gas_resistance / 1000.0);
  if (gasN <= gasB){ 
    if(WiFi.status()== WL_CONNECTED){
      WiFiClient client;
      HTTPClient http;
      String serverPath = serverName;
      // Your Domain name with URL path or IP address with path
      http.begin(client, serverPath.c_str());     
      // Send HTTP GET request
      int httpResponseCode = http.GET();
      http.end();
    }
    else {
      Serial.println("WiFi Disconectado");
    }
    digitalWrite(D7, HIGH); delay(5000); digitalWrite(D7, LOW);  //Buzzer           
  }
  gasA = gasN;
  Serial.println(bme.gas_resistance / 1000.0);
  display.print(int(bme.gas_resistance / 1000.0));
  display.println(" KOhms");
   
  display.display(); 
  delay(5000);
}
Menu