كود البحث

الدرس 96-4: مستشعر الضغط الجوي ودرجة الحرارة والارتفاع التقريبي BMP390 مع أردوينو كمنظم حرارة

الدرس 96-4: مستشعر الضغط الجوي ودرجة الحرارة والارتفاع التقريبي BMP390 مع أردوينو كمنظم حرارة

يشرح هذا البرنامج التعليمي كيفية بناء منظم حرارة ذكي باستخدام مستشعر الضغط الجوي BMP390 ودرجة الحرارة والارتفاع التقريبي مع Arduino. إن BMP390 هو مستشعر عالي الدقة من Bosch يمكنه قياس درجة الحرارة والضغط وحساب الارتفاع التقريبي بناءً على ضغط مستوى سطح البحر. في هذا المشروع، سنستخدمه للتحكم في مرحل يمكنه تشغيل وإيقاف سخان أو مبرد بناءً على عتبات درجة الحرارة، مما ينشئ نظام منظم حرارة كامل الوظائف.

BMP380_pink-module-gravitiy-1
BMP380_pink-module-1

لهذا المشروع عدة تطبيقات عملية، بما في ذلك:

  • إنشاء منظم حرارة منزلي ذكي للحفاظ على درجة حرارة غرفة مريحة
  • بناء نظام تهوية للاحتباس الحراري يتم التحكم فيه بدرجة الحرارة
  • حماية الأجهزة الإلكترونية الحساسة من ارتفاع درجة الحرارة
  • التحكم في حاضنة للبيض أو الزواحف
  • مراقبة وتنظيم درجة الحرارة في قبو النبيذ أو غرفة التخزين
BMP380_pink-module-3-size

الأجهزة المطلوبة

  • Arduino Uno (أو لوحة متوافقة)
  • وحدة مستشعر الضغط الجوي BMP390
  • وحدة مرحل (للتحكم في السخان/المبرد)
  • جهاز سخان أو مبرد للتحكم فيه
  • أسلاك توصيل
  • لوحة تجارب (اختياري)

فهم مستشعر BMP390

إن BMP390 هو مستشعر ضغط جوي عالي الدقة من تصنيع Bosch. يبلغ قياس المستشعر الفعلي 2 مم × 2 مم × 0.75 مم فقط، مما يجعله صغيرًا للغاية. تشتمل لوحة التوصيل التي ستستخدمها على جميع المكونات الداعمة الضرورية مثل مقاومات السحب، ومنظم الجهد، ومحول مستوى المنطق، مما يسمح لك بتزويده بالطاقة إما بجهد 3.3 فولت أو 5 فولت (في الفيديو عند 01:44).

يمكن للمستشعر قياس الضغط من 300 إلى 1250 هكتوباسكال بدقة مطلقة تبلغ ±0.5 هكتوباسكال بين 0 إلى 65 درجة مئوية. دقته النسبية أفضل حتى عند ±0.03 هكتوباسكال، وهو ما يعادل تقريبًا ±25 سنتيمترًا من فرق الارتفاع. يتميز المستشعر أيضًا بمعدل أخذ عينات أقصى يبلغ 200 هرتز، مما يجعله مناسبًا للتطبيقات التي تتطلب قراءات سريعة (في الفيديو عند 04:10).

دليل التوصيل

BMP390_arduino_wiring_pink-1-from-sda-scl-pins
BMP390_arduino_wiring_pink-2

يعد توصيل BMP390 بلوحة Arduino أمرًا بسيطًا باستخدام واجهة I2C، التي تتطلب فقط سلكين لاتصالات البيانات بالإضافة إلى توصيلات الطاقة. يتصل دبوس VIN الخاص بالمستشعر بمنفذ 5 فولت (أو 3.3 فولت) في Arduino، ويتصل الأرضي بالأرضي، ويتصل SCL بدبوس SCL (A5 في Uno)، ويتصل SDA بدبوس SDA (A4 في Uno) (في الفيديو عند 05:45).

بالنسبة لوحدة المرحل، ستقوم بتوصيل دبوس التحكم الخاص بها بالدبوس الرقمي 8 في Arduino، وVCC بجهد 5 فولت، والأرضي بالأرضي. يتصل الجهاز الذي تريد التحكم فيه (سخان أو مبرد) بأطراف إخراج المرحل.

من الميزات الفريدة لهذا المشروع أن الكود يعرف الدبوس 12 كمخرج طاقة لوحدة BMP390. هذا يعني أنه يمكنك تشغيل المستشعر مباشرة من دبوس Arduino دون الحاجة إلى سكة طاقة منفصلة على لوحة التجارب (في الفيديو عند 08:46). يضبط الكود هذا الدبوس على HIGH في الإعداد لتوفير 5 فولت للمستشعر.

تثبيت المكتبات المطلوبة

قبل رفع الكود، ستحتاج إلى تثبيت مكتبة Adafruit BMP3XX. افتح Arduino IDE، وانتقل إلى Sketch → Include Library → Manage Libraries، وابحث عن "Adafruit BMP3XX"، وانقر فوق Install (في الفيديو عند 10:29). تتعامل هذه المكتبة مع جميع الاتصالات منخفضة المستوى مع مستشعر BMP390.

شرح الكود

تم تصميم الكود الخاص بمشروع منظم الحرارة هذا ليكون قابلًا للتكوين بدرجة عالية. دعنا نفحص الإعدادات الرئيسية القابلة للتخصيص من قبل المستخدم في أعلى البرنامج.

تعريفات الدبابيس

يمكنك تغيير دبابيس Arduino المستخدمة لطاقة المستشعر والتحكم في المرحل:

int bmpVCCPin = 12;//define pin 12 as VCC for bmp sensor
const int relayPin = 8;

يوفر bmpVCCPin طاقة 5 فولت لوحدة BMP390. يتحكم relayPin في وحدة المرحل التي تقوم بتبديل السخان أو المبرد الخاص بك.

BMP288-1
BMP380_pink-module-gravitiy-1

إعدادات منظم الحرارة

تحدد هذه الثوابت كيفية تصرف منظم الحرارة الخاص بك:

const int TEMPERATURE_UNIT = 1;//1=Celsius, 2=Fahrenheit, 3=Kelvin
const float START_TEMPERATURE = 32.0;//unit above
const float STOP_TEMPERATURE = 45.0;//unit above
const int CONTROL_TYPE = 2;// 1= heater, 2=cooler
  • TEMPERATURE_UNIT: يضبط مقياس درجة الحرارة. استخدم 1 لدرجة مئوية، أو 2 لفهرنهايت، أو 3 لكلفن.
  • START_TEMPERATURE: درجة الحرارة التي يتم عندها تشغيل المرحل (لوضع التدفئة) أو إيقاف تشغيله (لوضع التبريد).
  • STOP_TEMPERATURE: درجة الحرارة التي يتم عندها إيقاف تشغيل المرحل (لوضع التدفئة) أو تشغيله (لوضع التبريد).
  • CONTROL_TYPE: اضبطه على 1 للتحكم في التدفئة (يعمل عند البرودة) أو 2 للتحكم في التبريد (يعمل عند الحرارة).

على سبيل المثال، في العرض التوضيحي، تم ضبط درجة حرارة البدء على 30°م ودرجة حرارة الإيقاف على 45°م حتى تتمكن من اختبار السلوك بسرعة باستخدام مسدس حراري. في تطبيق حقيقي، يمكنك ضبطهما أقرب لبعضهما، مثل 20°م و23°م، للحفاظ على درجة حرارة غرفة مريحة (في الفيديو عند 30:07).

وظائف مخصصة

يتضمن الكود عدة وظائف مخصصة يمكنك استخدامها وتعديلها:

  • loadControl(): تنفذ هذه الوظيفة منطق الترموستات. تقارن درجة الحرارة الحالية بحدود البدء والإيقاف الخاصة بك وتستدعي relayControl() وفقًا لذلك. يتغير السلوك بناءً على ما إذا قمت بتعيين CONTROL_TYPE إلى 1 (تدفئة) أو 2 (تبريد).
  • relayControl(int state): تقوم هذه الوظيفة بتشغيل أو إيقاف تشغيل المرحل وتطبع الحالة على شاشة المراقبة التسلسلية. مرر لها إما relayON أو relayOFF.
  • readValues(): تقرأ هذه الوظيفة المستشعر وتخزن درجة الحرارة والضغط والارتفاع في متغيرات عامة. تقوم تلقائيًا بتحويل درجة الحرارة إلى الوحدة التي اخترتها.
  • printTemperature(): تطبع هذه الوظيفة قراءة درجة الحرارة مع رمز الوحدة المناسب على شاشة المراقبة التسلسلية.

كيف يعمل الترموستات

يعمل منطق الترموستات من خلال مقارنة درجة الحرارة الحالية بالحدود التي قمت بتكوينها. في وضع التدفئة (CONTROL_TYPE = 1)، عندما تنخفض درجة الحرارة إلى أو أقل من START_TEMPERATURE، يتم تشغيل المرحل لتفعيل جهاز التدفئة الخاص بك. يظل السخان يعمل حتى ترتفع درجة الحرارة إلى STOP_TEMPERATURE، وعندها يتم إيقاف تشغيل المرحل. يخلق هذا تأثير التباطؤ الذي يمنع التشغيل والإيقاف السريع المتكرر (في الفيديو عند 31:04).

في وضع التبريد (CONTROL_TYPE = 2)، يكون المنطق معكوسًا. يتم تشغيل المرحل عندما تصل درجة الحرارة إلى STOP_TEMPERATURE أو تتجاوزها، ويتم إيقاف تشغيله عندما تنخفض مرة أخرى إلى START_TEMPERATURE.

يوضح العرض التوضيحي في الفيديو هذا يعمل مع مسدس حراري. عندما وصلت درجة الحرارة إلى 45°م، تم إيقاف تشغيل المرحل وانطفأ ضوء المؤشر. بعد التبريد إلى 30°م، تم تنشيط المرحل مرة أخرى لتشغيل السخان (في الفيديو عند 31:53).

عرض توضيحي مباشر للمشروع

يتضمن الفيديو اختبارًا عمليًا للارتفاع لمستشعر BMP390. أخذ المقدم المستشعر إلى موقع في أياكس، أونتاريو، كندا، وقاس الارتفاع عند مستوى الأرض بالقرب من حلبة تزلج على الجليد. قرأ المستشعر في البداية حوالي -15 مترًا، وهو ما يمثل الفرق بين معايرة الضغط عند مستوى سطح البحر المحلي والارتفاع الفعلي لتلك البقعة (في الفيديو عند 33:04).

عند أخذ المستشعر إلى الطابق الخامس والعشرين من مبنى قريب، تغيرت القراءة إلى حوالي 57.2 مترًا. الفرق حوالي 72 مترًا بين الطابق الأرضي والطابق الخامس والعشرين يوضح قدرة المستشعر على اكتشاف تغييرات الارتفاع ذات المعنى. يؤكد هذا الاختبار فائدة BMP390 للتطبيقات التي تتطلب مراقبة الارتفاع (في الفيديو عند 36:16).

يُظهر عرض الترموستات التوضيحي إيقاف تشغيل المرحل عندما تجاوزت درجة الحرارة حد الإيقاف البالغ 45°م، مع انطفاء ضوء المؤشر. بعد تبريد المستشعر مرة أخرى إلى أقل من 30°م، تم تنشيط المرحل مرة أخرى، مما يوضح تحكمًا موثوقًا في درجة الحرارة يعتمد على التباطؤ (في الفيديو عند 31:04).

مشاريع ذات صلة من هذا الفيديو

الفصول

  • [00:00] مقدمة لمشروع مستشعر BMP390
  • [01:19] فهم مواصفات مستشعر BMP390
  • [05:45] مخطط التوصيل لـ BMP390 مع Arduino Uno
  • [10:29] تثبيت مكتبة Adafruit BMP3XX
  • [11:38] شرح الكود لقراءة المستشعر الأساسية
  • [15:51] إضافة التحكم في المرحل لتشغيل الترموستات
  • [17:30] إعداد شاشة LCD (اختياري)
  • [22:52] عرض الضغط والارتفاع على شاشة LCD
  • [30:07] عرض توضيحي للترموستات مع مسدس حراري
  • [32:12] اختبار الارتفاع في الطابق الخامس والعشرين

الصور

BMP288-1
BMP288-1
BMP380_pink-module-4
BMP380_pink-module-4
BMP380_pink-module-3-size
BMP380_pink-module-3-size
BMP380_pink-module-2
BMP380_pink-module-2
BMP380_pink-module-1
BMP380_pink-module-1
BMP380_pink-module-gravitiy-1
BMP380_pink-module-gravitiy-1
BMP390_arduino_wiring_2-gravity-module-sda-scl-pins
BMP390_arduino_wiring_2-gravity-module-sda-scl-pins
BMP390_arduino_wiring_2-gravity-module
BMP390_arduino_wiring_2-gravity-module
BMP390_arduino_wiring_pink-1-from-sda-scl-pins
BMP390_arduino_wiring_pink-1-from-sda-scl-pins
BMP390_arduino_wiring_pink-2
BMP390_arduino_wiring_pink-2
437-Lesson 96-4: Using BMP390 as thermostat (heater or cooler)
اللغة: C++
/*
 * Lesson 96: Using BMP390  as  thermostat
 * with Arduino using it as a Thermostat to control a heater or cooler
 * Download and resource page https://robojax.com/RJT457

 * Watch video instruction on YouTube:  https://youtu.be/XevQYG_A5xA
 * 
 * Code updated by Ahmad Shamshiri for Robojax.com
 * on Jan 13, 2022 at 17:10 in Ajax, Ontario, Canada
  
  This video is part of the Arduino Step by Step Course which starts here: https://youtu.be/-6qSrDUA5a8
 

If you found this tutorial helpful, please support me so I can continue creating content like this
and make a donation using PayPal http://robojax.com/L/?id=64


  This is a library for the BMP390 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
 **************************************************************************
 */
#include <Wire.h>

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


#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BMP3XX bmp;
int bmpVCCPin = 12;//define pin 12 as VCC for bmp sensor

// all thermostat settings

const int relayPin =8;
const int relayON = HIGH;// 
const int relayOFF = LOW; //
int relayState = relayOFF;//initial state of relay

const int TEMPERATURE_UNIT =1;//1=Celsius, 2=Fahrenheit, 3=Kelvin
const float START_TEMPERATURE = 32.0;//unit above
const float STOP_TEMPERATURE = 45.0;//unit above
const int CONTROL_TYPE = 2;// 1= heater, 2=cooler

//do not change the line below
float temperature, pressure, altitude;



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

  pinMode(bmpVCCPin, OUTPUT);// set pin as output
  digitalWrite(bmpVCCPin,HIGH);// always keep it high (5V) for BMB390 module
  delay(500);//wait for the bmpVCCPin to turn ON.    

  
  pinMode(relayPin, OUTPUT);//pin for relay
  digitalWrite(relayPin, relayState);//change initial state of relay


  if (!bmp.begin_I2C()) {   // hardware I2C mode, can pass in address & alt Wire
  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;
  }
    readValues();
    printTemperature();

  Serial.println();
   loadControl(); 

   //do extra action if temperature is greater than 89.5
   if(temperature >=89.5)
   {
    ///and your code here
   }
  delay(2000);//wait 2 seconds or make is less or more
}



/*
 * loadControl()
 * @brief controls the load based 
 * @param state can be either : relayON or relayOFF

 * @return returns none
 * Written by Ahmad Shamshiri for robojax.com
 * on Jan 15, 2022 at 08:11 in Ajax, Ontario, Canada
 */
void loadControl()
{
//Robojax.com heater/cooler with BMP390 Thermocoupler  
     // Serial.print("Start: ");
     // Serial.print(START_TEMPERATURE);
     // Serial.print(" Stop: ");
      //Serial.println(STOP_TEMPERATURE);      
  if(CONTROL_TYPE ==1)
  {
    if(START_TEMPERATURE >= temperature && STOP_TEMPERATURE >=temperature)
    {
      relayControl(relayON);
    }
    if(STOP_TEMPERATURE <=temperature)
    {
      relayControl(relayOFF);
    }
  }else{
    if(START_TEMPERATURE >= temperature && STOP_TEMPERATURE >=temperature)
    {
      relayControl(relayOFF);
    }
    if(STOP_TEMPERATURE <=temperature)
    {
      relayControl(relayON);
    }
  }
    
//Robojax.com heater/cooler with BMP390 Thermocoupler
}//loadControl()


/*
 * relayControl(int state))
 * @brief turns the relay ON or OFF
 * @param state is "relayON" or "relayOFF" defined at the top of the code
 * @return returns none
 * Written by Ahmad Shamshiri for robojax.com
 * on May 20, 2020 at 15:23 in Ajax, Ontario, Canada
 */
void relayControl(int state)
{
  //Robojax.com heater/cooler with BMP390 Thermocoupler
  if(state ==relayON)
  {
    digitalWrite(relayPin, relayON);
    Serial.println("Relay ON");   
  }else{
   digitalWrite(relayPin, relayOFF);    
    Serial.println("Relay OFF");   
  }
  //Robojax.com heater/cooler with BMP390 Thermocoupler  

}//relayControl()


/*
 *  readValues()
 * @brief reads the temperature based on the TEMPERATURE_UNIT
 * @param average temperature

 * @return returns one of the values above
 * Written by Ahmad Shamshiri for robojax.com
 * on Jan 15, 2022 at 08:02 in Ajax, Ontario, Canada
 */
void readValues()
{
 //Robojax.com heater/cooler with BMP390 Thermocoupler 

  altitude =  bmp.readAltitude(SEALEVELPRESSURE_HPA);// read altitude
  pressure = bmp.pressure / 100.0F; // get  pressure in hecto pascal
  
  
  if(TEMPERATURE_UNIT ==2)
   {
   temperature = bmp.temperature *9/5 + 32;//convert to Fahrenheit 
   }else if(TEMPERATURE_UNIT ==3)
   {
    temperature = bmp.temperature + 273.15;//convert to Kelvin
   }else{
    temperature = bmp.temperature;// return Celsius
   }    
 //Robojax.com heater/cooler with BMP390 Thermocoupler 
}// readValues()


/*
 * printTemperature()
 * @brief prints  temperature on serial monitor
 * @param character type
 * @param "type" is character
 *     C = Celsius
 *     K = Kelvin
 *     F = Fahrenheit
 * @return none
 * Written by Ahmad Shamshiri for robojax.com
 * on Jan 15, 2022 at 08:09 in Ajax, Ontario, Canada
 * www.Robojax.com
 */
void printTemperature()
{
//Robojax.com heater/cooler with BMP390 Thermocoupler
   Serial.print(temperature);
    printDegree();    
  if(TEMPERATURE_UNIT ==2)
   {
     Serial.print("F");
    }else if(TEMPERATURE_UNIT ==3)
   {
     Serial.print("K");
   }else{
     Serial.print("C");
   }    
  Serial.println();
//Robojax.com heater/cooler with BMP390 Thermocoupler  
}//printTemperature()

/*
 * @brief prints degree symbol on serial monitor
 * @param none
 * @return returns nothing
 * Written by Ahmad Shamshiri on July 13, 2019
 * for Robojax Tutorial Robojax.com
 */
void printDegree()
{
    Serial.print("\\xC2"); 
    Serial.print("\\xB0");  
}

الأشياء التي قد تحتاجها

ملفات📁

ورقة البيانات (pdf)