
راه اندازی سنسور BMP280 با آردوینو و پیش بینی وضعیت هوا
امروزه دسترسی به دادههای محیطی مانند دما و فشار هوا، نه تنها برای هواشناسان، بلکه برای علاقهمندان به الکترونیک و اینترنت اشیا (IoT) نیز جذاب و امکانپذیر شده است. در این پست، با هم یاد میگیریم که چگونه با استفاده از یک سنسور کوچک و دقیق به نام BMP280، یک ایستگاه هواشناسی کوچک بسازیم و حتی تغییرات آب و هوا را پیشبینی کنیم.
معرفی سنسور BMP280
ماژول BMP280 یک سنسور دیجیتال فشار و دما است که توسط شرکت Bosch تولید شده و به دلیل دقت بالا و مصرف توان پایین، در بسیاری از پروژههای الکترونیکی و اینترنت اشیا استفاده میشود. این سنسور میتواند فشار هوا را در بازه 300 تا 1100 hPa اندازهگیری کند که مناسب برای محاسبه ارتفاع از سطح دریا تا حدود 9 کیلومتر است. همچنین قابلیت اندازهگیری دما را با دقت حدود ±1 درجه سانتیگراد دارد و از طریق پروتکلهای I2C یا SPI به راحتی به انواع میکروکنترلرها متصل میشود.
کاربردهای سنسور
یکی از مهمترین کاربردهای BMP280، استفاده به عنوان ارتفاعسنج (Altimeter) است. از آنجایی که فشار هوا با تغییر ارتفاع تغییر میکند، این سنسور میتواند ارتفاع تقریبی محل را با دقت حدود یک متر محاسبه کند. همچنین تغییرات فشار میتواند برای پیشبینی وضعیت هوا به کار رود، بنابراین این ماژول در ساخت ایستگاههای هواشناسی کوچک، پهپادها، بالنها و دستگاههای قابل حمل کاربرد فراوان دارد.
مزایا در پروژههای IoT
به دلیل ابعاد کوچک، دقت بالا و مصرف انرژی پایین، سنسور BMP280 گزینهای ایدهآل برای پروژههای مبتنی بر اینترنت اشیا (IoT) است. میتوان آن را در ترکیب با سنسورهایی مانند BME280 (که رطوبت را هم میسنجد) یا سنسورهای دما و رطوبت دیگر برای پایش محیط استفاده کرد. همچنین در ابزارهای پوشیدنی مانند ساعتهای هوشمند، دستگاههای ورزشی و GPSها برای نمایش فشار و ارتفاع محیط به کار میرود و نقش مهمی در هوشمندسازی و پایش دقیق محیط ایفا میکند.
ویژگیهای کلیدی BMP280:
- اندازهگیری فشار هوا: محدودهی 300 تا 1100 hPa (قابلیت استفاده از سطح دریا تا ارتفاع ۹ کیلومتری).
- اندازهگیری دما: با دقت قابل قبول حدود ±1°C.
- رابطهای ارتباطی: پشتیبانی از پروتکلهای I2C و SPI برای اتصال آسان به میکروکنترلرها.
- مصرف توان بسیار پایین: ایدهآل برای پروژههایی که با باتری کار میکنند.
- دقت بالا: دقت اندازهگیری فشار در حدود ±1 hPa که برای اندازهگیری ارتفاع، تقریباً معادل ±1 متر است.
لوازم مورد نیاز برای این پروژه
- برد آردوینو (Uno, Nano, Mega) یا ESP32/ESP8266 (برای قابلیت وایفای)
- سنسور BMP280 (ماژول معمولاً شامل پینهای خروجی شده است)
- بردبرد (Breadboard) و چند عدد سیم جامپر
- کابل USB برای برنامهریزی و تغذیه برد
نحوه اتصال سنسور BMP280 به آردوینو (از طریق I2C)
اتصال این سنسور بسیار ساده است. پایههای استاندارد رابط I2C در آردوینو به شرح زیر هستند:
پایه سنسور BMP280 | پایه آردوینو |
---|---|
VCC (یا Vin) | 3.3V |
GND | GND |
SCL | A5 (یا پین SCL در بردهای جدید) |
SDA | A4 (یا پین SDA در بردهای جدید) |
نصب کتابخانه و کدنویسی
برای تعامل با سنسور، به یک کتابخانه نیاز داریم. کتابخانه Adafruit_BMP280
یکی از بهترینهاست.
- نصب کتابخانه: در محیط آردوینو IDE، به مسیر Sketch > Include Library > Manage Libraries… بروید. سپس در کادر جستجو،
Adafruit BMP280
را تایپ کنید و آن را نصب کنید. در حین نصب، از شما برای نصب کتابخانههای وابسته (Adafruit Sensor
) نیز سؤال میشود که باید آن را هم تأیید کنید. - کد پایه برای خواندن دما و فشار:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_BMP280.h> // شیء سنسور را تعریف میکنیم Adafruit_BMP280 bmp; void setup() { Serial.begin(9600); // شروع ارتباط سریال // بررسی میکنیم سنسور به درستی راهاندازی شده باشد if (!bmp.begin(0x76)) { // آدرس I2C معمولاً 0x76 یا 0x77 است Serial.println("سنسور BMP280 یافت نشد! مدار را چک کنید."); while (1); // در این حلقه بینهایت متوقف میشود } } void loop() { // خواندن دما و فشار float temperature = bmp.readTemperature(); // دما بر حسب درجه سانتیگراد float pressure = bmp.readPressure() / 100.0F; // فشار بر حسب hPa (هکتوپاسکال) // چاپ مقادیر در مونیتور سریال Serial.print("دما = "); Serial.print(temperature); Serial.println(" *C"); Serial.print("فشار = "); Serial.print(pressure); Serial.println(" hPa"); Serial.println("------------------"); delay(2000); // منتظر میمانیم و هر ۲ ثانیه داده میخوانیم } |
پس از آپلود کد، Serial Monitor را باز کنید (مطمئن شوید Baud Rate روی 9600 است). حالا باید دادههای دما و فشار را به صورت زنده مشاهده کنید.
چگونه از دادههای فشار برای پیشبینی آب و هوا استفاده کنیم؟
اینجاست که پروژه جذاب میشود! تغییرات فشار هوا، نه مقدار مطلق آن، کلید پیشبینی آبوهوا در کوتاهمدت است.
- فشار بالا و ثابت: معمولاً نشاندهنده هوای آفتابی و پایدار است.
- فشار پایین و ثابت: معمولاً نشاندهنده هوای ابری و بارانی است.
- کاهش تدریجی یا سریع فشار: نشاندهنده بدتر شدن هوا و احتمال بارش یا وزش باد شدید است.
- افزایش تدریجی یا سریع فشار: نشاندهنده بهتر شدن هوا و آفتابی شدن است.
افزودن منطق پیشبینی به کد
میتوانیم کد خود را گسترش دهیم تا روند فشار را تحلیل کند و یک پیشبینی ساده ارائه دهد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
// ... کلمات قبلی (include و تعریف شیء) مانند قبل ... float baselinePressure; // برای ذخیره فشار اولیه void setup() { Serial.begin(9600); if (!bmp.begin(0x76)) { Serial.println("سنسور BMP280 یافت نشد!"); while (1); } // خواندن میانگین فشار برای پایهگذاری baselinePressure = 0; for (int i = 0; i < 10; i++) { baselinePressure += bmp.readPressure() / 100.0F; delay(500); } baselinePressure /= 10; Serial.print("فشار پایه تنظیم شد: "); Serial.print(baselinePressure); Serial.println(" hPa"); } void loop() { float temperature = bmp.readTemperature(); float currentPressure = bmp.readPressure() / 100.0F; // پیشبینی بر اساس تغییرات فشار String forecast = "ناپایدار"; float pressureChange = currentPressure - baselinePressure; if (pressureChange > 0.5) { forecast = "آب و هوا در حال بهبود است (آفتابی)"; } else if (pressureChange < -0.5) { forecast = "احتمال بارش یا باد (تغییر بد هوا)"; } else { forecast = "تغییر محسوسی ожи نمیرود"; } // چاپ همه اطلاعات Serial.print("دما = "); Serial.print(temperature); Serial.println(" *C"); Serial.print("فشار = "); Serial.print(currentPressure); Serial.println(" hPa"); Serial.print("تغییر فشار: "); Serial.println(pressureChange); Serial.print("پیشبینی: "); Serial.println(forecast); Serial.println("------------------"); // به روزرسانی فشار پایه (به صورت تدریجی) baselinePressure = (baselinePressure * 0.9) + (currentPressure * 0.1); delay(30000); // هر ۳۰ ثانیه یک بار خوانده شود } |
🚀 ارتقای پروژه: نمایش دادهها روی نمایشگر OLED دو رنگ
برای تکمیل ایستگاه هواشناسی مبتنی بر سنسور BMP280، میتوانید دادههای محیطی را به صورت زنده و گرافیکی روی یک نمایشگر OLED 0.96 اینچی دو رنگ (زرد-آبی) نمایش دهید.
چرا OLED؟
- کیفیت بالا: وضوح عالی (۱۲۸x64 پیکسل) و زاویه دید بسیار wide.
- مصرف پایین: انرژی بسیار کمی مصرف میکند؛ مناسب برای پروژههای باتریخور.
- رابطهای متنوع: پشتیبانی از هر دو پروتکل I2C و SPI برای انعطافپذیری در اتصال.
- نمایش دو رنگ: بخش بالایی (زرد) برای دادههای مهم مانند هشدار یا دما، و بخش پایینی (آبی) برای اطلاعات دیگر مانند فشار و رطوبت.
اتصال و راهاندازی:
- ماژول OLED را از طریق I2C ( تنها ۴ سیم: VCC, GND, SDA, SCL) به میکروکنترلر متصل کنید.
- از کتابخانههای
Adafruit_SSD1306
وAdafruit_GFX
در Arduino IDE استفاده کنید. - با چند خط کد ساده، میتوانید مقادیر دما و فشار را که از سنسور BMP280 خوانده میشود، به صورت Real-Time روی صفحه نمایش دهید.
اتصال به آردوینو (از طریق I2C):
پایه OLED | پایه آردوینو |
---|---|
VCC | 3.3V |
GND | GND |
SDA | A4 |
SCL | A5 |
سنسور BMP280 نیز به همین پینهای I2C (A4, A5) متصل میشود.
کد لازم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
#include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <Adafruit_BMP280.h> #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); Adafruit_BMP280 bmp; void setup() { Serial.begin(9600); // راه اندازی OLED if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println("OLED Error!"); while(1); } // راه اندازی سنسور if(!bmp.begin(0x76)) { Serial.println("BMP280 Error!"); while(1); } } void loop() { float temperature = bmp.readTemperature(); float pressure = bmp.readPressure() / 100.0F; // نمایش روی OLED display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); // نمایش دما در بخش زرد display.setCursor(0, 0); display.print("Temp: "); display.print(temperature, 1); display.println(" C"); // نمایش فشار در بخش آبی display.setCursor(0, 35); display.print("Pressure: "); display.print(pressure, 0); display.print(" hPa"); display.display(); delay(3000); } |
نکات مهم:
- کتابخانههای مورد نیاز را نصب کنید:
- Adafruit SSD1306
- Adafruit GFX
- Adafruit BMP280
- آدرس I2C ماژول OLED معمولاً 0x3C است
- برای نمایشگرهای دو رنگ، از
SSD1306_WHITE
برای متن استفاده کنید - میتوانید با توابع
setCursor
موقعیت نمایش اطلاعات را تنظیم کنید