بازگشت

آموزش راه‌اندازی ماژول سنسور دما، رطوبت و فشار BME680 با آردوینو

مقدمه

به دنیای سنجش محیط زیست خوش آمدید! در عصری که تغییرات آب و هوایی و آلودگی در خط مقدم نگرانی‌های جهانی قرار دارند، درک و نظارت بر محیط اطراف ما اهمیت بسیاری پیدا کرده است. بدین منظور، به شما سنسور BME680 را معرفی می کنیم.
حسگر BME680 با توانایی اندازه‌گیری دما، رطوبت، فشار و ترکیبات آلی فرار (VOCs)، داده‌های ارزشمندی را ارائه می‌دهد که می‌توانیم از آنها برای بهبود کیفیت زندگی خود استفاده کنیم.
اما درک نحوه استفاده موثر از آن می تواند برای شما بسیار مفید باشد. در این آموزش، به نکات و تکنیک‌هایی می پردازیم که به شما کمک می‌کند حداکثر استفاده را از حسگر BME680 داشته باشید.

آنچه در این آموزش یاد می گیرید

• آشنایی با قابلیت های سنسور BME680
• خواندن پارامترهای محیطی (دما، رطوبت، فشار و غلظت گاز)
• افزایش دقت سنسور با کالیبراسیون و Oversampling

معرفی پایه‌های (Pinout) ماژول سنسور BME680

این ماژول دارای 6 پین به شرح زیر است:
Vcc: تغذیه ماژول – 5 ولت
GND: زمین
SCL: پایه کلاک برای پروتکل I2C
SDA: پایه دیتا برای پروتکل I2C
SDO: انتخاب آدرس پروتکل I2C
CS: مخفف Chip Select است اما در اینجا برای انتخاب پروتکل ارتباطی استفاده می شود.

آدرس I2C این ماژول را می‌توانید از بین 0x76 و 0x77 انتخاب کنید. پین SDO برای این منظور در نظر گرفته شده است. با اتصال این پین به GND یا Vcc، آدرس آن به ترتیب 0x76 و 0x77 خواهد شد.

در تصویر زیر می توانید پین اوت (Pinout) این ماژول را مشاهده کنید.

قابلیت ها و کاربردهای سنسور BME680

 BME680 یک سنسور با قابلیت اندازه گیری دما، رطوبت، فشار و غلظت گاز محیط اطراف است.
محدوده قابل اندازه گیری توسط این سنسور به صورت زیر است:
دما: 40- تا 85+ درجه سلسیوس
رطوبت: 0 تا 100% RH
فشار: 300 تا 1100 hPa (معادل 0.3 تا 1.1 بار)
همچنین، دقت اندازه گیری آن به شرح زیر است:
دما: 1 درجه سلسیوس
رطوبت:  حداکثر خطا: 3%±، خطای هیسترزیس: 1.5%±

فشار:  نویز RMS: 0.12Pa معادل 1.7cm ضریب ثابت دما: 1.3Pa/K± معادل 10.9cm± در 1 درجه سانتی گراد تغییر

با توجه به اینکه این سنسور می تواند 4 پارامتر محیطی را اندازه گیری کند، کاربردهای مختلفی را می تواند داشته باشد. بعضی از این کاربردها عبارتند از:

  • مانیتورینگ و تنظیم کیفیت هوای داخلی
  • هوشمدسازی منازل
  • اینترنت اشیا
  • پیش بینی وضع آب و هوا
  • بهبود عملکرد GPS
  • ناوبری داخل ساختمان (تشخیص تغییر طبقات، تشخیص آسانسور)
  • ناوبری خارج ساختمای
  • تفریحی و ورزشی
  • اندازه گیری سرعت عمودی

لوازمی که به آن احتیاج دارید

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

Arduino MEGA 2560** × 1
ماژول سنسور BME680 × 1
سیم جامپر نری – مادگی × 1

**: می توانید از هر آردوینو دیگر که دارای درگاه I2C باشد، استفاده کنید (در صورت استفاده از کتابخانه BSEC که در انتهای این آموزش معرفی شده، باید از آردوینو مگا و یا بردهای ESP استفاده کنید).

نرم‌افزار‌های مورد نیاز

Arduino IDE

راه‌اندازی سنسور BME680 با آردوینو

برای شروع کار با این سنسور، ابتدا بهتر است کمی با ماژول آن آشنا شوید. تصویر زیر، ماژول BME680 را نشان می دهد.

این ماژول، امکان برقراری ارتباط به دو صورت I2C و SPI را دارد. برای انتخاب حالت I2C یا SPI، باید پایه CS را به ترتیب به Vcc یا GND متصل کنید.
اما در حالت default، پروتکل ارتباطی I2C فعال است و ما در این آموزش با استفاده از همین پروتکل پیش خواهیم رفت.

سیم‌بندی

بنابر توضیحاتی که در قسمت قبل دادیم، سیم کشی بین سنسور BME680 و آردوینو مگا را مطابق با شکل زیر انجام دهید.

کد اندازه گیری پارامترهای محیطی با سنسور BME680 در آردوینو

ابتدا کتابخانه Adafruit BME680 را در نرم افزار آردوینو نصب و سپس کد زیر را بر روی برد آردوینوی خود آپلود کنید.

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

#define BME_SCK 13
#define BME_MISO 12
#define BME_MOSI 11
#define BME_CS 10

#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(9600);
 while (!Serial);
 Serial.println(F("BME680 test"));

 if (!bme.begin()) {
 Serial.println("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() {
 if (! bme.performReading()) {
 Serial.println("Failed to perform reading :(");
 return;
 }
 Serial.print("Temperature = ");
 Serial.print(bme.temperature);
 Serial.println(" *C");

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

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

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

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

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

توضیحات کد

طبق معمول، اولین مرحله، بارگذاری کتابخانه های مورد نیاز است.

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

سپس فشار اتمسفر در سطح دریا را برای کد تعریف می کنیم تا در محاسبات ارتفاع از آن استفاده شود.

#define SEALEVELPRESSURE_HPA (1013.25)
Arduino

حال یک Instance از نوع سنسور BME680 می سازیم.

Adafruit_BME680 bme; // I2C
Arduino

حال وارد تابع Setup می شویم. در این تابع، یک ارتباط سریال با کامپیوتر و یک ارتباط از نوع I2C با سنسور BME680 برقرار می کنیم. در صورت عدم موفقیت در اتصال به سنسور، عبارت “Could not find a valid BME680 sensor, check wiring!” را در درگاه سریال نمایش می دهیم.
خط زیر برای تنظیم هیتر سنسور گاز است. با پارامتر اول و دوم، به ترتیب می توانید دمای هیتر و مدت زمان روشن بودن آن را تنظیم کنید.

bme.setGasHeater(320, 150); // 320*C for 150 ms
Arduino

در ادامه وارد حلقه loop می شویم. در ابتدای این حلقه، ابتدا با کد زیر از تمامی داده های خروجی سنسور نمونه برداری می کنیم.

bme.performReading()
Arduino

با این کار، دما، رطوبت، فشار و میزان گاز محیط اندازه گیری می شود.
می توانید به هریک از داده های اندازه گیری شده، به صورت زیر دسترسی پیدا کنید.
دما بر مبنای درجه سانتیگراد: bme.temperature
رطوبت بر مبنای درصد نسبی: bme.humidity
میزان گاز به صورت مقاومت بر مبنای اهم: bme.gas_resistance
ارتفاع بر مبنای پاسکال: bme.readAltitude(SEALEVELPRESSURE_HPA)
در حلقه loop()، پارامترها را هر 2 ثانیه اندازه گیری کرده و آنها را در درگاه سریال نمایش می دهیم.

مشاهده نتایج

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

BME680 test
Temperature = 29.37 *C
Pressure = 866.53 hPa
Humidity = 28.59 %
Gas = 80.58 KOhms
Approx. Altitude = 1300.03 m

Temperature = 29.83 *C
Pressure = 866.55 hPa
Humidity = 27.85 %
Gas = 87.49 KOhms
Approx. Altitude = 1299.65 m
Arduino

افزایش دقت نمونه‌برداری سنسور BME680

در قسمت قبل، نحوه اندازه گیری پارامترها را آموزش دادیم. در اندازه گیری های انجام شده، داده های خام را از روی سنسور خوانده و در درگاه سریال چاپ کردیم. اما دقت داده های اندازه گیری شده را می توانید به روش های مختلف ارتقا دهید.
همه سنسورها دارای چندین نوع خطا هستند مانند Random Noise، Repeatability، هیسترزیس (Offset)، غیر‌خطی بودن (Non-linearity) و غیره. برای هریک از آنها راه حل هایی وجود دارد. در ادامه، بعضی از این راه حل ها را برای ارتقای دقت اندازه گیری سنسور BME680 ذکر می‌کنیم.

جانمایی صحیح سنسور

در کاربردهای داخل ساختمان، جانمایی سنسور بسیار اهمیت دارد زیرا هوا در آن به شکل مناسبی چرخش پیدا نمی کند.
در جانمایی سنسور، سعی کنید آن را در نزدیکی منابع حرارتی قرار ندهید. همچنین آن را در جایی قرار دهید که در دسترس باشد.

کالیبراسیون

اغلب سنسورها دارای یک میزان مشخصی از خطای Offset و non-linearity هستند. برای از بین بردن اثرات سوء هر یک از آنها، راه حل هایی وجود دارد.
مثلاً برای از بین بردن خطای Offset، مطمئن ترین راه استفاده از داده مرجع است. می‌توانید آن را به صورت غیر مستقیم، با یخ آب مقطر تماس دهید. دمای انجماد آب مقطر بدون آلودگی را می توانید با استفاده از ارتفاع از سطح دریا یا فشار اتمسفر محیط اطراف سنسور محاسبه کنید. اختلاف بین مقادیر اندازه گیری شده و مقدار محاسباتی، میزان Offset سنسور شما را نمایش می دهد.

می توانید برای از بین بردن Offset دیگر پارامترهای اندازه گیری شده، از روش مشابه استفاده کنید.
اما برای از بین بردن Non-linearity، به یک دستگاه اندازه گیری دقیق نیاز دارید. با قرار دادن سنسور و دستگاه مرجع در شرایط محیطی مختلف، مقادیر اندازه گیری شده دو دستگاه را با یکدیگر مقایسه کرده و برای هریک از آنها یک نمودار رسم کنید. منحنی اندازه گیری سنسور، باید به صورت خطی باشد. در غیر اینصورت، می توانید معادله منحنی ای را که رابطۀ بین مقدار اندازه گیری شده و مقدار واقعی را نشان می دهد به دست آورید و در اندازه گیری های بعدی، مقدار واقعی را از روی مقدار اندازه گیری شده محاسبه کنید.

نمونه‌برداری بیش از حد از داده‌های حسگر (Oversampling)

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

  • فیلتر هم وزن (Oversampling): ابتدا چندین بار نمونه برداری کرده و سپس میانگین مقادیر اندازه گیری شده را محاسبه می کنیم. در مقدار به دست آمده، اثر random noise کاهش می باید. عیب این روش: سرعت پاسخگویی پایین نسبت به تغییرات ناگهانی در پارامتر اندازه گیری شده.
  • فیلتر وزن-متغیر (IIR): مقادیر نمونه برداری شده را بر اساس به روز بودن آنها ارزشگذاری کرده و از آنها میانگین وزن-دار می گیریم. این روش، زمان پاسخگویی بهتری دارد.

سنسو BME، هر دو نوع فیلتر را به صورت داخلی دارد. در صورت فعال کردن فیلتر IIR، رزولوشن مقادیر اندازه گیری شده 20 بیت خواهد بود. فیلتر Oversampling بسته به تعداد داده های نمونه، باعث افزایش رزولوشن می شود. شما می توانید تعداد داده های نمونه برداری فیلتر را از بین 2، 4 ، 8 و 16 انتخاب کنید. ما در اینجا، برای داده های دما، رطوبت و فشار، به ترتیب 8، 2 و 16 نمونه برداری اضافی انجام  می دهیم.
برای فعال شدن هر دو نوع فیلتر معرفی شده، خطوط زیر را در خط 17 برنامه اضافه کنید و آن را بر روی آردوینو بارگذاری کنید.

  bme.setTemperatureOversampling(BME680_OS_8X);
  bme.setHumidityOversampling(BME680_OS_2X);
  bme.setPressureOversampling(BME680_OS_16X);
  bme.setIIRFilterSize(BME680_FILTER_SIZE_127);
Arduino

می‌توانید با اجرای کد، خروجی آن را در سریال مانیتور مشاهده کنید.

یک گام جلوتر

در این آموزش، با نحوه راه‌اندازی سنسور BME680 آشنا شدیم. همانطور که متوجه شدید، این سنسور قابلیت های مناسبی دارد. می توانید با کمی خلاقیت کارهای بسیاری را با استفاده از این سنسور انجام دهید.
برای درک بهتر از کیفیت هوای محیط اطراف، می توانید از نرم افزار BSEC استفاده کنید. این نرم‌افزار، میکروکنترلرهای مختلفی را پشتیبانی می کند و به شما این امکان را می‌دهد تا شاخص کیفیت هوا (IAQ) را با استفاده از الگوریتم پیشرفته بسنجید.
برای جزئیات بیشتر می توانید به دیتاشیت این قطعه مراجعه کنید که توضیحاتی را برای استفاده از نرم افزار BSEC ارائه می دهد.
همچنین می توانید کتابخانه BSEC2 را از این لینک دانلود کنید. این کتابخانه، انواع بردهای آردوینو از جمله ESP32، ESP8266، بردهای مبتنی بر AVR هشت بیتی و Cortex ARM (M0, M0+, M3, M4, M4_FPU, M7) را پشتیبانی می کند.
با این کتابخانه، می توانید کیفیت کار خود را به طور چشمگیری ارتقا دهید.

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

مقدمه

به دنیای سنجش محیط زیست خوش آمدید! در عصری که تغییرات آب و هوایی و آلودگی در خط مقدم نگرانی‌های جهانی قرار دارند، درک و نظارت بر محیط اطراف ما اهمیت بسیاری پیدا کرده است. بدین منظور، به شما سنسور BME680 را معرفی می کنیم.
حسگر BME680 با توانایی اندازه‌گیری دما، رطوبت، فشار و ترکیبات آلی فرار (VOCs)، داده‌های ارزشمندی را ارائه می‌دهد که می‌توانیم از آنها برای بهبود کیفیت زندگی خود استفاده کنیم.
اما درک نحوه استفاده موثر از آن می تواند برای شما بسیار مفید باشد. در این آموزش، به نکات و تکنیک‌هایی می پردازیم که به شما کمک می‌کند حداکثر استفاده را از حسگر BME680 داشته باشید.

آنچه در این آموزش یاد می گیرید

• آشنایی با قابلیت های سنسور BME680
• خواندن پارامترهای محیطی (دما، رطوبت، فشار و غلظت گاز)
• افزایش دقت سنسور با کالیبراسیون و Oversampling

معرفی پایه‌های (Pinout) ماژول سنسور BME680

این ماژول دارای 6 پین به شرح زیر است:
Vcc: تغذیه ماژول – 5 ولت
GND: زمین
SCL: پایه کلاک برای پروتکل I2C
SDA: پایه دیتا برای پروتکل I2C
SDO: انتخاب آدرس پروتکل I2C
CS: مخفف Chip Select است اما در اینجا برای انتخاب پروتکل ارتباطی استفاده می شود.

آدرس I2C این ماژول را می‌توانید از بین 0x76 و 0x77 انتخاب کنید. پین SDO برای این منظور در نظر گرفته شده است. با اتصال این پین به GND یا Vcc، آدرس آن به ترتیب 0x76 و 0x77 خواهد شد.

در تصویر زیر می توانید پین اوت (Pinout) این ماژول را مشاهده کنید.

قابلیت ها و کاربردهای سنسور BME680

 BME680 یک سنسور با قابلیت اندازه گیری دما، رطوبت، فشار و غلظت گاز محیط اطراف است.
محدوده قابل اندازه گیری توسط این سنسور به صورت زیر است:
دما: 40- تا 85+ درجه سلسیوس
رطوبت: 0 تا 100% RH
فشار: 300 تا 1100 hPa (معادل 0.3 تا 1.1 بار)
همچنین، دقت اندازه گیری آن به شرح زیر است:
دما: 1 درجه سلسیوس
رطوبت:  حداکثر خطا: 3%±، خطای هیسترزیس: 1.5%±

فشار:  نویز RMS: 0.12Pa معادل 1.7cm ضریب ثابت دما: 1.3Pa/K± معادل 10.9cm± در 1 درجه سانتی گراد تغییر

با توجه به اینکه این سنسور می تواند 4 پارامتر محیطی را اندازه گیری کند، کاربردهای مختلفی را می تواند داشته باشد. بعضی از این کاربردها عبارتند از:

  • مانیتورینگ و تنظیم کیفیت هوای داخلی
  • هوشمدسازی منازل
  • اینترنت اشیا
  • پیش بینی وضع آب و هوا
  • بهبود عملکرد GPS
  • ناوبری داخل ساختمان (تشخیص تغییر طبقات، تشخیص آسانسور)
  • ناوبری خارج ساختمای
  • تفریحی و ورزشی
  • اندازه گیری سرعت عمودی

لوازمی که به آن احتیاج دارید

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

Arduino MEGA 2560** × 1
ماژول سنسور BME680 × 1
سیم جامپر نری – مادگی × 1

**: می توانید از هر آردوینو دیگر که دارای درگاه I2C باشد، استفاده کنید (در صورت استفاده از کتابخانه BSEC که در انتهای این آموزش معرفی شده، باید از آردوینو مگا و یا بردهای ESP استفاده کنید).

نرم‌افزار‌های مورد نیاز

Arduino IDE

راه‌اندازی سنسور BME680 با آردوینو

برای شروع کار با این سنسور، ابتدا بهتر است کمی با ماژول آن آشنا شوید. تصویر زیر، ماژول BME680 را نشان می دهد.

این ماژول، امکان برقراری ارتباط به دو صورت I2C و SPI را دارد. برای انتخاب حالت I2C یا SPI، باید پایه CS را به ترتیب به Vcc یا GND متصل کنید.
اما در حالت default، پروتکل ارتباطی I2C فعال است و ما در این آموزش با استفاده از همین پروتکل پیش خواهیم رفت.

سیم‌بندی

بنابر توضیحاتی که در قسمت قبل دادیم، سیم کشی بین سنسور BME680 و آردوینو مگا را مطابق با شکل زیر انجام دهید.

کد اندازه گیری پارامترهای محیطی با سنسور BME680 در آردوینو

ابتدا کتابخانه Adafruit BME680 را در نرم افزار آردوینو نصب و سپس کد زیر را بر روی برد آردوینوی خود آپلود کنید.

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

#define BME_SCK 13
#define BME_MISO 12
#define BME_MOSI 11
#define BME_CS 10

#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(9600);
 while (!Serial);
 Serial.println(F("BME680 test"));

 if (!bme.begin()) {
 Serial.println("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() {
 if (! bme.performReading()) {
 Serial.println("Failed to perform reading :(");
 return;
 }
 Serial.print("Temperature = ");
 Serial.print(bme.temperature);
 Serial.println(" *C");

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

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

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

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

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

توضیحات کد

طبق معمول، اولین مرحله، بارگذاری کتابخانه های مورد نیاز است.

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

سپس فشار اتمسفر در سطح دریا را برای کد تعریف می کنیم تا در محاسبات ارتفاع از آن استفاده شود.

#define SEALEVELPRESSURE_HPA (1013.25)
Arduino

حال یک Instance از نوع سنسور BME680 می سازیم.

Adafruit_BME680 bme; // I2C
Arduino

حال وارد تابع Setup می شویم. در این تابع، یک ارتباط سریال با کامپیوتر و یک ارتباط از نوع I2C با سنسور BME680 برقرار می کنیم. در صورت عدم موفقیت در اتصال به سنسور، عبارت “Could not find a valid BME680 sensor, check wiring!” را در درگاه سریال نمایش می دهیم.
خط زیر برای تنظیم هیتر سنسور گاز است. با پارامتر اول و دوم، به ترتیب می توانید دمای هیتر و مدت زمان روشن بودن آن را تنظیم کنید.

bme.setGasHeater(320, 150); // 320*C for 150 ms
Arduino

در ادامه وارد حلقه loop می شویم. در ابتدای این حلقه، ابتدا با کد زیر از تمامی داده های خروجی سنسور نمونه برداری می کنیم.

bme.performReading()
Arduino

با این کار، دما، رطوبت، فشار و میزان گاز محیط اندازه گیری می شود.
می توانید به هریک از داده های اندازه گیری شده، به صورت زیر دسترسی پیدا کنید.
دما بر مبنای درجه سانتیگراد: bme.temperature
رطوبت بر مبنای درصد نسبی: bme.humidity
میزان گاز به صورت مقاومت بر مبنای اهم: bme.gas_resistance
ارتفاع بر مبنای پاسکال: bme.readAltitude(SEALEVELPRESSURE_HPA)
در حلقه loop()، پارامترها را هر 2 ثانیه اندازه گیری کرده و آنها را در درگاه سریال نمایش می دهیم.

مشاهده نتایج

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

BME680 test
Temperature = 29.37 *C
Pressure = 866.53 hPa
Humidity = 28.59 %
Gas = 80.58 KOhms
Approx. Altitude = 1300.03 m

Temperature = 29.83 *C
Pressure = 866.55 hPa
Humidity = 27.85 %
Gas = 87.49 KOhms
Approx. Altitude = 1299.65 m
Arduino

افزایش دقت نمونه‌برداری سنسور BME680

در قسمت قبل، نحوه اندازه گیری پارامترها را آموزش دادیم. در اندازه گیری های انجام شده، داده های خام را از روی سنسور خوانده و در درگاه سریال چاپ کردیم. اما دقت داده های اندازه گیری شده را می توانید به روش های مختلف ارتقا دهید.
همه سنسورها دارای چندین نوع خطا هستند مانند Random Noise، Repeatability، هیسترزیس (Offset)، غیر‌خطی بودن (Non-linearity) و غیره. برای هریک از آنها راه حل هایی وجود دارد. در ادامه، بعضی از این راه حل ها را برای ارتقای دقت اندازه گیری سنسور BME680 ذکر می‌کنیم.

جانمایی صحیح سنسور

در کاربردهای داخل ساختمان، جانمایی سنسور بسیار اهمیت دارد زیرا هوا در آن به شکل مناسبی چرخش پیدا نمی کند.
در جانمایی سنسور، سعی کنید آن را در نزدیکی منابع حرارتی قرار ندهید. همچنین آن را در جایی قرار دهید که در دسترس باشد.

کالیبراسیون

اغلب سنسورها دارای یک میزان مشخصی از خطای Offset و non-linearity هستند. برای از بین بردن اثرات سوء هر یک از آنها، راه حل هایی وجود دارد.
مثلاً برای از بین بردن خطای Offset، مطمئن ترین راه استفاده از داده مرجع است. می‌توانید آن را به صورت غیر مستقیم، با یخ آب مقطر تماس دهید. دمای انجماد آب مقطر بدون آلودگی را می توانید با استفاده از ارتفاع از سطح دریا یا فشار اتمسفر محیط اطراف سنسور محاسبه کنید. اختلاف بین مقادیر اندازه گیری شده و مقدار محاسباتی، میزان Offset سنسور شما را نمایش می دهد.

می توانید برای از بین بردن Offset دیگر پارامترهای اندازه گیری شده، از روش مشابه استفاده کنید.
اما برای از بین بردن Non-linearity، به یک دستگاه اندازه گیری دقیق نیاز دارید. با قرار دادن سنسور و دستگاه مرجع در شرایط محیطی مختلف، مقادیر اندازه گیری شده دو دستگاه را با یکدیگر مقایسه کرده و برای هریک از آنها یک نمودار رسم کنید. منحنی اندازه گیری سنسور، باید به صورت خطی باشد. در غیر اینصورت، می توانید معادله منحنی ای را که رابطۀ بین مقدار اندازه گیری شده و مقدار واقعی را نشان می دهد به دست آورید و در اندازه گیری های بعدی، مقدار واقعی را از روی مقدار اندازه گیری شده محاسبه کنید.

نمونه‌برداری بیش از حد از داده‌های حسگر (Oversampling)

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

  • فیلتر هم وزن (Oversampling): ابتدا چندین بار نمونه برداری کرده و سپس میانگین مقادیر اندازه گیری شده را محاسبه می کنیم. در مقدار به دست آمده، اثر random noise کاهش می باید. عیب این روش: سرعت پاسخگویی پایین نسبت به تغییرات ناگهانی در پارامتر اندازه گیری شده.
  • فیلتر وزن-متغیر (IIR): مقادیر نمونه برداری شده را بر اساس به روز بودن آنها ارزشگذاری کرده و از آنها میانگین وزن-دار می گیریم. این روش، زمان پاسخگویی بهتری دارد.

سنسو BME، هر دو نوع فیلتر را به صورت داخلی دارد. در صورت فعال کردن فیلتر IIR، رزولوشن مقادیر اندازه گیری شده 20 بیت خواهد بود. فیلتر Oversampling بسته به تعداد داده های نمونه، باعث افزایش رزولوشن می شود. شما می توانید تعداد داده های نمونه برداری فیلتر را از بین 2، 4 ، 8 و 16 انتخاب کنید. ما در اینجا، برای داده های دما، رطوبت و فشار، به ترتیب 8، 2 و 16 نمونه برداری اضافی انجام  می دهیم.
برای فعال شدن هر دو نوع فیلتر معرفی شده، خطوط زیر را در خط 17 برنامه اضافه کنید و آن را بر روی آردوینو بارگذاری کنید.

  bme.setTemperatureOversampling(BME680_OS_8X);
  bme.setHumidityOversampling(BME680_OS_2X);
  bme.setPressureOversampling(BME680_OS_16X);
  bme.setIIRFilterSize(BME680_FILTER_SIZE_127);
Arduino

می‌توانید با اجرای کد، خروجی آن را در سریال مانیتور مشاهده کنید.

یک گام جلوتر

در این آموزش، با نحوه راه‌اندازی سنسور BME680 آشنا شدیم. همانطور که متوجه شدید، این سنسور قابلیت های مناسبی دارد. می توانید با کمی خلاقیت کارهای بسیاری را با استفاده از این سنسور انجام دهید.
برای درک بهتر از کیفیت هوای محیط اطراف، می توانید از نرم افزار BSEC استفاده کنید. این نرم‌افزار، میکروکنترلرهای مختلفی را پشتیبانی می کند و به شما این امکان را می‌دهد تا شاخص کیفیت هوا (IAQ) را با استفاده از الگوریتم پیشرفته بسنجید.
برای جزئیات بیشتر می توانید به دیتاشیت این قطعه مراجعه کنید که توضیحاتی را برای استفاده از نرم افزار BSEC ارائه می دهد.
همچنین می توانید کتابخانه BSEC2 را از این لینک دانلود کنید. این کتابخانه، انواع بردهای آردوینو از جمله ESP32، ESP8266، بردهای مبتنی بر AVR هشت بیتی و Cortex ARM (M0, M0+, M3, M4, M4_FPU, M7) را پشتیبانی می کند.
با این کتابخانه، می توانید کیفیت کار خود را به طور چشمگیری ارتقا دهید.

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

دیدگاه ها 0

درباره این مطلب دیدگاهی ارسال کنید