راه اندازی سنسور BME680: BME680 یک حسگر دیجیتال محیطی است که گاز، فشار، رطوبت و دما را اندازه گیری می کند. در این راهنما نحوه استفاده از ماژول حسگر BME680 با برد ESP8266 NodeMCU با استفاده از Arduino IDE را خواهید آموخت.این سنسور با استفاده از پروتکل های ارتباطی I2C یا SPI با میکروکنترلر ارتباط برقرار می کند.

راه اندازی سنسور BME680 با استفاده از ESP8266

در این آموزش شما یاد خواهید گرفت که چگونه سنسور را به برد ESP8266 NodeMCU متصل کنید، کتابخانه های مورد نیاز را نصب کنید، از یک برنامه ساده برای نمایش مقادیر سنسور در مانیتور سریال استفاده کنید و یک وب سرور برای نظارت از راه دور این سنسور بسازید.

معرفی ماژول سنسور محیطی BME680

BME680 یک حسگر محیطی است که حسگرهای گاز، فشار، رطوبت و دما را ترکیب کرده است. حسگر گاز می تواند طیف وسیعی از گازها مانند ترکیبات آلی فرار (VOC) را شناسایی کند. به همین دلیل می توان از BME680 در کنترل کیفیت هوای داخل ساختمان استفاده کرد.

راه اندازی سنسور BME680 با استفاده از ESP8266 اندازه گیری گاز، فشار، رطوبت و دما به صورت ساده و وب سرور

مقادیر اندازه گیری BME680

BME680 یک سنسور دیجیتال 4 در 1 است که این مقادیر را اندازه‌گیری می‌کند:

  • درجه حرارت
  • رطوبت
  • فشار هوا
  • گاز: ترکیبات آلی فرار (VOC) مانند اتانول و مونوکسید کربن

حسگر گاز

BME680 دارای حسگر MOX (اکسید فلز) است که VOC ها را در هوا تشخیص می دهد. این حسگر به شما یک مقدار کیفی از مجموع VOCs / آلاینده‌ها در هوای اطراف می‌دهد – این سنسور برای یک مولکول گاز خاص نیست و مقادیر مختلفی را میتوانید اندازه گیری کند.

حسگرهای MOX از یک سطح اکسید فلزی، یک تراشه حسگر برای اندازه‌گیری تغییرات رسانایی و یک گرم کننده تشکیل شده‌اند. این VOC ها را با جذب مولکول های اکسیژن در لایه حساس خود شناسایی می کند. BME680 به اکثر VOCهای آلوده کننده هوای داخل ساختمان (به جز CO2) واکنش نشان می دهد.

هنگامی که سنسور با گازهای کاهنده تماس پیدا می کند، مولکول های اکسیژن واکنش نشان می دهند و رسانایی را در سراسر سطح افزایش می دهند. به عنوان یک سیگنال خام، BME680 مقادیر مقاومت را خروجی می دهد. این مقادیر به دلیل تغییرات در غلظت VOC تغییر می کند:

راه اندازی سنسور BME680 با استفاده از ESP8266 اندازه گیری گاز، فشار، رطوبت و دما به صورت ساده و وب سرور
  • غلظت بالاتر VOCs » مقاومت کمتر
  • غلظت کمتر VOCs » مقاومت بالاتر

واکنش هایی که روی سطح حسگر رخ می دهد (مقاومت) تحت تأثیر پارامترهایی غیر از غلظت VOC مانند دما و رطوبت است.

اطلاعات مربوطه در مورد سنسور گاز

حسگر گاز یک ایده کیفی از گازهای VOC در هوای اطراف به شما می دهد. بنابراین، می توانید روندها را دریافت کنید، نتایج خود را مقایسه کنید و ببینید که آیا کیفیت هوا در حال افزایش یا کاهش است. برای اندازه گیری دقیق، باید سنسور را بر اساس منابع شناخته شده کالیبره کنید و یک منحنی کالیبراسیون بسازید.

هنگامی که برای اولین بار سنسور را دریافت می کنید، توصیه می شود آن را به مدت 48 ساعت پس از شروع جمع آوری داده های “واقعی” راه اندازی کنید. پس از آن، همچنین توصیه می شود قبل از خواندن گاز، سنسور را به مدت 30 دقیقه روشن کنید.

دقت BME680

در اینجا دقت سنسورهای دما، رطوبت و فشار BME680 آمده است:

سنسوردقت
دما+/- 1.0ºC
رطوبت+/- 3%
فشار+/- 1 hPa

محدوده عملیاتی BME680

جدول زیر محدوده عملکرد سنسورهای دما، رطوبت و فشار BME680 را نشان می دهد.

سنسوررنج کاری
دما-40  –  85 ºC
رطوبت0 – 100 %
فشار300 – 1100 hPa

BME680 Pinout

VCCولتاز ورودی سنسور
GNDزمین سنسور
SCLSCL pin for I2C communication
SCK pin for SPI communication
SDASDA pin for I2C communication
SDI (MISO) pin for SPI communication
SDOSDO (MOSI) pin for SPI communication
CSChip select pin for SPI communication

رابط BME680

BME680 از رابط های I2C و SPI پشتیبانی می کند.

راه اندازی سنسور BME680 با استفاده از ESP8266 اندازه گیری گاز، فشار، رطوبت و دما به صورت ساده و وب سرور

BME680 I2C

برای استفاده از پروتکل ارتباطی I2C، از پین های زیر استفاده کنید:

BME680ESP8266
SCLGPIO 5 (D1)
SDAGPIO 4 (D2)

GPIO 5 (SCL) و GPIO 4 (SDA) پین های پیش فرض ESP8266 I2C هستند. شما می توانید از سایر پین ها استفاده کنید تا زمانی که آنها را به درستی روی کد تنظیم کنید.

BME680 SPI

برای استفاده از پروتکل ارتباطی SPI، از پین های زیر استفاده کنید:

BME680ESP8266
SCL (SCK SPI Clock)GPIO 14 (D5)
SDA (SDI MOSI)GPIO 13 (D7)
SDO (MISO)GPIO 12 (D6)
CS (Chip Select)GPIO 15 (D8)

اینها پین های پیش فرض ESP8266 SPI هستند. شما می توانید از سایر پین ها استفاده کنید تا زمانی که آنها را به درستی در کد تنظیم کنید.

قطعات مورد نیاز

راه اندازی سنسور BME680 با استفاده از ESP8266
  • ماژول سنسور BME680
  • ESP8266
  • برد بورد
  • سیم های جامپر

شماتیک – ESP8266 با BME680

ESP8266 با BME680 با استفاده از I2C

برای اتصال BME680 به ESP8266 با استفاده از پایه های پیش فرض I2C، دیاگرام شماتیک زیر را مشاهده کنید.

راه اندازی سنسور BME680 با استفاده از ESP8266 اندازه گیری گاز، فشار، رطوبت و دما به صورت ساده و وب سرور

ESP8266 با BME680 با استفاده از SPI

از طرف دیگر، ممکن است بخواهید به جای آن از پروتکل ارتباطی SPI استفاده کنید. در این صورت، دیاگرام شماتیک زیر را مشاهده کنید تا BME680 را با استفاده از پایه های پیش فرض SPI به ESP8266 متصل کنید.

توجه: اگر از پروتکل ارتباطی SPI استفاده می کنید، سنسور را فقط پس از آپلود کد سیم کشی کنید.

راه اندازی سنسور BME680 با استفاده از ESP8266 اندازه گیری گاز، فشار، رطوبت و دما به صورت ساده و وب سرور

آماده سازی آردوینو IDE

ما برد ESP8266 را با استفاده از Arduino IDE برنامه ریزی می کنیم. بنابراین، مطمئن شوید که بردهای ESP8266 را نصب کرده اید. در صورتی که هنوز این بردها را نصب نکرده اید نگران نباشید و این مقاله را دنبال کنید: نصب بردهای ESP8266 در آردوینو IDE (ویندوز – مک – لینوکس)

همچنین باید کتابخانه Adafruit BME680 و Adafruit Unified Sensor را نصب کنید.

نصب کتابخانه BME680

برای دریافت اطلاعات از ماژول حسگر BME680، از کتابخانه Adafruit_BME680 استفاده می کنیم. مراحل بعدی را برای نصب کتابخانه در Arduino IDE خود دنبال کنید:

Arduino IDE خود را باز کنید و به Sketch > Include Library > Manage Libraries بروید. Library Manager باید باز شود.

عبارت adafruit bme680 را در کادر جستجو جستجو کنید و کتابخانه را نصب کنید.

راه اندازی سنسور BME680 با استفاده از ESP8266 اندازه گیری گاز، فشار، رطوبت و دما به صورت ساده و وب سرور

نصب کتابخانه Adafruit_Sensor

برای استفاده از کتابخانه BME680، باید کتابخانه Adafruit_Sensor را نیز نصب کنید. مراحل بعدی را برای نصب کتابخانه در Arduino IDE خود دنبال کنید:

به Sketch > Include Library > Manage Libraries بروید و «Adafruit Unified Sensor» را در کادر جستجو تایپ کنید. برای یافتن کتابخانه و نصب آن تا انتها به پایین بروید.

راه اندازی سنسور BME680 با استفاده از ESP8266 اندازه گیری گاز، فشار، رطوبت و دما به صورت ساده و وب سرور

پس از نصب کتابخانه ها، آردوینو IDE خود را مجددا راه اندازی کنید.

کد – خواندن مقادیر گاز، فشار، رطوبت و دما بصورت ساده

برای خواندن گاز، فشار، دما و رطوبت از یک مثال از کتابخانه استفاده می کنیم.

پس از نصب کتابخانه BME680 و کتابخانه Adafruit_Sensor، Arduino IDE را باز کنید و به File > Examples > Adafruit BME680 Library > bme680async بروید.

				
					/***
  Read Our Complete Guide: https://RandomNerdTutorials.com/esp8266-nodemcu-bme680-sensor-arduino/
  Designed specifically to work with the Adafruit BME680 Breakout ----> http://www.adafruit.com/products/3660 These sensors use I2C or SPI to communicate, 2 or 4 pins are required to interface. Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit! Written by Limor Fried & Kevin Townsend for Adafruit Industries. BSD license, all text above must be included in any redistribution
***/

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BME680.h"

/*#define BME_SCK 14
#define BME_MISO 12
#define BME_MOSI 13
#define BME_CS 15*/

#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME680 bme; // I2C
//Adafruit_BME680 bme(BME_CS); // hardware SPI
//Adafruit_BME680 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK);

void setup() {
  Serial.begin(115200);
  while (!Serial);
  Serial.println(F("BME680 async test"));

  if (!bme.begin()) {
    Serial.println(F("Could not find a valid BME680 sensor, check wiring!"));
    while (1);
  }

  // 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
}

void loop() {
  // Tell BME680 to begin measurement.
  unsigned long endTime = bme.beginReading();
  if (endTime == 0) {
    Serial.println(F("Failed to begin reading :("));
    return;
  }
  Serial.print(F("Reading started at "));
  Serial.print(millis());
  Serial.print(F(" and will finish at "));
  Serial.println(endTime);

  Serial.println(F("You can do other work during BME680 measurement."));
  delay(50); // This represents parallel work.
  // There's no need to delay() until millis() >= endTime: bme.endReading()
  // takes care of that. It's okay for parallel work to take longer than
  // BME680's measurement time.

  // Obtain measurement results from BME680. Note that this operation isn't
  // instantaneous even if milli() >= endTime due to I2C/SPI latency.
  if (!bme.endReading()) {
    Serial.println(F("Failed to complete reading :("));
    return;
  }
  Serial.print(F("Reading completed at "));
  Serial.println(millis());

  Serial.print(F("Temperature = "));
  Serial.print(bme.temperature);
  Serial.println(F(" *C"));

  Serial.print(F("Pressure = "));
  Serial.print(bme.pressure / 100.0);
  Serial.println(F(" hPa"));

  Serial.print(F("Humidity = "));
  Serial.print(bme.humidity);
  Serial.println(F(" %"));

  Serial.print(F("Gas = "));
  Serial.print(bme.gas_resistance / 1000.0);
  Serial.println(F(" KOhms"));

  Serial.print(F("Approx. Altitude = "));
  Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
  Serial.println(F(" m"));

  Serial.println();
  delay(2000);
}
				
			

خروجی

کد را روی برد ESP8266 خود آپلود کنید. به Tools > Board بروید و برد ESP8266 مورد استفاده خود را انتخاب کنید. به Tools > Port بروید و پورتی که بردتان به آن وصل است را انتخاب کنید. سپس، روی دکمه آپلود کلیک کنید.

مانیتور سریال را با نرخ باود 115200 باز کنید، دکمه RST روی برد را فشار دهید. اندازه گیری سنسور نمایش داده خواهد شد.

توجه: اگر از ارتباط SPI استفاده می کنید، مدار را پس از فشار دادن دکمه RST سیم کشی کنید.

راه اندازی سنسور BME680 با استفاده از ESP8266 اندازه گیری گاز، فشار، رطوبت و دما به صورت ساده و وب سرور

کد – ESP8266 NodeMCU وب سرور با BME680

در این بخش، نمونه ای از وب سرور را ارائه می دهیم که می توانید با ESP8266 بسازید تا مقادیر BME680 را نمایش دهید.

راه اندازی سنسور BME680 با استفاده از ESP8266 اندازه گیری گاز، فشار، رطوبت و دما به صورت ساده و وب سرور

نصب کتابخانه ها – وب سرور Async

برای ساخت وب سرور باید کتابخانه های زیر را نصب کنید. برای دانلود کتابخانه ها روی لینک های زیر کلیک کنید

این کتابخانه‌ها برای نصب از طریق Arduino Library Manager در دسترس نیستند، بنابراین باید فایل‌های کتابخانه را در پوشه Arduino Installation Libraries کپی کنید. از طرف دیگر، در Arduino IDE خود، می توانید به Sketch > Include Library > Add .zip Library بروید و کتابخانه هایی را که به تازگی دانلود کرده اید انتخاب کنید.

کد

سپس کد زیر را روی برد خود آپلود کنید (SSID و رمز عبور خود را وارد کنید).

				
					/*********
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/esp8266-nodemcu-bme680-sensor-arduino/
  
  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.
  
  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*********/

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BME680.h"
#include <ESP8266WiFi.h>
#include "ESPAsyncWebServer.h"

// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

//Uncomment if using SPI
/*#define BME_SCK 14
#define BME_MISO 12
#define BME_MOSI 13
#define BME_CS 15*/

Adafruit_BME680 bme; // I2C
//Adafruit_BME680 bme(BME_CS); // hardware SPI
//Adafruit_BME680 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK);

float temperature;
float humidity;
float pressure;
float gasResistance;

AsyncWebServer server(80);
AsyncEventSource events("/events");

unsigned long lastTime = 0;  
unsigned long timerDelay = 30000;  // send readings timer

void getBME680Readings(){
  // Tell BME680 to begin measurement.
  unsigned long endTime = bme.beginReading();
  if (endTime == 0) {
    Serial.println(F("Failed to begin reading :("));
    return;
  }
  if (!bme.endReading()) {
    Serial.println(F("Failed to complete reading :("));
    return;
  }
  temperature = bme.temperature;
  pressure = bme.pressure / 100.0;
  humidity = bme.humidity;
  gasResistance = bme.gas_resistance / 1000.0;
}

String processor(const String& var){
  getBME680Readings();
  //Serial.println(var);
  if(var == "TEMPERATURE"){
    return String(temperature);
  }
  else if(var == "HUMIDITY"){
    return String(humidity);
  }
  else if(var == "PRESSURE"){
    return String(pressure);
  }
  else if(var == "GAS"){
    return String(gasResistance);
  }
  return String();
}

const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html>
<head>
  <title>BME680 Web Server</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link data-asynced="1" as="style" onload="this.onload=null;this.rel='stylesheet'"  rel="preload" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
  <link rel="icon" href="data:,"><style>html {font-family: Arial; display: inline-block; text-align: center;}
    p {  font-size: 1.2rem;}
    body {  margin: 0;}
    .topnav { overflow: hidden; background-color: #4B1D3F; color: white; font-size: 1.7rem; }
    .content { padding: 20px; }
    .card { background-color: white; box-shadow: 2px 2px 12px 1px rgba(140,140,140,.5); }
    .cards { max-width: 700px; margin: 0 auto; display: grid; grid-gap: 2rem; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); }
    .reading { font-size: 2.8rem; }
    .card.temperature { color: #0e7c7b; }
    .card.humidity { color: #17bebb; }
    .card.pressure { color: #3fca6b; }
    .card.gas { color: #d62246; }</style></head>
<body>
  <div class="topnav">
    <h3>BME680 WEB SERVER</h3>
  </div>
  <div class="content">
    <div class="cards">
      <div class="card temperature">
        <h4><i class="fas fa-thermometer-half"></i> TEMPERATURE</h4><p><span class="reading"><span id="temp">%TEMPERATURE%</span> &deg;C</span></p>
      </div>
      <div class="card humidity">
        <h4><i class="fas fa-tint"></i> HUMIDITY</h4><p><span class="reading"><span id="hum">%HUMIDITY%</span> &percnt;</span></p>
      </div>
      <div class="card pressure">
        <h4><i class="fas fa-angle-double-down"></i> PRESSURE</h4><p><span class="reading"><span id="pres">%PRESSURE%</span> hPa</span></p>
      </div>
      <div class="card gas">
        <h4><i class="fas fa-wind"></i> GAS</h4><p><span class="reading"><span id="gas">%GAS%</span> K&ohm;</span></p>
      </div>
    </div>
  </div> <script type="litespeed/javascript">if(!!window.EventSource){var source=new EventSource('/events');source.addEventListener('open',function(e){console.log("Events Connected")},!1);source.addEventListener('error',function(e){if(e.target.readyState!=EventSource.OPEN){console.log("Events Disconnected")}},!1);source.addEventListener('message',function(e){console.log("message",e.data)},!1);source.addEventListener('temperature',function(e){console.log("temperature",e.data);document.getElementById("temp").innerHTML=e.data},!1);source.addEventListener('humidity',function(e){console.log("humidity",e.data);document.getElementById("hum").innerHTML=e.data},!1);source.addEventListener('pressure',function(e){console.log("pressure",e.data);document.getElementById("pres").innerHTML=e.data},!1);source.addEventListener('gas',function(e){console.log("gas",e.data);document.getElementById("gas").innerHTML=e.data},!1)}</script> <script data-no-optimize="1">!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).LazyLoad=e()}(this,function(){"use strict";function e(){return(e=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n,a=arguments[e];for(n in a)Object.prototype.hasOwnProperty.call(a,n)&&(t[n]=a[n])}return t}).apply(this,arguments)}function i(t){return e({},it,t)}function o(t,e){var n,a="LazyLoad::Initialized",i=new t(e);try{n=new CustomEvent(a,{detail:{instance:i}})}catch(t){(n=document.createEvent("CustomEvent")).initCustomEvent(a,!1,!1,{instance:i})}window.dispatchEvent(n)}function l(t,e){return t.getAttribute(gt+e)}function c(t){return l(t,bt)}function s(t,e){return function(t,e,n){e=gt+e;null!==n?t.setAttribute(e,n):t.removeAttribute(e)}(t,bt,e)}function r(t){return s(t,null),0}function u(t){return null===c(t)}function d(t){return c(t)===vt}function f(t,e,n,a){t&&(void 0===a?void 0===n?t(e):t(e,n):t(e,n,a))}function _(t,e){nt?t.classList.add(e):t.className+=(t.className?" ":"")+e}function v(t,e){nt?t.classList.remove(e):t.className=t.className.replace(new RegExp("(^|\\s+)"+e+"(\\s+|$)")," ").replace(/^\s+/,"").replace(/\s+$/,"")}function g(t){return t.llTempImage}function b(t,e){!e||(e=e._observer)&&e.unobserve(t)}function p(t,e){t&&(t.loadingCount+=e)}function h(t,e){t&&(t.toLoadCount=e)}function n(t){for(var e,n=[],a=0;e=t.children[a];a+=1)"SOURCE"===e.tagName&&n.push(e);return n}function m(t,e){(t=t.parentNode)&&"PICTURE"===t.tagName&&n(t).forEach(e)}function a(t,e){n(t).forEach(e)}function E(t){return!!t[st]}function I(t){return t[st]}function y(t){return delete t[st]}function A(e,t){var n;E(e)||(n={},t.forEach(function(t){n[t]=e.getAttribute(t)}),e[st]=n)}function k(a,t){var i;E(a)&&(i=I(a),t.forEach(function(t){var e,n;e=a,(t=i[n=t])?e.setAttribute(n,t):e.removeAttribute(n)}))}function L(t,e,n){_(t,e.class_loading),s(t,ut),n&&(p(n,1),f(e.callback_loading,t,n))}function w(t,e,n){n&&t.setAttribute(e,n)}function x(t,e){w(t,ct,l(t,e.data_sizes)),w(t,rt,l(t,e.data_srcset)),w(t,ot,l(t,e.data_src))}function O(t,e,n){var a=l(t,e.data_bg_multi),i=l(t,e.data_bg_multi_hidpi);(a=at&&i?i:a)&&(t.style.backgroundImage=a,n=n,_(t=t,(e=e).class_applied),s(t,ft),n&&(e.unobserve_completed&&b(t,e),f(e.callback_applied,t,n)))}function N(t,e){!e||0<e.loadingCount||0<e.toLoadCount||f(t.callback_finish,e)}function C(t,e,n){t.addEventListener(e,n),t.llEvLisnrs[e]=n}function M(t){return!!t.llEvLisnrs}function z(t){if(M(t)){var e,n,a=t.llEvLisnrs;for(e in a){var i=a[e];n=e,i=i,t.removeEventListener(n,i)}delete t.llEvLisnrs}}function R(t,e,n){var a;delete t.llTempImage,p(n,-1),(a=n)&&--a.toLoadCount,v(t,e.class_loading),e.unobserve_completed&&b(t,n)}function T(o,r,c){var l=g(o)||o;M(l)||function(t,e,n){M(t)||(t.llEvLisnrs={});var a="VIDEO"===t.tagName?"loadeddata":"load";C(t,a,e),C(t,"error",n)}(l,function(t){var e,n,a,i;n=r,a=c,i=d(e=o),R(e,n,a),_(e,n.class_loaded),s(e,dt),f(n.callback_loaded,e,a),i||N(n,a),z(l)},function(t){var e,n,a,i;n=r,a=c,i=d(e=o),R(e,n,a),_(e,n.class_error),s(e,_t),f(n.callback_error,e,a),i||N(n,a),z(l)})}function G(t,e,n){var a,i,o,r,c;t.llTempImage=document.createElement("IMG"),T(t,e,n),E(c=t)||(c[st]={backgroundImage:c.style.backgroundImage}),o=n,r=l(a=t,(i=e).data_bg),c=l(a,i.data_bg_hidpi),(r=at&&c?c:r)&&(a.style.backgroundImage='url("'.concat(r,'")'),g(a).setAttribute(ot,r),L(a,i,o)),O(t,e,n)}function D(t,e,n){var a;T(t,e,n),a=e,e=n,(t=It[(n=t).tagName])&&(t(n,a),L(n,a,e))}function V(t,e,n){var a;a=t,(-1<yt.indexOf(a.tagName)?D:G)(t,e,n)}function F(t,e,n){var a;t.setAttribute("loading","lazy"),T(t,e,n),a=e,(e=It[(n=t).tagName])&&e(n,a),s(t,vt)}function j(t){t.removeAttribute(ot),t.removeAttribute(rt),t.removeAttribute(ct)}function P(t){m(t,function(t){k(t,Et)}),k(t,Et)}function S(t){var e;(e=At[t.tagName])?e(t):E(e=t)&&(t=I(e),e.style.backgroundImage=t.backgroundImage)}function U(t,e){var n;S(t),n=e,u(e=t)||d(e)||(v(e,n.class_entered),v(e,n.class_exited),v(e,n.class_applied),v(e,n.class_loading),v(e,n.class_loaded),v(e,n.class_error)),r(t),y(t)}function $(t,e,n,a){var i;n.cancel_on_exit&&(c(t)!==ut||"IMG"===t.tagName&&(z(t),m(i=t,function(t){j(t)}),j(i),P(t),v(t,n.class_loading),p(a,-1),r(t),f(n.callback_cancel,t,e,a)))}function q(t,e,n,a){var i,o,r=(o=t,0<=pt.indexOf(c(o)));s(t,"entered"),_(t,n.class_entered),v(t,n.class_exited),i=t,o=a,n.unobserve_entered&&b(i,o),f(n.callback_enter,t,e,a),r||V(t,n,a)}function H(t){return t.use_native&&"loading"in HTMLImageElement.prototype}function B(t,i,o){t.forEach(function(t){return(a=t).isIntersecting||0<a.intersectionRatio?q(t.target,t,i,o):(e=t.target,n=t,a=i,t=o,void(u(e)||(_(e,a.class_exited),$(e,n,a,t),f(a.callback_exit,e,n,t))));var e,n,a})}function J(e,n){var t;et&&!H(e)&&(n._observer=new IntersectionObserver(function(t){B(t,e,n)},{root:(t=e).container===document?null:t.container,rootMargin:t.thresholds||t.threshold+"px"}))}function K(t){return Array.prototype.slice.call(t)}function Q(t){return t.container.querySelectorAll(t.elements_selector)}function W(t){return c(t)===_t}function X(t,e){return e=t||Q(e),K(e).filter(u)}function Y(e,t){var n;(n=Q(e),K(n).filter(W)).forEach(function(t){v(t,e.class_error),r(t)}),t.update()}function t(t,e){var n,a,t=i(t);this._settings=t,this.loadingCount=0,J(t,this),n=t,a=this,Z&&window.addEventListener("online",function(){Y(n,a)}),this.update(e)}var Z="undefined"!=typeof window,tt=Z&&!("onscroll"in window)||"undefined"!=typeof navigator&&/(gle|ing|ro)bot|crawl|spider/i.test(navigator.userAgent),et=Z&&"IntersectionObserver"in window,nt=Z&&"classList"in document.createElement("p"),at=Z&&1<window.devicePixelRatio,it={elements_selector:".lazy",container:tt||Z?document:null,threshold:300,thresholds:null,data_src:"src",data_srcset:"srcset",data_sizes:"sizes",data_bg:"bg",data_bg_hidpi:"bg-hidpi",data_bg_multi:"bg-multi",data_bg_multi_hidpi:"bg-multi-hidpi",data_poster:"poster",class_applied:"applied",class_loading:"litespeed-loading",class_loaded:"litespeed-loaded",class_error:"error",class_entered:"entered",class_exited:"exited",unobserve_completed:!0,unobserve_entered:!1,cancel_on_exit:!0,callback_enter:null,callback_exit:null,callback_applied:null,callback_loading:null,callback_loaded:null,callback_error:null,callback_finish:null,callback_cancel:null,use_native:!1},ot="src",rt="srcset",ct="sizes",lt="poster",st="llOriginalAttrs",ut="loading",dt="loaded",ft="applied",_t="error",vt="native",gt="data-",bt="ll-status",pt=[ut,dt,ft,_t],ht=[ot],mt=[ot,lt],Et=[ot,rt,ct],It={IMG:function(t,e){m(t,function(t){A(t,Et),x(t,e)}),A(t,Et),x(t,e)},IFRAME:function(t,e){A(t,ht),w(t,ot,l(t,e.data_src))},VIDEO:function(t,e){a(t,function(t){A(t,ht),w(t,ot,l(t,e.data_src))}),A(t,mt),w(t,lt,l(t,e.data_poster)),w(t,ot,l(t,e.data_src)),t.load()}},yt=["IMG","IFRAME","VIDEO"],At={IMG:P,IFRAME:function(t){k(t,ht)},VIDEO:function(t){a(t,function(t){k(t,ht)}),k(t,mt),t.load()}},kt=["IMG","IFRAME","VIDEO"];return t.prototype={update:function(t){var e,n,a,i=this._settings,o=X(t,i);{if(h(this,o.length),!tt&&et)return H(i)?(e=i,n=this,o.forEach(function(t){-1!==kt.indexOf(t.tagName)&&F(t,e,n)}),void h(n,0)):(t=this._observer,i=o,t.disconnect(),a=t,void i.forEach(function(t){a.observe(t)}));this.loadAll(o)}},destroy:function(){this._observer&&this._observer.disconnect(),Q(this._settings).forEach(function(t){y(t)}),delete this._observer,delete this._settings,delete this.loadingCount,delete this.toLoadCount},loadAll:function(t){var e=this,n=this._settings;X(t,n).forEach(function(t){b(t,e),V(t,n,e)})},restoreAll:function(){var e=this._settings;Q(e).forEach(function(t){U(t,e)})}},t.load=function(t,e){e=i(e);V(t,e)},t.resetStatus=function(t){r(t)},Z&&function(t,e){if(e)if(e.length)for(var n,a=0;n=e[a];a+=1)o(t,n);else o(t,e)}(t,window.lazyLoadOptions),t});!function(e,t){"use strict";function a(){t.body.classList.add("litespeed_lazyloaded")}function n(){console.log("[LiteSpeed] Start Lazy Load Images"),d=new LazyLoad({elements_selector:"[data-lazyloaded]",callback_finish:a}),o=function(){d.update()},e.MutationObserver&&new MutationObserver(o).observe(t.documentElement,{childList:!0,subtree:!0,attributes:!0})}var d,o;e.addEventListener?e.addEventListener("load",n,!1):e.attachEvent("onload",n)}(window,document);</script><script data-no-optimize="1">var litespeed_vary=document.cookie.replace(/(?:(?:^|.*;\s*)_lscache_vary\s*\=\s*([^;]*).*$)|^.*$/,"");litespeed_vary||fetch("/wp-content/plugins/litespeed-cache/guest.vary.php",{method:"POST",cache:"no-cache",redirect:"follow"}).then(e=>e.json()).then(e=>{console.log(e),e.hasOwnProperty("reload")&&"yes"==e.reload&&(sessionStorage.setItem("litespeed_docref",document.referrer),window.location.reload(!0))});</script><script data-optimized="1" type="litespeed/javascript" data-src="https://www.nelsco.ir/wp-content/litespeed/js/496e64896bb447997787547167ffba5b.js?ver=b007f"></script><script>const litespeed_ui_events=["mouseover","click","keydown","wheel","touchmove","touchstart"];var urlCreator=window.URL||window.webkitURL;function litespeed_load_delayed_js_force(){console.log("[LiteSpeed] Start Load JS Delayed"),litespeed_ui_events.forEach(e=>{window.removeEventListener(e,litespeed_load_delayed_js_force,{passive:!0})}),document.querySelectorAll("iframe[data-litespeed-src]").forEach(e=>{e.setAttribute("src",e.getAttribute("data-litespeed-src"))}),"loading"==document.readyState?window.addEventListener("DOMContentLoaded",litespeed_load_delayed_js):litespeed_load_delayed_js()}litespeed_ui_events.forEach(e=>{window.addEventListener(e,litespeed_load_delayed_js_force,{passive:!0})});async function litespeed_load_delayed_js(){let t=[];for(var d in document.querySelectorAll('script[type="litespeed/javascript"]').forEach(e=>{t.push(e)}),t)await new Promise(e=>litespeed_load_one(t[d],e));document.dispatchEvent(new Event("DOMContentLiteSpeedLoaded")),window.dispatchEvent(new Event("DOMContentLiteSpeedLoaded"))}function litespeed_load_one(t,e){console.log("[LiteSpeed] Load ",t);var d=document.createElement("script");d.addEventListener("load",e),d.addEventListener("error",e),t.getAttributeNames().forEach(e=>{"type"!=e&&d.setAttribute("data-src"==e?"src":e,t.getAttribute(e))});let a=!(d.type="text/javascript");!d.src&&t.textContent&&(d.src=litespeed_inline2src(t.textContent),a=!0),t.after(d),t.remove(),a&&e()}function litespeed_inline2src(t){try{var d=urlCreator.createObjectURL(new Blob([t.replace(/^(?:<!--)?(.*?)(?:-->)?$/gm,"$1")],{type:"text/javascript"}))}catch(e){d="data:text/javascript;base64,"+btoa(t.replace(/^(?:<!--)?(.*?)(?:-->)?$/gm,"$1"))}return d}</script></body>
</html>)rawliteral";

void setup() {
  Serial.begin(115200);

  // Set the device as a Station and Soft Access Point simultaneously
  WiFi.mode(WIFI_AP_STA);
  
  // Set device as a Wi-Fi Station
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Setting as a Wi-Fi Station..");
  }
  Serial.print("Station IP Address: ");
  Serial.println(WiFi.localIP());
  Serial.println();

  // Init BME680 sensor
  if (!bme.begin()) {
    Serial.println(F("Could not find a valid BME680 sensor, check wiring!"));
    while (1);
  }
  // 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

  // Handle Web Server
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/html", index_html, processor);
  });

  // Handle Web Server Events
  events.onConnect([](AsyncEventSourceClient *client){
    if(client->lastId()){
      Serial.printf("Client reconnected! Last message ID that it got is: %u\n", client->lastId());
    }
    // send event with message "hello!", id current millis
    // and set reconnect delay to 1 second
    client->send("hello!", NULL, millis(), 10000);
  });
  server.addHandler(&events);
  server.begin();
}

void loop() {
  if ((millis() - lastTime) > timerDelay) {
    getBME680Readings();
    Serial.printf("Temperature = %.2f ºC \n", temperature);
    Serial.printf("Humidity = %.2f % \n", humidity);
    Serial.printf("Pressure = %.2f hPa \n", pressure);
    Serial.printf("Gas Resistance = %.2f KOhm \n", gasResistance);
    Serial.println();

    // Send Events to the Web Server with the Sensor Readings
    events.send("ping",NULL,millis());
    events.send(String(temperature).c_str(),"temperature",millis());
    events.send(String(humidity).c_str(),"humidity",millis());
    events.send(String(pressure).c_str(),"pressure",millis());
    events.send(String(gasResistance).c_str(),"gas",millis());
    
    lastTime = millis();
  }
}' );
				
			

پس از آپلود، مانیتور سریال را با نرخ باود 115200 باز کنید تا آدرس IP ESP8266 را دریافت کنید.

یک مرورگر باز کنید و آدرس IP را تایپ کنید. شما باید با آخرین مقادیر حسگرها به وب سرور دسترسی داشته باشید. می توانید به وب سرور در رایانه، تبلت یا تلفن هوشمند خود در شبکه محلی خود دسترسی داشته باشید.

راه اندازی سنسور BME680 با استفاده از ESP8266 اندازه گیری گاز، فشار، رطوبت و دما به صورت ساده و وب سرور

قرائت ها به طور خودکار در سرور وب با استفاده از رویدادهای ارسال شده از سرور به روز می شوند.

جمع بندی

ماژول حسگر BME680 یک سنسور دیجیتال 4 در 1 است که سنسورهای گاز، فشار، دما و رطوبت را ترکیب می کند. BME680 دارای یک سنسور MOX است که حضور بیشتر گازهای VOC را حس می کند. این حسگر به شما یک ایده کیفی از مجموع VOCs / آلاینده ها در هوای اطراف می دهد. به همین دلیل می توان از BME680 برای نظارت بر کیفیت هوای داخل خانه استفاده کرد.

در این آموزش ما نحوه راه اندازی این سنسور به صورت ساده روی پورت سریال و به صورت وب سرور را راه اندازی کردیم.

آموزش مرتبط : راه اندازی سنسور DS18B20 با ESP8266 در حالت تکی ، چندتایی و وب سرور (اینترنت اشیا)

برای امتیاز به این نوشته کلیک کنید!
[کل: 0 میانگین: 0]

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *