در این مقاله آموزشی سعی داریم، نحوه استفاده از ماژول سنسور BME680 با برد Arduino uno را آموزش دهیم.سنسور دیجیتال زیست محیطی BME680 گاز،فشار،رطوبت و دما را اندازه گیری می کند.
این سنسور به یک میکروکنترولر با استفاده از پروتکل ارتباطی I2C یا SPI متصل می شود.
در این پست شما نحوه اتصال سنسور BME680 به آردوینو، نصب کتابخانه های مورد نیاز و شرح کامل یک پروژه کاربردی و ساده برای خواندن نتایج در مانیتور سریال را آموزش خواهید دید.
معرفی ماژول سنسور زیست محیطی BME680
سنسور BME680 سنسور های گاز، فشار، رطوبت و دما را ترکیب می کند. سنسور گاز قابلیت تشخیص بازه گازها مانند ترکیبات آلی فرار را دارد. به همین دلیل BME680 برای کنترل کیفیت هوای داخلی استفاده شود.
اندازه گیری های سنسور BME680
یک سنسور دیجیتال 1*4 با قابلیت اندازه گیری پارامترهای زیر می باشد :
- دما
- رطوبت
- فشار بارومتریک
- گاز : ترکیبات آلی فرار (VOC)مانند اتانول و کربن منو اکسید
سنسور گاز
سنسور BME680 دارای یک اکسید فلز (MOX) که ترکیبات آلی فرار (VOC) موجود در هوا را شناسایی می کند و یک ایده کیفی از مجموع ترکیبات آلی فرار / آلاینده های موجود در هوای اطراف به شما می دهد.( مشخصاً مربوط به یک مولکول ویژه گاز نیست.)
سطح سنسورهای MOX از اکسید فلز پوشیده شده و دارای یک چیپ برای اندازه گیری تغیییرات رسانایی و یک هیتر (بخاری) می باشد. این سنسور ترکیبات آلی فرار را از طریق جذب مولکول های اکسیژن در لایه های حساس آن، شناسایی می کند.
سنسور BME680 به اکثریت ترکیبات آلی فرار؛ که باعث آلودگی هوای داخلی می شوند، بجز کربن دی اکسید CO2 واکنش نشان می دهد.
وقتی که سنسور با گازهای کاهش دهنده در تماس قرار می گیرد، مولکول های اکسیژن واکنش نشان داده و رسانایی سطح را افزایش می دهند.(مانند یک ردیف سیگنال) در این مرحله سنسور BME680 مقادیر مقاومت را ارائه می دهد که این مقادیر به دلیل تغییرات غلظت تغییر می کند.
در شکل زیر روند بالا را به صورت شماتیک مشاهده می کنید :
نکته : غلظت بالاتر از ترکیبات آلی فرار (VOCs) به معنای مقاومت کمتر است و غلظت پایین تر از VOCها نشان دهنده مقاومت بالاتر می باشد.
واکنش هایی مانند مقاومت،که در سطح سنسور صورت می گیرد. تحت تاثیر پارامترهای دیگری از غلظت VOC (ترکیبات آلی فرار) مثل دما و رطوبت هستند.
اطلاعات مربوط به خواندن سنسور گاز
سنسور گاز به شما یک ایده کیفی از گازهای ترکیبات آلی فرار،هوای اطراف می دهد. بنابراین متوجه عملکرد روند خواهید شد. و با مقایسه نتایج بدست آمده متوجه تغییرات افزایش یا کاهش کیفیت هوا خواهید شد. دقت داشته باشید که برای دریافت نتایج اندازه گیری با دقت هر چه بهتر باید سنسور را در برابر منابع کالیبره کرده و یک منحنی کالیبراسیون رسم کنید.
وقتی برای اولین بار کار با سنسور را شروع می کنید. توصیه می شود بعد از حمع آوری داده های “واقعی” سنسور را به مدت 48 ساعت و30 دقیقه قبل از شروع خواندن گاز در حال اجرا قرار دهید.
دقت سنسور BME680
جدول زیر دقت سنسور BME680 را نمایش پارامترهای دما،رطوبت و فشار نشان می دهد :
سنسور BME680 | دقت اندازه گیری |
دما | +/- 1.0 درجه سلسیوس |
رطوبت | +/- 3 % |
فشار | +/- 1 هکتوپاسکال |
محدوده اجرایی BME680
جدول زیر بازه کارکرد سنسور BME680 را نمایش پارامترهای دما،رطوبت و فشار نشان می دهد :
سنسورBME680 | بازه عددی عملکرد |
دما | -40 _ 85 درجه سلسیوس |
رطوبت | 0 _ 100 % |
فشار | 300 _ 1100 هکتوپاسکال |
پین های BME680
VCC | سنسور BME680 را تغذیه می کند |
GND | پین مشترک،اتصال به زمین |
SCL |
پین SCL سریال کلاک به پروتکل I2C پین SCK سریال کلاک به پروتکل SPI |
SDA |
پین SDA سریال دیتا به پروتکل I2C پین (SDI(MOSI سیگنال دیتا داخلی( پین master خارجی/ پین slave داخلی) به پروتکل SPI |
SDO | پین (SDO (MISO سیگنال دیتا خارجی (پین master داخلی/ پین slave خارجی) به پروتکل SPI |
CS | پین (CS(chip select به پروتکل SPI |
رابط سنسور BME680 چیست؟
رابط های سنسور BME680، پروتکل I2C و SPI هستند.
اتصال پروتکل I2C به سنسور BME680
نحوه اتصال پین های پروتکل رابط I2C به سنسور BME680 در جدول زیر مشاهده می کنید :
سنسور BME680 | برد Arduino |
پایه سریال کلاک SCL | A5 |
پایه سریال دیتا SDA | A4 |
اتصال پروتکل SPI به سنسور BME680
نحوه اتصال پین های پروتکل رابط SPI به سنسور BME680 در جدول زیر مشاهده می کنید :
سنسور BME680 | برد Arduino |
پین سریال کلاک (SCL (SCK SPI Clock | D13 |
پین سریال دیتا_ارسالی master وslave ورودی (SDI MOSI) | D11 |
پین سیگنال دیتا خروجی_ master ورودی و slave خروجی | D12 |
پبن (CS (cheep select | D10 |
قطعات مورد نیاز
جهت تکمیل آموخته های خود در این مقاله و شروع یک پروژه کاربردی و ساده شما باید قطعات زیر را تهیه کنید :
تمامی قطعات الکترونیکی خود را با هزینه ای به صرفه می توانید در اینجا پیدا کنید.
مدار شماتیک – سنسور BME680 به Arduino
همانطور که در قسمت های قبلی آموزش توضیح دادیم،این سنسور به هر دو پروتکل I2C و SPI می تواند متصل شود.
سنسور BME680 به Arduino / توسط I2C
مدار شماتیک اتصال سنسور دما، رطوبت و فشار BME680 به برد آردوینو توسط پروتکل رابط I2C، به صورت زیر است :
اتصال سنسور BME680 به Arduino توسط SPI
ممکن است شما از پروتکل SPI استفاده کنید. مدار شماتیک اتصال سنسور دما، رطوبت و فشار BME680 به برد آردوینو توسط پروتکل رابط SPI ، به صورت زیر است :
نصب کتابخانه سنسور BME680
برای دریافت پارامترهای ذکر شده در ابتدا این مقاله ( گاز،دما، فشار و رطوبت)، باید Adafruit_BME280 library را نصب کنید.
مراحل زیر را به ترتیب در Arduino IDE انجام دهید:
نرم افزار Arduino IDE را باز کنید به منوی Sketch بروید پس از آن به زیر منوی Include Library سپس به Manage Libraries وارد شوید.
عبارت “adafruit bme680 ” را سرچ کنید و کتابخانه را نصب کنید:
نصب کتابخانه Adafruit_Sensor
برای فعال سازی و استفاده از BME680 library؛ نصب کتابخانه موجود در سایت گیت هاب Adafruit_Sensor library ضروری است . مراحل نصب آن را در آردوینو IDE به شما آموزش خواهیم داد :
به منوی Sketch بروید. پس از آن به زیر منوی Include Library، سپس به Manage Libraries وارد شوید و عبارت “Adafruit Unified Sensor” را سرچ کنید. بعد از اینکه تا انتهای صفحه آمدید کتابخانه را پیدا و نصب کنید.
کدنویسی
برای خواندن گاز،دما،فشار و رطوبت ما از یک مدل طرح شده در کتابخانه استفاده می کنیم. بعد از نصب BME680 library و کتابخانه توسعه دهنده Adafruit_Sensor ، مسیر زیر را در Arduino IDE بروید :
ابتدا منو File را باز کنید. پس از آن به زیر منو Examples بروید سپس Adafruit BME680 Library بروید و در آخر bme680async را باز کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
/* * Complete Project Details https://ewink.ir/wiki */</p> <p style="text-align: right;">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 ***/</p> <p style="text-align: right;">#include <Wire.h> #include <SPI.h> #include <Adafruit_Sensor.h> #include "Adafruit_BME680.h"</p> <p style="text-align: right;">/*#define BME_SCK 13 #define BME_MISO 12 #define BME_MOSI 11 #define BME_CS 10*/</p> <p style="text-align: right;">#define SEALEVELPRESSURE_HPA (1013.25)</p> <p style="text-align: right;">Adafruit_BME680 bme; // I2C //Adafruit_BME680 bme(BME_CS); // hardware SPI //Adafruit_BME680 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK);</p> <p style="text-align: right;">void setup() { Serial.begin(115200); while (!Serial); Serial.println(F("BME680 async test"));</p> <p style="text-align: right;">if (!bme.begin()) { Serial.println(F("Could not find a valid BME680 sensor, check wiring!")); while (1); }</p> <p style="text-align: right;">// 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 }</p> <p style="text-align: right;">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);</p> <p style="text-align: right;">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.</p> <p style="text-align: right;">// 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());</p> <p style="text-align: right;">Serial.print(F("Temperature = ")); Serial.print(bme.temperature); Serial.println(F(" *C"));</p> <p style="text-align: right;">Serial.print(F("Pressure = ")); Serial.print(bme.pressure / 100.0); Serial.println(F(" hPa"));</p> <p style="text-align: right;">Serial.print(F("Humidity = ")); Serial.print(bme.humidity); Serial.println(F(" %"));</p> <p style="text-align: right;">Serial.print(F("Gas = ")); Serial.print(bme.gas_resistance / 1000.0); Serial.println(F(" KOhms"));</p> <p style="text-align: right;">Serial.print(F("Approx. Altitude = ")); Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA)); Serial.println(F(" m"));</p> <p style="text-align: right;">Serial.println(); delay(2000); } |
نحوه عملکرد کد
در این قسمت آموزش نحوه کارکرد کد را به شما آموزش می دهیم. اگر با این قسمت آشنایی لازمه را دارید، برای ادامه آموزش خود به انتهای مقاله بخش “نمایش” رجوع کنید.
کتابخانه ها
کد به واسطه کتابخانه هایی که لازم دارد شروع به کار می کند.کتابخانه wire با استفاده از کتابخانه پروتکل I2C و SPI (از کتابخانه هر کدام که برای استفاده انتخاب کرده اید.)کتابخانه های توسعه دهنده Adafruit_Sensor و Adafruit_BME680 سنسور BME680 را راه می اندازد.
1 2 3 4 |
#include <Wire.h> #include <SPI.h> #include <Adafruit_Sensor.h> #include "Adafruit_BME680.h" |
رابط SPI
به طور کلی توصیه ما استفاده از پروتکل I2C با سنسور BME680 است. اما اگر شما از پروتکلSPI استفاده می کنید، کافی است برای تعریف پین های SPI دستور زیر را از حالت کامنت خارج کنید :
1 2 3 4 |
/*#define BME_SCK 13 #define BME_MISO 12 #define BME_MOSI 11 #define BME_CS 10*/ |
فشار سطح دریا
یک متغیر به نام SEALEVELPRESSURE_HPA ایجاد کنید :
1 |
#define SEALEVELPRESSURE_HPA (1013.25) |
بعد از ایجا این متغیر قابلیت محاسبه فشار سطح دریا را بر حسب هکتوپاسکال (برابر با میلی بار) و تخمین ارتفاع برای فشار های مختلفی که وارد می کنید، بر اساس فشار سطح دریا را دارد.
این مثالی است با مقادیر پیش فرض، شما می توانید برای پروژه خودتان فشار سکون از سطح دریا را با توجه به موقعیت مکانی خودتان را محاسبه کنید.
پروتکل I2C
در این مثال به صورت پیش فرض از پروتکل I2C استفاده می شود.
در دستور زیر ابتدا یک آبجکت Adafruit_BME680 به نام bme بر پین های I2C، برد آردوینو :
(D5(SCL), D4 (SDA.
1 |
Adafruit_BME680 bme; // I2C |
برای استفاده از پروتکل SPI، شما باید دستور قبل را کامنت و دستور زیر را از حالت کامنت خارج کنید.
1 |
//Adafruit_BME680 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI |
()setup
در ()setup، یک ارتباط سریالی شروع می شود :
1 |
Serial.begin(115200); |
راه اندازی BME680
با دستور زیر سنسور BME680، مقدار دهی اولی می شود:
1 2 3 4 |
if (!bme.begin()) { Serial.println(F("Could not find a valid BME680 sensor, check wiring!")); while (1); } |
پارامترهای زیر را ست کنید :
- آور سمپلینگ
- فیلتر
- هیتر گازی
1 2 3 4 5 6 |
// 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 |
ما از پارامترهای آورسمپلینگ پیش فرض، استفاده می کنیم شما می توانید با توجه به گزینه های خودتان، آن ها را عوض کنید.🙂
- setTemperatureOversampling(): set temperature oversampling
- setHumidityOversampling(): set humidity oversampling
- setPressureOversampling(): set pressure oversampling
این متدها پارامترهای زیر را می تواند اکسپت کند :
- ;BME680_OS_NONE: turn off reading
- BME680_OS_1X
- BME680_OS_2X
- BME680_OS_4X
- BME680_OS_8X
- BME680_OS_16X
سنسور BME680 از یک فیلتر IIR برای کاهش تغییرات کوتاه مدتی، که در مقادیر خروجی سنسور ایجاد می شود، استفاده می کند.( عامل این تغییرات کوتاه مدت، اختلالات خارجی است.)
- BME680_FILTER_SIZE_0 (no filtering)
- BME680_FILTER_SIZE_1
- BME680_FILTER_SIZE_3
- BME680_FILTER_SIZE_7
- BME680_FILTER_SIZE_15
- BME680_FILTER_SIZE_31
- BME680_FILTER_SIZE_63
- BME680_FILTER_SIZE_127
در این قسمت برای تنظیم پروفایل یک هیتر، از متد ()setGasHeater استفاده می شود که آن را به عنوان آرگومان می پذیرد :
- دمای هیتر بر حسب درجه سانتی گراد
- مدت زمانی که هیتر باید روشن باشد بر حسب میلی ثانیه
به عنوان پیش فرض از دمای 320 درجه سانتی گراد برای 150 میلی ثانیه، استفاده می کنیم.
()loop
در ()loop، پارامترهای اندازه گیری شده توسط سنسور BME680 را دریافت می کنیم.
به عنوان قدم اول، به سنسور بگویید که یک خوانش نامتقارن را با دستور ()bme.beginReading را شروع کند.
1 2 3 4 5 6 7 8 9 10 |
// 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); |
سپس از متد ()endReading برای پایان دادن به خوانش نامتقارن، استفاده کنید.
اگر متوجه شدید که خواندن نامتقارن همچنان ادامه دارد، بلاک کنید.
1 2 3 4 |
if (!bme.endReading()) { Serial.println(F("Failed to complete reading :(")); return; } |
پس از مراحل بالا، ما می توانیم خواندن را از سنسور شروع کنیم :
- bme.temperature: returns temperature reading
- bme.pressure: returns pressure reading
- bme.humidity: returns humidity reading
- bme.gas_resistance: returns gas resistance
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Serial.print(F("Temperature = ")); Serial.print(bme.temperature); Serial.println(F(" *C"));</p> <p style="text-align: right;">Serial.print(F("Pressure = ")); Serial.print(bme.pressure / 100.0); Serial.println(F(" hPa"));</p> <p style="text-align: right;">Serial.print(F("Humidity = ")); Serial.print(bme.humidity); Serial.println(F(" %"));</p> <p style="text-align: right;">Serial.print(F("Gas = ")); Serial.print(bme.gas_resistance / 1000.0); Serial.println(F(" KOhms"));</p> <p style="text-align: right;">Serial.print(F("Approx. Altitude = ")); Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA)); Serial.println(F(" m")); |
نمایش
کد را در برد Arduino آپلود کنید.
به Tools بروید پس از آن به Board وارد شوید و برد آردوینو ای که استفاده می کنید را انتخاب کنید.
به Tools و پس از آن به Port وارد شوید و پورتی را که برد به آن متصل است انتخاب کنید و کلیک کنید تا آپلود شروع شود.
وارد مانیتور سریال با بادریت 115200 شوید. بر روی on-board RST که در پایین صفحه می باشد کلیک کنید. در این مرحله اندازه گیری های سنسورBME680 نمایش داده می شود :
جمع بندی مطالب فوق
ماژول سنسور BME680، یک سنسور دیجیتالی 4 در 1 اینچ است که سنسور گاز،فشار،دما و رطوبت در خود دارد.
سنسور BME680 شامل یک سنسور MOX است که وجود گازهایی ترکیبات آلی(VOC gases) را شناسایی می کند .
این سنسور یک ایده کیفی از مجموعه آلاینده ها / ترکیبات آلی فرار در هوای اطراف به شما می دهد. به همین خاطر است که از سنسور BME680 برای نظارت بر کیفیت هوای داخلی می توان استفاده کرد.
امیدواریم که این آموزش برای شما مفید واقع شده باشد.
برای آموزش های بیشتر و تکمیلی راجع به سنسورها، اینجا کلیک کنید.
- DHT11/DHT22 سنسور سنجش رطوبت و دما
- DS18B20 سنسور دما
- BMP180 سنسور بارومتریک
- آموزش جامع سنسور(فشار،دما،رطوبت) BME280 با بردArduino
در قسمت نظرات ایده ها و مطالب پیشنهادی خود را با ما به اشتراک بگذارید.