آموزش BME680 با ESP32؛ سنجش گاز، دما، رطوبت و فشار
راهنمای پروژهمحور BME680 با ESP32 و Arduino؛ دیتاشیت، آدرس I2C، سیمکشی، کد دما و رطوبت و فشار و مقاومت گاز، محدودیت IAQ و عیبیابی.
آموزش پروژهمحور پایش هوای داخل ساختمان
راهاندازی BME680 با ESP32؛ از دیتاشیت تا مقاومت سنسور گاز
BME680 چهار کمیت دما، رطوبت نسبی، فشار و مقاومت بخش گازی را در یک تراشه جمع میکند. در این راهنما تفاوت تراشه خام و برد آماده، آدرس I2C، سیمکشی، کد عملی، گرمکن حسگر گاز و محدودیت تفسیر خروجی را مرحلهبهمرحله بررسی میکنیم. همه عددهای فنی با دیتاشیت رسمی Bosch و API کتابخانه Adafruit تطبیق داده شدهاند.
0x76 یا 0x77BME680 چیست و چه چیزی را اندازه میگیرد؟
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 مشترک باشد. |
| SCK | SCL | کلاک I2C؛ در نامگذاری برد برای SPI نیز استفاده میشود. |
| SDI | SDA | داده I2C؛ در نامگذاری برد برای SPI نیز استفاده میشود. |
| SDO | انتخاب آدرس | پایین: 0x76، بالا: 0x77؛ شناور نگذارید. |
| CS | انتخاب SPI | برای اتصال I2C برد آماده طبق راهنمای Adafruit بدون اتصال میماند. |
BME680 رابط SPI سهسیمه و چهارسیمه را نیز پشتیبانی میکند و کلاک ورودی SPI طبق دیتاشیت تا 10MHz مجاز است. برای یک حسگر روی بردبورد، I2C سیم کمتری میخواهد؛ برای چند BME680 که دو آدرس I2C کافی نیست، SPI با CS جداگانه انتخاب سادهتری است.
سیمکشی BME680 با ESP32 و Arduino Uno
| برد BME680 مستند | Generic ESP32 | Arduino Uno |
|---|---|---|
| Vin | 3V3 | 5V فقط برای برد Adafruit مستند |
| GND | GND | GND |
| SCK / SCL | GPIO22 | A5 / SCL |
| SDI / SDA | GPIO21 | A4 / SDA |
| SDO | وضعیت پیشفرض برد برای 0x77 | وضعیت پیشفرض برد برای 0x77 |
| CS | بدون اتصال در I2C | بدون اتصال در I2C |
GPIO21 و GPIO22 فقط پیشفرض Generic ESP32 هستند. مستند رسمی Arduino-ESP32 میگوید پایههای پیشفرض به برد وابستهاند؛ در ESP32-S3، ESP32-C3 یا طراحی سفارشی، پینهای واقعی برد خود را جایگزین کنید. خطوط I2C به Pull-up نیاز دارند و مقدار مناسب به ولتاژ، طول سیم، ظرفیت باس و سرعت بستگی دارد.
راهاندازی گامبهگام در Arduino IDE
- از Library Manager کتابخانههای Adafruit BME680 Library، Adafruit Unified Sensor و Adafruit BusIO را نصب کنید.
- برد و پورت درست ESP32 یا Arduino Uno را انتخاب کنید.
- سیمکشی را در حالت بدون تغذیه انجام دهید و مشخصات همان ماژول را بررسی کنید.
- کد
i2c-scanner.inoرا اجرا کنید؛ باید 0x77 یا 0x76 دیده شود. - کد اصلی را آپلود و Serial Monitor را روی 115200 baud باز کنید.
- حسگر را با تنظیم ثابت چند دقیقه کار دهید و برای تحلیل روند، زمان بیشتری برای تثبیت و ساخت خط مبنا در نظر بگیرید.
کد عملی 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 استفاده میکند. تنظیم گرمکن و نرخ نمونهبرداری باید در تمام دادههای مقایسهای ثابت بمانند.
ساخت خط مبنا و ثبت داده قابلمقایسه
- حسگر را در محل نهایی، دور از بخار مستقیم، پنجره باز لحظهای و گرمای رگولاتور قرار دهید.
- تنظیم گرمکن، فاصله نمونهبرداری و منبع تغذیه را ثابت نگه دارید.
- زمان، دما، رطوبت، فشار و مقاومت گاز را با هم ذخیره کنید.
- بهجای یک عدد مطلق، میانه یا میانگین بازه پایدار را خط مبنا بگیرید و نسبت تغییر را بررسی کنید.
- برای تصمیم کنترلی، 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 حسگر ایمنی انتخابی برای یک گاز مشخص نیست و نباید در سامانه نجات جان استفاده شود. برای آلارم، حسگر و مدار دارای استاندارد و تأییدیه همان کاربرد لازم است.
منابع دقیق و ادامه مسیر
- دیتاشیت رسمی Bosch BME680، Revision 1.9، فوریه 2024
- راهنمای رسمی Arduino و سیمکشی برد Adafruit BME680
- مستند رسمی پایهها، رگولاتور و Level Shifter برد Adafruit
- کتابخانه رسمی Adafruit BME680 با مجوز BSD
- مستند رسمی I2C در Arduino-ESP32
- منبع عکس، Ruiz Brothers، مجوز CC BY-SA 3.0
- آموزش BMP280 با ESP32 و Arduino
- آموزش SHT31 با ESP32 و Arduino
- دوره رایگان سنسورها در ۷ قدم
- دسته آموزش گاز و کیفیت هوا
- مرکز آموزش سنسورها در LCENJ
مشخصات تراشه خام از BST-BME680-DS001-09 Rev.1.9 گرفته شدهاند. مشخصات 3 تا 5 ولت، رگولاتور، Level Shifter و آدرس پیشفرض فقط به برد مستند Adafruit تعمیم داده شدهاند. خروجی کد مقاومت خام است و هیچ ادعای ppm، CO2 واقعی یا IAQ بدون BSEC ندارد.
پرسش و پاسخ مقاله
سوال فنی خود را مطرح کنید
پرسشها و پاسخها پس از بررسی مدیر منتشر میشوند. نویسنده، پیشنویس در انتظار بررسی را میبیند.
هنوز پرسش تاییدشدهای برای این مقاله ثبت نشده است.