تهویه هوشمند
تغییر مقاومت گاز، رطوبت و دما را در طول زمان ثبت کنید و فن را بر اساس خط مبنا و روند محیط کنترل کنید؛ تصمیم را فقط به یک نمونه لحظهای وابسته نکنید.
آموزش پروژهمحور پایش هوای داخل ساختمان
BME680 چهار کمیت دما، رطوبت نسبی، فشار و مقاومت بخش گازی را در یک تراشه جمع میکند. در این راهنما تفاوت تراشه خام و برد آماده، آدرس I2C، سیمکشی، کد عملی، گرمکن حسگر گاز و محدودیت تفسیر خروجی را مرحلهبهمرحله بررسی میکنیم. همه عددهای فنی با دیتاشیت رسمی Bosch و API کتابخانه Adafruit تطبیق داده شدهاند.
0x76 یا 0x77BME680 یک حسگر محیطی چهاردریک از Bosch Sensortec است. سه کانال آن دما، رطوبت نسبی و فشار هوا را اندازه میگیرند و کانال چهارم یک حسگر اکسید فلزی گرمشونده است که مقاومت الکتریکی آن در حضور ترکیبات آلی فرار و برخی گازهای کاهنده یا اکسیدکننده تغییر میکند.
این حسگر برای پایش روند هوای داخل اتاق، تهویه هوشمند، ایستگاه محیطی، ثبت شرایط انبار و پروژههای IoT مناسب است. بااینحال خروجی خام کتابخانه Adafruit فقط «مقاومت گاز بر حسب اهم» است؛ این عدد بهتنهایی غلظت یک گاز مشخص، CO2 واقعی، ppm یا شاخص استاندارد IAQ نیست.
تغییر مقاومت گاز، رطوبت و دما را در طول زمان ثبت کنید و فن را بر اساس خط مبنا و روند محیط کنترل کنید؛ تصمیم را فقط به یک نمونه لحظهای وابسته نکنید.
فشار، رطوبت و دما در کنار یک خروجی حساس به VOC، دید کاملتری از محیط داخل ساختمان میدهند. محل نصب باید از گرمای مستقیم برد و هوای راکد دور باشد.
اثر بازشدن پنجره، استفاده از مواد شوینده یا افزایش حضور افراد را میتوان با ثبت زماندار بررسی کرد؛ این تحلیل روند است، نه شناسایی شیمیایی ماده.
نامناسب است. حسگر MOX انتخابپذیری کامل ندارد و خروجی خام نمیگوید کدام گاز با چه غلظتی حاضر است.
اول مشخص کنید عدد مربوط به تراشه خام است یا برد آماده. دیتاشیت 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 درصد رطوبت عملیاتی معرفی میکند، اما عملکرد واقعی به تاریخچه حسگر، دما، رطوبت، جریان هوا، زمان گرمشدن و تنظیم گرمکن وابسته است.
سطح حساس MOX در BME680 گرم میشود. جذب و واکنش گازها هدایت سطح را تغییر میدهد و مدار داخلی آن را به مقاومت گاز تبدیل میکند. Adafruit توضیح میدهد که افزایش غلظت VOC معمولاً مقاومت را پایین میآورد، اما عدد مطلق میان حسگرها و محیطهای مختلف قابلمقایسه مستقیم نیست.
دیتاشیت Bosch برای تولید IAQ از نرمافزار BSEC نام میبرد. BSEC تاریخچه اندازهگیری و اثر دما و رطوبت را وارد محاسبه میکند و خروجیهایی مانند IAQ در بازه 0 تا 500 میسازد. کد ساده این مقاله از BSEC استفاده نمیکند؛ بنابراین مقدار gas_resistance را فقط بهصورت مقاومت خام و برای ساخت خط مبنا و تحلیل روند نمایش میدهد.
طبق دیتاشیت، آدرس هفتبیتی 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 مستند | 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 نیاز دارند و مقدار مناسب به ولتاژ، طول سیم، ظرفیت باس و سرعت بستگی دارد.
i2c-scanner.ino را اجرا کنید؛ باید 0x77 یا 0x76 دیده شود.#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() یک چرخه اندازهگیری را اجرا میکند و موفقیت یا شکست آن بررسی میشود؛ داده نامعتبر بدون کنترل چاپ نمیشود.راهنمای Adafruit میگوید مقاومت گاز میتواند تا حدود 30 دقیقه برای تثبیت اولیه زمان بخواهد. دیتاشیت Bosch نیز عملکرد گاز را به تاریخچه کار حسگر وابسته میداند و مشخصات آزمایشگاهی را پس از چند روز کارکرد تعریف میکند. پس «اولین عدد پس از روشنشدن» معیار محصول نیست.
| نشانه | علت محتمل | بررسی پیشنهادی |
|---|---|---|
| حسگر پیدا نمیشود | آدرس اشتباه، SDA/SCL جابهجا، زمین مشترک نیست | اسکنر را اجرا و بین 0x76 و 0x77 تطبیق دهید. |
| هیچ آدرسی دیده نمیشود | تغذیه، کابل، Pull-up یا پایههای اشتباه برد ESP32 | ولتاژ و Continuity را اندازه بگیرید و پینهای واقعی برد را بررسی کنید. |
| مقاومت گاز دائم تغییر میکند | گرمشدن اولیه، تغییر رطوبت یا جریان هوا | تنظیم و محل نصب را ثابت نگه دارید و داده چندمتغیره ثبت کنید. |
| عدد گاز را ppm فرض کردهاید | برداشت نادرست از خروجی خام | واحد را اهم نگه دارید؛ برای غلظت واقعی به کالیبراسیون و حسگر انتخابی نیاز است. |
| دما کمی بالاتر از محیط است | خودگرمایی حسگر، گرمکن و گرمای برد میزبان | جریان هوا، فاصله از منابع گرما و Duty Cycle را بررسی کنید. |
| ارتفاع محاسبهشده نادرست است | فشار مرجع سطح دریا بهروز نیست | فشار مرجع محلی همان روز را وارد کنید یا فقط فشار خام را گزارش دهید. |
| داده گاهی قطع میشود | سیم بلند، Pull-up نامناسب یا تغذیه ناپایدار | با سیم کوتاه و 100kHz شروع و تغذیه را با اسیلوسکوپ بررسی کنید. |
| دو BME680 همزمان پاسخ نمیدهند | هر دو آدرس یکسان دارند | یکی را 0x76 و دیگری را 0x77 کنید؛ برای تعداد بیشتر از SPI با CS جدا استفاده کنید. |
BME680 برای ساخت یک پایشگر محیطی کوچک و چندمنظوره مناسب است، بهشرط آنکه مقاومت گاز را با ppm یا CO2 واقعی اشتباه نگیریم. راهاندازی مطمئن از تشخیص درست ماژول و آدرس شروع میشود، با تنظیم ثابت گرمکن و نمونهبرداری ادامه پیدا میکند و با ثبت دما و رطوبت کنار مقاومت گاز معنا پیدا میکند. کد این مقاله یک خط مبنای قابلتکرار برای ESP32 و Arduino میدهد؛ مرحله بعد، ذخیره بلندمدت داده و طراحی منطق تهویه بر اساس روند همان دستگاه است.
هر دو معتبرند. SDO پایین آدرس هفتبیتی 0x76 و SDO بالا آدرس 0x77 میدهد. روی برد Adafruit آدرس پیشفرض 0x77 است؛ اسکنر I2C وضعیت واقعی را نشان میدهد.
خیر. کتابخانه ساده Adafruit مقاومت بخش گازی را بر حسب اهم گزارش میکند. این حسگر به مجموعهای از VOCها و گازها پاسخ میدهد و خروجی خام، نوع یا غلظت یک گاز مشخص را تعیین نمیکند.
گرمشدن سطح MOX، تاریخچه حسگر، دما، رطوبت و جریان هوا روی خروجی اثر دارند. تنظیمات را ثابت نگه دارید و پس از زمان تثبیت، خط مبنای همان دستگاه را بسازید.
تراشه خام VDD حداکثر 3.6 ولت دارد. فقط برد آمادهای را با 5 ولت تغذیه کنید که رگولاتور و Level Shifter آن مستند باشد؛ برد Adafruit Vin و منطق 3 تا 5 ولت را پشتیبانی میکند.
خیر. BME680 حسگر ایمنی انتخابی برای یک گاز مشخص نیست و نباید در سامانه نجات جان استفاده شود. برای آلارم، حسگر و مدار دارای استاندارد و تأییدیه همان کاربرد لازم است.
مشخصات تراشه خام از BST-BME680-DS001-09 Rev.1.9 گرفته شدهاند. مشخصات 3 تا 5 ولت، رگولاتور، Level Shifter و آدرس پیشفرض فقط به برد مستند Adafruit تعمیم داده شدهاند. خروجی کد مقاومت خام است و هیچ ادعای ppm، CO2 واقعی یا IAQ بدون BSEC ندارد.