الدرس 96-4: مستشعر الضغط الجوي ودرجة الحرارة والارتفاع التقريبي BMP390 مع أردوينو كمنظم حرارة
يشرح هذا البرنامج التعليمي كيفية بناء منظم حرارة ذكي باستخدام مستشعر الضغط الجوي BMP390 ودرجة الحرارة والارتفاع التقريبي مع Arduino. إن BMP390 هو مستشعر عالي الدقة من Bosch يمكنه قياس درجة الحرارة والضغط وحساب الارتفاع التقريبي بناءً على ضغط مستوى سطح البحر. في هذا المشروع، سنستخدمه للتحكم في مرحل يمكنه تشغيل وإيقاف سخان أو مبرد بناءً على عتبات درجة الحرارة، مما ينشئ نظام منظم حرارة كامل الوظائف.
لهذا المشروع عدة تطبيقات عملية، بما في ذلك:
- إنشاء منظم حرارة منزلي ذكي للحفاظ على درجة حرارة غرفة مريحة
- بناء نظام تهوية للاحتباس الحراري يتم التحكم فيه بدرجة الحرارة
- حماية الأجهزة الإلكترونية الحساسة من ارتفاع درجة الحرارة
- التحكم في حاضنة للبيض أو الزواحف
- مراقبة وتنظيم درجة الحرارة في قبو النبيذ أو غرفة التخزين
الأجهزة المطلوبة
- 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 أمرًا بسيطًا باستخدام واجهة 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 في وحدة المرحل التي تقوم بتبديل السخان أو المبرد الخاص بك.
إعدادات منظم الحرارة
تحدد هذه الثوابت كيفية تصرف منظم الحرارة الخاص بك:
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).
مشاريع ذات صلة من هذا الفيديو
- الدرس 96-1: مستشعر الضغط الجوي ودرجة الحرارة والارتفاع التقريبي BMP390 مع كود أساسي لـ Arduino
- الدرس 96-2: مستشعر الضغط الجوي ودرجة الحرارة والارتفاع التقريبي BMP390 مع Arduino على LCD1602
- الدرس 96-3: مستشعر الضغط الجوي ودرجة الحرارة والارتفاع التقريبي BMP390 مع Arduino على LCD2004
الفصول
- [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] اختبار الارتفاع في الطابق الخامس والعشرين
الصور
/*
* 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");
}
الأشياء التي قد تحتاجها
-
أمازون
-
إي باي
-
علي إكسبريسBMP388 High Precision Digital Atmospheric Pressure on AliExpresss.click.aliexpress.com
-
علي إكسبريساشتريه من علي إكسبرسs.click.aliexpress.com
-
بانجودقم بشرائها من بانجود.banggood.com
الموارد والمراجع
-
خارجياشتره من أمازون كنداamzn.to
-
خارجي
-
خارجي
-
خارجياشتريه من علي إكسبرسs.click.aliexpress.com
-
خارجيصفحة المنتج الرسمية BMP390 من بوشbosch-sensortec.com
-
خارجيقم بشرائها من بانجود.banggood.com