گاز و کیفیت هوا

آموزش BME680 با ESP32؛ سنجش گاز، دما، رطوبت و فشار

راهنمای پروژه‌محور BME680 با ESP32 و Arduino؛ دیتاشیت، آدرس I2C، سیم‌کشی، کد دما و رطوبت و فشار و مقاومت گاز، محدودیت IAQ و عیب‌یابی.

آموزش BME680 با ESP32؛ سنجش گاز، دما، رطوبت و فشار

آموزش پروژه‌محور پایش هوای داخل ساختمان

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

BME680 چهار کمیت دما، رطوبت نسبی، فشار و مقاومت بخش گازی را در یک تراشه جمع می‌کند. در این راهنما تفاوت تراشه خام و برد آماده، آدرس I2C، سیم‌کشی، کد عملی، گرم‌کن حسگر گاز و محدودیت تفسیر خروجی را مرحله‌به‌مرحله بررسی می‌کنیم. همه عددهای فنی با دیتاشیت رسمی Bosch و API کتابخانه Adafruit تطبیق داده شده‌اند.

برد واقعی Adafruit BME680 متصل به برد Feather و حسگر ذرات در یک نمونه پایش کیفیت هوای رومیزی
عکس واقعی یک نمونه پایش هوا با برد Adafruit BME680؛ اثر Ruiz Brothers با مجوز CC BY-SA 3.0، تغییر اندازه بدون برش برای LCENJ.
کمیت‌هادما، رطوبت، فشار و مقاومت گاز
تغذیه تراشه خامVDD: 1.71 تا 3.6V
رابط‌هاI2C و SPI
آدرس هفت‌بیتی0x76 یا 0x77

BME680 چیست و چه چیزی را اندازه می‌گیرد؟

BME680 یک حسگر محیطی چهاردر‌یک از Bosch Sensortec است. سه کانال آن دما، رطوبت نسبی و فشار هوا را اندازه می‌گیرند و کانال چهارم یک حسگر اکسید فلزی گرم‌شونده است که مقاومت الکتریکی آن در حضور ترکیبات آلی فرار و برخی گازهای کاهنده یا اکسیدکننده تغییر می‌کند.

این حسگر برای پایش روند هوای داخل اتاق، تهویه هوشمند، ایستگاه محیطی، ثبت شرایط انبار و پروژه‌های IoT مناسب است. بااین‌حال خروجی خام کتابخانه Adafruit فقط «مقاومت گاز بر حسب اهم» است؛ این عدد به‌تنهایی غلظت یک گاز مشخص، CO2 واقعی، ppm یا شاخص استاندارد IAQ نیست.

کاربردهای مناسب و نامناسب

تهویه هوشمند

تغییر مقاومت گاز، رطوبت و دما را در طول زمان ثبت کنید و فن را بر اساس خط مبنا و روند محیط کنترل کنید؛ تصمیم را فقط به یک نمونه لحظه‌ای وابسته نکنید.

ایستگاه محیطی

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

مقایسه رویدادها

اثر بازشدن پنجره، استفاده از مواد شوینده یا افزایش حضور افراد را می‌توان با ثبت زمان‌دار بررسی کرد؛ این تحلیل روند است، نه شناسایی شیمیایی ماده.

آلارم گاز

نامناسب است. حسگر MOX انتخاب‌پذیری کامل ندارد و خروجی خام نمی‌گوید کدام گاز با چه غلظتی حاضر است.

چطور دیتاشیت BME680 را درست بخوانیم؟

اول مشخص کنید عدد مربوط به تراشه خام است یا برد آماده. دیتاشیت Bosch برای خود تراشه، VDD برابر 1.71 تا 3.6 ولت و VDDIO برابر 1.2 تا 3.6 ولت تعریف می‌کند. برد Adafruit رگولاتور و Level Shifter دارد و طبق راهنمای همان برد، Vin و منطق 3 تا 5 ولت را می‌پذیرد. این ویژگی را نباید به هر ماژول بی‌نام تعمیم داد.

پارامتر رسمیمقدار یا وضعیتنتیجه عملی
VDD تراشه1.71 تا 3.6Vتراشه خام را مستقیم با 5V تغذیه نکنید.
VDDIO تراشه1.2 تا 3.6Vسطح منطق رابط باید در محدوده مجاز باشد.
دمای عملیاتی-40 تا +85°Cعملیاتی‌بودن با دقت کامل در همه بازه یکسان نیست.
بازه فشار با دقت کامل300 تا 1100hPaدقت مطلق فشار در دیتاشیت برای همین بازه تعریف شده است.
دقت مطلق فشار±0.6hPaارتفاع محاسبه‌شده به فشار مرجع روز و مکان وابسته است.
دقت رطوبت±3%RH در 20 تا 80%RH و 25°Cشرط اندازه‌گیری را همراه عدد دقت نقل کنید.
جریان گرم‌کن در 320°Cتیپیک 12mA، بیشینه 13mA در شرایط جدولگرم‌کن بخش غالب مصرف هنگام سنجش گاز است.
حالت‌های سطح پایینSleep و Forcedدر Forced یک چرخه TPHG انجام و سپس حسگر به Sleep برمی‌گردد.

واژه «Operational Range» فقط می‌گوید تراشه در آن محدوده قابل‌کار است. برای مثال دیتاشیت بخش گاز را از -40 تا 85 درجه و 10 تا 95 درصد رطوبت عملیاتی معرفی می‌کند، اما عملکرد واقعی به تاریخچه حسگر، دما، رطوبت، جریان هوا، زمان گرم‌شدن و تنظیم گرم‌کن وابسته است.

مقاومت گاز، VOC و IAQ چه تفاوتی دارند؟

سطح حساس MOX در BME680 گرم می‌شود. جذب و واکنش گازها هدایت سطح را تغییر می‌دهد و مدار داخلی آن را به مقاومت گاز تبدیل می‌کند. Adafruit توضیح می‌دهد که افزایش غلظت VOC معمولاً مقاومت را پایین می‌آورد، اما عدد مطلق میان حسگرها و محیط‌های مختلف قابل‌مقایسه مستقیم نیست.

دیتاشیت Bosch برای تولید IAQ از نرم‌افزار BSEC نام می‌برد. BSEC تاریخچه اندازه‌گیری و اثر دما و رطوبت را وارد محاسبه می‌کند و خروجی‌هایی مانند IAQ در بازه 0 تا 500 می‌سازد. کد ساده این مقاله از BSEC استفاده نمی‌کند؛ بنابراین مقدار gas_resistance را فقط به‌صورت مقاومت خام و برای ساخت خط مبنا و تحلیل روند نمایش می‌دهد.

آدرس I2C، پایه‌ها و انتخاب رابط

طبق دیتاشیت، آدرس هفت‌بیتی BME680 از الگوی 111011x ساخته می‌شود: اتصال SDO به GND آدرس 0x76 و اتصال آن به VDDIO آدرس 0x77 می‌دهد. SDO نباید شناور بماند، چون آدرس نامعین می‌شود. روی برد Adafruit آدرس پیش‌فرض 0x77 است و با جامپر SDO به GND به 0x76 تغییر می‌کند.

پایه برد Adafruitکاربرد در I2Cنکته
Vinتغذیه برددر برد مستند Adafruit برابر 3 تا 5V؛ برای ESP32 از 3.3V استفاده کنید.
GNDزمین مشترکزمین برد و ESP32 مشترک باشد.
SCKSCLکلاک I2C؛ در نام‌گذاری برد برای SPI نیز استفاده می‌شود.
SDISDAداده I2C؛ در نام‌گذاری برد برای SPI نیز استفاده می‌شود.
SDOانتخاب آدرسپایین: 0x76، بالا: 0x77؛ شناور نگذارید.
CSانتخاب SPIبرای اتصال I2C برد آماده طبق راهنمای Adafruit بدون اتصال می‌ماند.

BME680 رابط SPI سه‌سیمه و چهارسیمه را نیز پشتیبانی می‌کند و کلاک ورودی SPI طبق دیتاشیت تا 10MHz مجاز است. برای یک حسگر روی بردبورد، I2C سیم کمتری می‌خواهد؛ برای چند BME680 که دو آدرس I2C کافی نیست، SPI با CS جداگانه انتخاب ساده‌تری است.

سیم‌کشی BME680 با ESP32 و Arduino Uno

برد BME680 مستندGeneric ESP32Arduino Uno
Vin3V35V فقط برای برد Adafruit مستند
GNDGNDGND
SCK / SCLGPIO22A5 / SCL
SDI / SDAGPIO21A4 / SDA
SDOوضعیت پیش‌فرض برد برای 0x77وضعیت پیش‌فرض برد برای 0x77
CSبدون اتصال در I2Cبدون اتصال در I2C

GPIO21 و GPIO22 فقط پیش‌فرض Generic ESP32 هستند. مستند رسمی Arduino-ESP32 می‌گوید پایه‌های پیش‌فرض به برد وابسته‌اند؛ در ESP32-S3، ESP32-C3 یا طراحی سفارشی، پین‌های واقعی برد خود را جایگزین کنید. خطوط I2C به Pull-up نیاز دارند و مقدار مناسب به ولتاژ، طول سیم، ظرفیت باس و سرعت بستگی دارد.

راه‌اندازی گام‌به‌گام در Arduino IDE

  1. از Library Manager کتابخانه‌های Adafruit BME680 Library، Adafruit Unified Sensor و Adafruit BusIO را نصب کنید.
  2. برد و پورت درست ESP32 یا Arduino Uno را انتخاب کنید.
  3. سیم‌کشی را در حالت بدون تغذیه انجام دهید و مشخصات همان ماژول را بررسی کنید.
  4. کد i2c-scanner.ino را اجرا کنید؛ باید 0x77 یا 0x76 دیده شود.
  5. کد اصلی را آپلود و Serial Monitor را روی 115200 baud باز کنید.
  6. حسگر را با تنظیم ثابت چند دقیقه کار دهید و برای تحلیل روند، زمان بیشتری برای تثبیت و ساخت خط مبنا در نظر بگیرید.

کد عملی BME680 برای ESP32 و Arduino

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

#if defined(ESP32)
constexpr int SDA_PIN = 21;
constexpr int SCL_PIN = 22;
#endif

constexpr uint8_t BME680_ADDRESS = 0x77;
Adafruit_BME680 bme(&Wire);

void setup() {
  Serial.begin(115200);
#if defined(ESP32)
  Wire.begin(SDA_PIN, SCL_PIN);
#else
  Wire.begin();
#endif
  Wire.setClock(100000);

  if (!bme.begin(BME680_ADDRESS)) {
    Serial.println(F("BME680 not found; check wiring and address."));
    while (true) delay(10);
  }

  bme.setTemperatureOversampling(BME68X_OS_8X);
  bme.setHumidityOversampling(BME68X_OS_2X);
  bme.setPressureOversampling(BME68X_OS_4X);
  bme.setIIRFilterSize(BME68X_FILTER_SIZE_3);
  bme.setGasHeater(320, 150);
}

void loop() {
  if (!bme.performReading()) {
    Serial.println(F("BME680 reading failed."));
    delay(1000);
    return;
  }

  Serial.print(F("T="));
  Serial.print(bme.temperature, 2);
  Serial.print(F(" C | RH="));
  Serial.print(bme.humidity, 2);
  Serial.print(F(" % | P="));
  Serial.print(bme.pressure / 100.0, 2);
  Serial.print(F(" hPa | Gas="));
  Serial.print(bme.gas_resistance / 1000.0, 2);
  Serial.println(F(" kOhm"));

  delay(3000);
}

تحلیل کد و واحد خروجی

  • شرط #if defined(ESP32) پایه‌های Generic ESP32 را صریح می‌کند؛ Uno از پایه‌های سخت‌افزاری Wire استفاده می‌کند.
  • Wire.setClock(100000) برای شروع روی بردبورد محافظه‌کارانه است. پس از پایداری می‌توان سرعت و شکل موج را متناسب با باس واقعی ارزیابی کرد.
  • bme.begin(0x77) حسگر را در آدرس انتخابی پیدا می‌کند. اگر اسکنر فقط 0x76 نشان داد، ثابت آدرس را تغییر دهید.
  • performReading() یک چرخه اندازه‌گیری را اجرا می‌کند و موفقیت یا شکست آن بررسی می‌شود؛ داده نامعتبر بدون کنترل چاپ نمی‌شود.
  • دما بر حسب °C، رطوبت بر حسب %RH و فشار کتابخانه بر حسب Pa است؛ تقسیم بر 100 آن را به hPa تبدیل می‌کند.
  • مقاومت گاز کتابخانه بر حسب اهم است؛ تقسیم بر 1000 فقط واحد نمایش را به kΩ تغییر می‌دهد و IAQ یا ppm تولید نمی‌کند.
  • تنظیم گرم‌کن 320°C به مدت 150ms از API نمونه Adafruit استفاده می‌کند. تنظیم گرم‌کن و نرخ نمونه‌برداری باید در تمام داده‌های مقایسه‌ای ثابت بمانند.

ساخت خط مبنا و ثبت داده قابل‌مقایسه

  1. حسگر را در محل نهایی، دور از بخار مستقیم، پنجره باز لحظه‌ای و گرمای رگولاتور قرار دهید.
  2. تنظیم گرم‌کن، فاصله نمونه‌برداری و منبع تغذیه را ثابت نگه دارید.
  3. زمان، دما، رطوبت، فشار و مقاومت گاز را با هم ذخیره کنید.
  4. به‌جای یک عدد مطلق، میانه یا میانگین بازه پایدار را خط مبنا بگیرید و نسبت تغییر را بررسی کنید.
  5. برای تصمیم کنترلی، Hysteresis و حداقل زمان ماندگاری شرط تعریف کنید تا فن با نویز لحظه‌ای روشن و خاموش نشود.

راهنمای Adafruit می‌گوید مقاومت گاز می‌تواند تا حدود 30 دقیقه برای تثبیت اولیه زمان بخواهد. دیتاشیت Bosch نیز عملکرد گاز را به تاریخچه کار حسگر وابسته می‌داند و مشخصات آزمایشگاهی را پس از چند روز کارکرد تعریف می‌کند. پس «اولین عدد پس از روشن‌شدن» معیار محصول نیست.

خطاهای رایج و عیب‌یابی BME680

نشانهعلت محتملبررسی پیشنهادی
حسگر پیدا نمی‌شودآدرس اشتباه، SDA/SCL جابه‌جا، زمین مشترک نیستاسکنر را اجرا و بین 0x76 و 0x77 تطبیق دهید.
هیچ آدرسی دیده نمی‌شودتغذیه، کابل، Pull-up یا پایه‌های اشتباه برد ESP32ولتاژ و Continuity را اندازه بگیرید و پین‌های واقعی برد را بررسی کنید.
مقاومت گاز دائم تغییر می‌کندگرم‌شدن اولیه، تغییر رطوبت یا جریان هواتنظیم و محل نصب را ثابت نگه دارید و داده چندمتغیره ثبت کنید.
عدد گاز را ppm فرض کرده‌ایدبرداشت نادرست از خروجی خامواحد را اهم نگه دارید؛ برای غلظت واقعی به کالیبراسیون و حسگر انتخابی نیاز است.
دما کمی بالاتر از محیط استخودگرمایی حسگر، گرم‌کن و گرمای برد میزبانجریان هوا، فاصله از منابع گرما و Duty Cycle را بررسی کنید.
ارتفاع محاسبه‌شده نادرست استفشار مرجع سطح دریا به‌روز نیستفشار مرجع محلی همان روز را وارد کنید یا فقط فشار خام را گزارش دهید.
داده گاهی قطع می‌شودسیم بلند، Pull-up نامناسب یا تغذیه ناپایداربا سیم کوتاه و 100kHz شروع و تغذیه را با اسیلوسکوپ بررسی کنید.
دو BME680 هم‌زمان پاسخ نمی‌دهندهر دو آدرس یکسان دارندیکی را 0x76 و دیگری را 0x77 کنید؛ برای تعداد بیشتر از SPI با CS جدا استفاده کنید.

نکات طراحی PCB، تغذیه و محفظه

  • برای تراشه خام، خازن‌های 100nF پیشنهادی دیتاشیت را نزدیک VDD و VDDIO قرار دهید و مقدار Pull-up را بر اساس بار باس انتخاب کنید؛ 4.7kΩ فقط یک مقدار متداول پیشنهادی در مدار نمونه است.
  • دریچه فلزی حسگر را نپوشانید و مسیر تبادل هوا را با چسب، پوشش محافظ یا دیواره قاب مسدود نکنید.
  • حسگر را از رگولاتور، پردازنده، نمایشگر و مسیرهای قدرت که PCB را گرم می‌کنند فاصله دهید.
  • بخار آب متراکم، اسپری مستقیم، حلال غلیظ و ذرات چسب می‌توانند پاسخ حسگر را تغییر دهند؛ فرآیند مونتاژ و Aging را آزمایش کنید.
  • اگر دستگاه باتری‌خور است، مصرف گرم‌کن را در بودجه انرژی واقعی و با نرخ نمونه‌برداری انتخاب‌شده اندازه بگیرید.
  • برای مقایسه چند دستگاه، هر حسگر را جداگانه خط مبناگذاری کنید و شماره سریال، Firmware و تنظیمات گرم‌کن را کنار داده ذخیره کنید.
  • برای کاربرد تولیدی، تغییرات دما و رطوبت و آلودگی طولانی‌مدت را با آزمون مرجع پوشش دهید؛ یک تست رومیزی کوتاه کافی نیست.

نتیجه‌گیری

BME680 برای ساخت یک پایشگر محیطی کوچک و چندمنظوره مناسب است، به‌شرط آنکه مقاومت گاز را با ppm یا CO2 واقعی اشتباه نگیریم. راه‌اندازی مطمئن از تشخیص درست ماژول و آدرس شروع می‌شود، با تنظیم ثابت گرم‌کن و نمونه‌برداری ادامه پیدا می‌کند و با ثبت دما و رطوبت کنار مقاومت گاز معنا پیدا می‌کند. کد این مقاله یک خط مبنای قابل‌تکرار برای ESP32 و Arduino می‌دهد؛ مرحله بعد، ذخیره بلندمدت داده و طراحی منطق تهویه بر اساس روند همان دستگاه است.

پرسش‌های متداول

آدرس I2C سنسور BME680 برابر 0x76 است یا 0x77؟

هر دو معتبرند. SDO پایین آدرس هفت‌بیتی 0x76 و SDO بالا آدرس 0x77 می‌دهد. روی برد Adafruit آدرس پیش‌فرض 0x77 است؛ اسکنر I2C وضعیت واقعی را نشان می‌دهد.

آیا خروجی Gas در BME680 مقدار CO2 یا ppm است؟

خیر. کتابخانه ساده Adafruit مقاومت بخش گازی را بر حسب اهم گزارش می‌کند. این حسگر به مجموعه‌ای از VOCها و گازها پاسخ می‌دهد و خروجی خام، نوع یا غلظت یک گاز مشخص را تعیین نمی‌کند.

چرا مقاومت گاز بعد از روشن‌شدن ثابت نیست؟

گرم‌شدن سطح MOX، تاریخچه حسگر، دما، رطوبت و جریان هوا روی خروجی اثر دارند. تنظیمات را ثابت نگه دارید و پس از زمان تثبیت، خط مبنای همان دستگاه را بسازید.

آیا می‌توان BME680 را مستقیم به 5 ولت وصل کرد؟

تراشه خام VDD حداکثر 3.6 ولت دارد. فقط برد آماده‌ای را با 5 ولت تغذیه کنید که رگولاتور و Level Shifter آن مستند باشد؛ برد Adafruit Vin و منطق 3 تا 5 ولت را پشتیبانی می‌کند.

آیا BME680 برای آلارم نشت گاز یا مونوکسیدکربن مناسب است؟

خیر. BME680 حسگر ایمنی انتخابی برای یک گاز مشخص نیست و نباید در سامانه نجات جان استفاده شود. برای آلارم، حسگر و مدار دارای استاندارد و تأییدیه همان کاربرد لازم است.

منابع دقیق و ادامه مسیر

مشخصات تراشه خام از BST-BME680-DS001-09 Rev.1.9 گرفته شده‌اند. مشخصات 3 تا 5 ولت، رگولاتور، Level Shifter و آدرس پیش‌فرض فقط به برد مستند Adafruit تعمیم داده شده‌اند. خروجی کد مقاومت خام است و هیچ ادعای ppm، CO2 واقعی یا IAQ بدون BSEC ندارد.

پرسش و پاسخ مقاله

سوال فنی خود را مطرح کنید

پرسش‌ها و پاسخ‌ها پس از بررسی مدیر منتشر می‌شوند. نویسنده، پیش‌نویس در انتظار بررسی را می‌بیند.

هنوز پرسش تاییدشده‌ای برای این مقاله ثبت نشده است.