Operating range
بازه کامل فشار 300 تا 1100 hPa و بازه کاری دما -40 تا +85°C است. عبارت «full accuracy» برای دما به بازه 0 تا +65°C محدود شده؛ بنابراین کنار هر عدد، شرط آزمون را هم بخوانید.
آموزش سنسور فشار بارومتریک
در این راهنمای پروژهمحور، تراشه و ماژول BMP280 را از هم تفکیک میکنیم، جدولهای مهم دیتاشیت Bosch را میخوانیم، I2C را سیمکشی میکنیم، فشار و دمای جبرانشده را با کتابخانه رسمی Adafruit میگیریم و خطاهای ارتفاعسنجی، نویز و نصب مکانیکی را عیبیابی میکنیم.
BMP280 یک سنسور فشار مطلق بارومتریک از Bosch Sensortec است. عنصر پیزومقاومتی فشار و مدار پردازش سیگنال داخل تراشه، مقدار خام فشار و دما و ضرایب کالیبراسیون مخصوص همان قطعه را از رابط دیجیتال در اختیار میگذارند. برای رسیدن به مقدار واقعی باید داده خام با ضرایب ذخیرهشده در حافظه سنسور جبرانسازی شود؛ کتابخانهای که در این مقاله استفاده میکنیم این مرحله را انجام میدهد.
پیشبینی تغییرات فشار، ایستگاه هواشناسی، ثبت ارتفاع نسبی، تشخیص جابهجایی بین طبقات و بهبود ناوبری از کاربردهای اصلیاند. دمای BMP280 در درجه اول برای جبران فشار اندازهگیری میشود و به دمای خود تراشه و PCB وابسته است؛ پس آن را بدون بررسی جانمایی، جایگزین یک دماسنج دقیق محیط نکنید.
بازه کامل فشار 300 تا 1100 hPa و بازه کاری دما -40 تا +85°C است. عبارت «full accuracy» برای دما به بازه 0 تا +65°C محدود شده؛ بنابراین کنار هر عدد، شرط آزمون را هم بخوانید.
دقت مطلق فشار در بازه کاملِ مشخصشده برای 0 تا 65°C برابر ±1 hPa است، در حالی که تفکیکپذیری خروجی در حالت Ultra High Resolution به 0.0016 hPa میرسد. تفکیکپذیری ریز به معنی دقت مطلق هماندازه آن نیست.
دقت نسبی تیپیک ±0.12 hPa در شرایط درجشده دیتاشیت، تقریباً معادل ±1 m تغییر ارتفاع است. این عدد را نباید با دقت مطلق ارتفاع در هر آبوهوا یکی دانست.
جریان حالت خواب تیپیک 0.1 µA و حداکثر 0.3 µA ذکر شده، اما جریان پیک اندازهگیری فشار تا 1.12 mA میرسد. منبع تغذیه و خازن بایپس باید پیک را هم پوشش دهند.
| پارامتر دیتاشیت | مقدار | نتیجه عملی |
|---|---|---|
| VDD تراشه خام | 1.71 تا 3.6V | تراشه خام را مستقیم به 5 ولت وصل نکنید. |
| VDDIO تراشه خام | 1.2 تا 3.6V | Pull-up باس I2C باید با دامنه منطقی مجاز هماهنگ باشد. |
| بازه فشار با دقت کامل | 300 تا 1100 hPa | مناسب فشار جو و ارتفاع نسبی، نه اندازهگیری فشار مایع. |
| شناسه تراشه | رجیستر 0xD0، مقدار 0x58 | پیش از شروع، مدل قطعه را با خواندن ID تأیید کنید. |
| زمان راهاندازی | 2 ms | بلافاصله پس از تغذیه، قبل از نخستین ارتباط کمی صبر کنید. |
| I2C / SPI | تا 3.4 MHz / تا 10 MHz | سرعت مجاز تراشه با سرعت مناسب ماژول و سیمکشی یکسان فرض نشود. |
حد ولتاژهای بالا مربوط به خود تراشه است. برد Adafruit BMP280 که در تصویر دیده میشود رگولاتور و مدار تغییر سطح دارد و طبق راهنمای سازنده با ورودی و منطق 3 تا 5 ولت کار میکند. همه ماژولهای بازار چنین مداری ندارند؛ وجود پایهای با نام VIN یا ظاهر مشابه، مدرک کافی نیست. پیش از اتصال 5 ولت، شماتیک همان برد یا قطعات رگولاتور و Level Shifter را بررسی کنید.
در طراحی با تراشه خام، Bosch برای VDD و VDDIO خازن 100 nF نزدیک پایهها توصیه میکند. پایه CSB برای انتخاب I2C باید به VDDIO وصل باشد. اگر CSB هنگام راهاندازی Low تشخیص داده شود، رابط تا Power-on Reset بعدی در حالت SPI قفل میشود.
| پایه ماژول Adafruit | ESP32 عمومی | Arduino Uno | توضیح |
|---|---|---|---|
| VIN | 3V3 | 5V یا 3.3V | این انتخاب فقط برای برد Adafruit با رگولاتور/Level Shifter مستند است. |
| GND | GND | GND | زمین مشترک تغذیه و داده |
| SCK | GPIO22 / SCL برد | A5 / SCL | در حالت I2C همان خط SCL است. |
| SDI | GPIO21 / SDA برد | A4 / SDA | در حالت I2C همان خط SDA است. |
| CS و SDO | طبق ماژول | طبق ماژول | در برد Adafruit برای I2C بدون اتصال خارجی رها میشوند؛ در تراشه خام نقش آنها متفاوت است. |
مستندات Arduino-ESP32 میگوید پایه پیشفرض به برد وابسته است؛ GPIO21 برای SDA و GPIO22 برای SCL فقط پیشفرض برد Generic ESP32 است. در کد، پایهها را صریح با Wire.begin(SDA_PIN, SCL_PIN) تعیین کنید. خطوط I2C به Pull-up نیاز دارند؛ برد آماده ممکن است این مقاومتها را داشته باشد.
در تراشه خام، SDO به GND آدرس هفتبیتی 0x76 و SDO به VDDIO آدرس 0x77 میدهد و نباید شناور بماند. بسیاری از کتابخانهها یک آدرس را پیشفرض میگیرند؛ اگر سنسور پیدا نشد، هر دو را اسکن کنید.
| رجیستر | آدرس | کاربرد |
|---|---|---|
| id | 0xD0 | شناسه تراشه؛ مقدار مورد انتظار 0x58 |
| reset | 0xE0 | نوشتن 0xB6 برای Soft Reset |
| status | 0xF3 | بیتهای فعال بودن تبدیل و کپی داده NVM |
| ctrl_meas | 0xF4 | Oversampling فشار و دما و انتخاب Mode |
| config | 0xF5 | زمان Standby، ضریب IIR و SPI سهسیمه |
| press / temp | 0xF7 تا 0xFC | داده خام 20 بیتی فشار و دما |
در Sleep تبدیل انجام نمیشود. Forced یک بار اندازهگیری میکند و سپس خودکار به Sleep برمیگردد؛ این حالت برای دیتالاگر باتریخور مناسب است. Normal چرخه اندازهگیری و Standby را تکرار میکند. Oversampling بیشتر نویز را کم میکند اما زمان تبدیل و مصرف را بالا میبرد. فیلتر IIR داخلی برای حذف تغییرات کوتاه ناشی از باد یا بستهشدن در مفید است، ولی پاسخ واقعی به تغییر سریع فشار را هم کند میکند.
0x76 یا 0x77 را ببینید.#include <Wire.h>
#include <Adafruit_BMP280.h>
#if defined(ESP32)
constexpr int SDA_PIN = 21; // Generic ESP32 only
constexpr int SCL_PIN = 22; // Generic ESP32 only
#endif
constexpr uint8_t BMP280_ADDRESS = 0x76;
constexpr float SEA_LEVEL_HPA = 1013.25f; // Replace with a local value
Adafruit_BMP280 bmp;
void setup() {
Serial.begin(115200);
#if defined(ESP32)
Wire.begin(SDA_PIN, SCL_PIN);
#else
Wire.begin();
#endif
Wire.setClock(100000);
if (!bmp.begin(BMP280_ADDRESS, 0x58)) {
Serial.println("BMP280 not found; check 0x76/0x77 and wiring");
while (true) delay(10);
}
bmp.setSampling(
Adafruit_BMP280::MODE_NORMAL,
Adafruit_BMP280::SAMPLING_X2,
Adafruit_BMP280::SAMPLING_X16,
Adafruit_BMP280::FILTER_X16,
Adafruit_BMP280::STANDBY_MS_500
);
}
void loop() {
const float temperatureC = bmp.readTemperature();
const float pressurePa = bmp.readPressure();
const float pressureHpa = pressurePa / 100.0f;
const float altitudeM = bmp.readAltitude(SEA_LEVEL_HPA);
Serial.print(F("T="));
Serial.print(temperatureC, 2);
Serial.print(F(" C | P="));
Serial.print(pressureHpa, 2);
Serial.print(F(" hPa | altitude="));
Serial.print(altitudeM, 2);
Serial.println(F(" m"));
delay(1000);
}
شرط کامپایل #if defined(ESP32) باعث میشود همین فایل روی ESP32 پایههای صریح و روی Arduino Uno پایههای سختافزاری I2C یعنی SDA/A4 و SCL/A5 را بهکار بگیرد. خروجی سریال نیز با Serial.print نوشته شده تا به Serial.printf مخصوص برخی هستهها وابسته نباشد.
Wire.begin روی ESP32 باس I2C را با پایههای صریح و روی Uno با پایههای سختافزاری راه میاندازد؛ setClock(100000) نیز سرعت محافظهکارانه 100kHz را انتخاب میکند.bmp.begin(..., 0x58) هم آدرس را تعیین میکند و هم شناسه مورد انتظار BMP280 را کنترل میکند؛ به این ترتیب BME280 یا قطعه اشتباه بیصدا پذیرفته نمیشود.setSampling حالت Normal، Oversampling و IIR را مطابق نمونه رسمی کتابخانه تنظیم میکند.readPressure فشار جبرانشده را بر حسب پاسکال برمیگرداند؛ تقسیم بر 100 آن را به هکتوپاسکال تبدیل میکند.readAltitude ارتفاع را از نسبت فشار فعلی به فشار سطح دریا تخمین میزند. ورودی SEA_LEVEL_HPA باید با داده محلی بهروز شود.فشار هوا فقط تابع ارتفاع نیست؛ وضعیت آبوهوا هم آن را تغییر میدهد. عدد 1013.25 hPa یک فشار مرجع استاندارد است، نه فشار واقعی همه مکانها و روزها. برای ارتفاع مطلق، فشار تصحیحشده سطح دریا را از مرجع هواشناسی محلی و همزمان وارد کنید. برای اندازهگیری تغییر ارتفاع کوتاهمدت، میتوانید در نقطه شروع یک مرجع بگیرید و اختلاف را گزارش کنید.
اگر ارتفاع مرجع محل را دقیق میدانید، تابع seaLevelForAltitude در کتابخانه Adafruit میتواند فشار معادل سطح دریا را از فشار اندازهگیریشده و ارتفاع معلوم محاسبه کند. کالیبراسیون را پس از گرمشدن سیستم و دور از جریان باد مستقیم انجام دهید.
| نشانه | علتهای محتمل | بررسی پیشنهادی |
|---|---|---|
| هیچ آدرسی پیدا نمیشود | SDA/SCL جابهجا، زمین مشترک نیست، تغذیه نامناسب، CSB در حالت SPI | ولتاژ را اندازه بگیرید، اسکنر I2C را اجرا و Power Cycle کنید. |
| آدرس هست ولی begin شکست میخورد | آدرس 0x76/0x77 اشتباه یا تراشه BME280/قطعه دیگر | رجیستر ID در 0xD0 را بخوانید؛ BMP280 باید 0x58 باشد. |
| فشار پرنویز است | Oversampling یا IIR کم، تغذیه نویزی، باد مستقیم | فیلتر و نمونهبرداری را متناسب تنظیم و خازنها و جانمایی را بررسی کنید. |
| ارتفاع چند متر خطا دارد | فشار سطح دریا ثابت یا قدیمی، تغییر آبوهوا | مرجع محلی همزمان بدهید یا ارتفاع نسبی را گزارش کنید. |
| دما بالاتر از محیط است | گرمای MCU/رگولاتور و خود PCB | سنسور را از منابع گرما دور کنید و نرخ نمونهبرداری را بیدلیل بالا نبرید. |
| خطای تصادفی روی کابل | Pull-up نامناسب، ظرفیت باس یا EMI | کابل را کوتاه، سرعت را کم و شکل موج SDA/SCL را با اسیلوسکوپ بررسی کنید. |
هر دو ممکناند. در تراشه خام SDO=GND آدرس 0x76 و SDO=VDDIO آدرس 0x77 میدهد. اتصال روی ماژول آماده را با اسکنر I2C مشخص کنید.
خیر. BMP280 فشار و دمای داخلی را اندازه میگیرد. برای رطوبت، BME280 یا سنسور رطوبت جداگانه را با توجه به شماره قطعه واقعی انتخاب کنید.
فقط اگر سازنده همان ماژول وجود رگولاتور و تغییر سطح 5 ولت را مستند کرده باشد. خود تراشه BMP280 حداکثر تغذیه کاری 3.6 ولت دارد.
این عدد مرجع استاندارد است. فشار سطح دریا با آبوهوا و زمان تغییر میکند؛ برای ارتفاع بهتر باید فشار محلی تصحیحشده و بهروز را وارد کنید.
Forced اجازه میدهد یک اندازهگیری انجام شود و سنسور خودکار به Sleep برگردد؛ برای نمونهبرداری آرام معمولاً انتخاب مناسبتری است. تنظیم نهایی باید با نرخ، نویز و بودجه توان پروژه سنجیده شود.
همه اعداد فنی با Datasheet BMP280، سند BST-BMP280-DS001-26، Revision 1.26 (اکتبر 2021) تطبیق داده شدهاند. مشخصات برد آماده فقط برای مدل مستند Adafruit بیان شده و به ماژولهای ناشناس تعمیم داده نشده است.