راه اندازی BMP388 با ESP32

در این قسمت به راه اندازی BMP388 با ESP32 می پردازیم.

۱- معرفی سنسور BMP388:

سنسور BMP388 یک سنسور اندازه گیری فشار و دما است که دارای مشخصات الکتریکی زیر است:

  • رنج اندازه گیری فشار : ۳۰۰ تا ۱۲۵۰ هکتوپاسکال
  • رنج اندازه گیری دما : منفی ۴۰ تا مثبت ۸۵ سانتی گراد
  • نوع برقراری ارتباط: I2C و SPI
  • مصرف جریان: ۳.۴uA در فرکانس ۱ هرتز
  • دقت اندازی گیری فشار: ۰.۵ هکتوپاسکال
  • نرخ نمونه برداری: ۲۰۰ هرتز (۲۰۰ بار در ثانیه)

۲- نحوه اتصال BMP388 به ESP32:

همانطور که در قسمت مشخصات ماژول BMP388 گفته شد ما می تونیم این ماژول رو هم با I2C و هم با SPI راه اندازی کنیم.

برای اتصال ماژول BMP388 به ماژول ESP32 از طریق I2C به صورت شماتیک زیر عمل می کنیم.

عکس ۱: اتصال ماژول BMP388 به ماژول ESP32 از طریق I2C

همچنین برای اتصال ماژول BMP388 به ماژول ESP32 از طریق SPI به صورت شماتیک زیر عمل می کنیم.

عکس ۲: اتصال ماژول BMP388 به ماژول ESP32 از طریق SPI

۳- پروگرم کردن ESP32 با ARDUINO IDE:

  • نصب کتابخانه های BMP388 در ARDUINO IDE:

خب برای اینکه بتونیم ESP32 رو پروگرم کنیم که بتونه با ماژول BMP388 ارتباط برقرار کنه از برنامه معروف ARDUINO IDE استفاده می کنیم که آخرین نسخه اونو می تونید از سایت خود آردوینو دانلود کنید (از اینجا).

بعد از اینکه ARDUINO IDE رو دانلود و نصب کردید باید کتابخونه های مربوط به راه اندازی BMP388 رو نصب کنیم. که دوتا کتابخونه به نام های: Adafruit BMP3XX library و Adafruit_Sensor library هستند.

برای نصب کتابخونه ها به ترتیب وارد Sketch و بعد Include Library و بعد Manage Library میریم و در اونجا اسم کتابخونمونو تایپ می کنیم (مثل شکل زیر):

عکس ۳: مسیر نصب کتابخانه ها در ARDUINO

بعد از رفتن به مسیر بالا نام اولین کتابخونه مورد نیازمون یعنی : Adafruit BMP3XX library می نویسیم و Enter رو می زنیم. به محض اینکه Enter رو بزنید آردوینو از اینترنت سرچ میکنه و کتابخونه های با اون اسم رو براتون لیست می کنه.(تصویر زیر):

عکس ۴: نصب کتابخونه Adafruit BMP3XX library

همونطور که می بینید برای کتابخونه Adafruit BMP3XX library فقط یک کتابخونه وجود داره که باید نصب کنیم. برای اینکار روی Select Version کلیک کنید و روی آخرین ورژن بزارید و بعد گزینه Install رو بزنید تا نصب شه.

بعد از اینکه کتابخونه Adafruit BMP3XX library رو نصب کردید حالا نوبت به نصب کتابخونه Adafruit_Sensor library میرسه. برای اینکار مثل فرایند کتابخونه قبلی نام Adafruit_Sensor library رو می نویسید تا لیست کتابخونه ها مثل شکل زیر براتون بیاد:

عکس ۵: نصب کتابخونه Adafruit_Sensor library

همونطور که می بینید اینبار چند کتابخونه همنام آورده شد که ما Adafruit Unfied Sensor رو انتخاب و نصب می کنیم.

خب در اینجا نصب کتابخونه های مورد نیازمون تموم شد!

  • کد خواندن فشار، ارتفاع و دما با BMP388 :

احتمالا بدونید که در برنامه ARDUINO IDE وقتی کتابخونه یک ماژول یا سنسور رو که نصب می کنید مثالهای راه اندازی اون هم نصب میشه. برای ماژول BMP388 هم به همین صورته! برای دسترسی به کد ساده راه اندازی این ماژول در آردوینو کافیه به مسیر زیر برید:

File -> Example -> Adafruit BMP3XX Library -> bmp3xx_simpletest

مثال bmp3xx_simpletest رو اجرا کنید تا کدش باز شه: (کدش به صورت زیر هست): که البته ما یه چندتا تغییر کوچیک دادیم که برای استفاده با esp32 مناسب باشه.

/***************************************************************************
  This is a library for the BMP3XX temperature & pressure sensor. Designed specifically to work with the Adafruit BMP388 Breakout ----> http://www.adafruit.com/products/3966
  These sensors use I2C or SPI to communicate, 2 or 4 pins are required to interface. Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit!
  Written by Limor Fried & Kevin Townsend for Adafruit Industries. BSD license, all text above must be included in any redistribution
 ***************************************************************************/

// Complete project details: https://RandomNerdTutorials.com/esp32-bmp388-arduino/

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BMP3XX.h"

#define BMP_SCK 18
#define BMP_MISO 19
#define BMP_MOSI 23
#define BMP_CS 5

#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BMP3XX bmp;

void setup() {
  Serial.begin(115200);
  while (!Serial);
  Serial.println("Adafruit BMP388 / BMP390 test");

  if (!bmp.begin_I2C()) {   // hardware I2C mode, can pass in address & alt Wire
  //if (! bmp.begin_SPI(BMP_CS)) {  // hardware SPI mode  
  //if (! bmp.begin_SPI(BMP_CS, BMP_SCK, BMP_MISO, BMP_MOSI)) {  // software SPI mode
    Serial.println("Could not find a valid BMP3 sensor, check wiring!");
    while (1);
  }

  // Set up oversampling and filter initialization
  bmp.setTemperatureOversampling(BMP3_OVERSAMPLING_8X);
  bmp.setPressureOversampling(BMP3_OVERSAMPLING_4X);
  bmp.setIIRFilterCoeff(BMP3_IIR_FILTER_COEFF_3);
  bmp.setOutputDataRate(BMP3_ODR_50_HZ);
}

void loop() {
  if (! bmp.performReading()) {
    Serial.println("Failed to perform reading :(");
    return;
  }
  Serial.print("Temperature = ");
  Serial.print(bmp.temperature);
  Serial.println(" *C");

  Serial.print("Pressure = ");
  Serial.print(bmp.pressure / 100.0);
  Serial.println(" hPa");

  Serial.print("Approx. Altitude = ");
  Serial.print(bmp.readAltitude(SEALEVELPRESSURE_HPA));
  Serial.println(" m");

  Serial.println();
  delay(2000);
}

خب کافیه ESP32 رو طبق شماتیک بالا به BMP388 وصل کنید و بعد با یه کابل USB به لپ تاپتون بزنید و کد بالارو روش پروگرم کنید تا نتیجه رو ببینید.

اما قبل از پروگرم کردن بزارید کد بالارو بررسی کنیم:

کد چجوری کار میکنه؟

کتابخانه ها:

دوباره به کد پروژه (بالا) نگاه کنید. سعی میکنیم که خط به خط توضیح بدیم:

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BMP3XX.h"

چند خط کد بالا که در ابتدای پروژه نوشته شدن مربوط به اضافه کردن کتابخونه های راه اندازی برد esp32 هستند که با پسوند h. مشخص می شن:

کتابخونه Wire.h برای راه اندازی بخش I2C

کتابخونه SPI.h برای راه اندازی بخش SPI

کتابخونه Adafruit_Sensor یک کتابخونه کلی مربوط به کتابخونه خانواده محصولات Adafruit است.

کتابخونه Adafruit_BMP3XX مربوط به محصول خاص bmp3xx است

ارتباط SPI:

کدهای زیر مربوط به تنظیم پین های SPI در ESP32 است:

#define BMP_SCK 18
#define BMP_MISO 19
#define BMP_MOSI 23
#define BMP_CS 5

همونطور که در کد بالا می بینید پایه های ESP32 مشخص شده که هرکدوم چی هستن. مثلا پایه ۱۸ برای SCK در SPI است و یا پایه ۳۲ مربوط به پایه MOSI در SPI است و غیره

فشار سطح دریا:

برای اینکه نتایج دقیق تری در محاسبه فشار و ارتفاع از سنسور bmp388 دریافت کنیم بهتره که مقدار فشار سطح دریا رو برای موقعیت جغرافیایی که هستیم تنظیم کنیم این مقدار رو می تونیم در پارامتر SEALEVELPRESSURE_HPA تنظیم کنیم (به طور مثال اینجا روی ۱۰۱۳.۲۵ تنظیم کردیم)

#define SEALEVELPRESSURE_HPA (1013.25)

برای اینکه بدونید این عدد در منطقه جغرافیایی شما چنده میتونید به این لینک مراجعه کنید.

بخش راه اندازی و Setup:

  • در ابتدای بخش setup ارتباط سریال تنظیم میشه که نرخ ارسال دیتای اون روی ۱۱۵۲۰۰ قرار داده شده
  • تابع راه اندازی اولیه BMP388:

در اینجا برای راه اندازی BMP388 به صورت دیفالت از I2C استفاده شده (که پایه SCL همون GPIO22 و پایه SDA همون GPIO21 روی ESP32 هستند)

  if (!bmp.begin_I2C()) {   // hardware I2C mode, can pass in address & alt Wire
  //if (! bmp.begin_SPI(BMP_CS)) {  // hardware SPI mode  
  //if (! bmp.begin_SPI(BMP_CS, BMP_SCK, BMP_MISO, BMP_MOSI)) {  // software SPI mode

همونطور که در سه خط کد بالا می بینید بخش راه اندازی با SPI کامنت شده و شما می تونید اونهارو فعال کنید و به جاش I2C رو کامنت کنید. دو حالت میتونید SPI رو فعال کنید:

حالت hardware SPI mode حالتیه که پایه های spi به صورت دیفالت تنظیم میشه

و حالت software SPI mode پایه های spi به صورت دستی تنظیم میشه (همون کاری که ما بالا با تعیین پین ها انجام دادیم)

پس برای فعال کردن spi خط زیر رو از کامنت در بیارید و دو خط دیگه رو کامنت کنید:

if (! bmp.begin_SPI(BMP_CS, BMP_SCK, BMP_MISO, BMP_MOSI))

نرخ نمونه برداری و فیلترینگ:

با استفاده از خطوط زیر شما میتونید نمونه برداری و ضرائب فیلترها رو تغییر بدید:

// Set up oversampling and filter initialization
bmp.setTemperatureOversampling(BMP3_OVERSAMPLING_8X);
bmp.setPressureOversampling(BMP3_OVERSAMPLING_4X);
bmp.setIIRFilterCoeff(BMP3_IIR_FILTER_COEFF_3);
bmp.setOutputDataRate(BMP3_ODR_50_HZ);

اینکه این ضرائب چی هستند در دیتا شیت سنسور کاملا توضیح داده شده.

ولی مثلا برای setTemperatureOversampling و setPressureOversampling ما حالت های زیر رو می تونیم بزاریم:

    BMP3_NO_OVERSAMPLING
    BMP3_OVERSAMPLING_2X
    BMP3_OVERSAMPLING_4X
    BMP3_OVERSAMPLING_8X
    BMP3_OVERSAMPLING_16X
    BMP3_OVERSAMPLING_32X

یا مثلا برای setIIRFilterCoeff حالتهای زیر رو میتونیم داشته باشیم:

    BMP3_IIR_FILTER_DISABLE (no filtering)
    BMP3_IIR_FILTER_COEFF_1
    BMP3_IIR_FILTER_COEFF_3
    BMP3_IIR_FILTER_COEFF_7
    BMP3_IIR_FILTER_COEFF_15
    BMP3_IIR_FILTER_COEFF_31
    BMP3_IIR_FILTER_COEFF_63
    BMP3_IIR_FILTER_COEFF_127

و همچنین برای نرخ نمونه برداری setOutputDataRate داریم:

BMP3_ODR_200_HZ, BMP3_ODR_100_HZ, BMP3_ODR_50_HZ, BMP3_ODR_25_HZ,BMP3_ODR_12_5_HZ, BMP3_ODR_6_25_HZ, BMP3_ODR_3_1_HZ, BMP3_ODR_1_5_HZ, BMP3_ODR_0_78_HZ, BMP3_ODR_0_39_HZ,BMP3_ODR_0_2_HZ, BMP3_ODR_0_1_HZ, BMP3_ODR_0_05_HZ, BMP3_ODR_0_02_HZ, BMP3_ODR_0_01_HZ, BMP3_ODR_0_006_HZ, BMP3_ODR_0_003_HZ, or BMP3_ODR_0_001_HZ

حلقه تکرار loop:

در این حلقه ما اندازه گیری های bmp388 را دریافت می کنیم. در قدم اول به سنسور می گیم که اندازه گیری های جدیدتو برای ما بفرست با دستور: bmp.performReading()

if (! bmp.performReading()) {
  Serial.println("Failed to perform reading :(");
  return;
}

بعد که دیتارو دریافت کردیم اونو به سه پارامتر دما، فشار و ارتفاع تبدیل می کنیم و از طریق سریال نمایش می دیم

Serial.print("Temperature = ");
Serial.print(bmp.temperature);
Serial.println(" *C");

Serial.print("Pressure = ");
Serial.print(bmp.pressure / 100.0);
Serial.println(" hPa");

Serial.print("Approx. Altitude = ");
Serial.print(bmp.readAltitude(SEALEVELPRESSURE_HPA));
Serial.println(" m");

در واقع ما برای نمایش اندازه گیری ها از سه متغیر زیر استفاده می کنیم:

bmp.temperature: returns temperature reading
bmp.pressure: returns pressure reading
bmp.readAltitude (SEALEVELPRESSURE_HPA):

نمایش اندازه گیری ها:

برای اینکه اطلاعات رو توی لپ تاپ نمایش بدید از serial monitor آردوینو استفاده کنید که در قسمت: Tools > Boards > Port میتونید بهش دسترسی پیدا کنید (نرخ خواندن اطلاعات رو روی ۱۱۵۲۰۰ بزارید):

عکس ۶: نمایش اطلاعات bmp338 در آردوینو

پایان راه اندازی BMP388 با ESP32

در صورت داشتن هرگونه سوال در راه اندازی با ما در تماس باشید!

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

قبلا حساب کاربری ایجاد کرده اید؟
گذرواژه خود را فراموش کرده اید؟
Loading...