درس ۹۶-۴: حساس(حس کننده) فشار بارومتریک، دما و ارتفاع تقریبی BMP390 با آردوینو بهعنوان ترموستات
این آموزش نحوه ساخت یک ترموستات هوشمند با استفاده از حساس(حس کننده) فشار بارومتریک BMP390، دما و ارتفاع تقریبی با آردوینو را نشان میدهد. BMP390 یک حساس(حس کننده) بسیار دقیق از شرکت بوش است که میتواند دما، فشار را اندازهگیری کرده و ارتفاع تقریبی را بر اساس فشار سطح دریا محاسبه کند. در این پروژه، از آن برای کنترل یک ریلی استفاده میکنیم که میتواند بخاری یا خنککننده را بر اساس آستانههای دما روشن و خاموش کند و یک سیستم ترموستات کاملاً کاربردی ایجاد کند.
این پروژه کاربردهای عملی متعددی دارد، از جمله:
- ایجاد ترموستات خانه هوشمند برای حفظ دمای راحت اتاق
- ساخت سیستم تهویه گلخانه با کنترل دما
- محافظت از تجهیزات الکترونیکی حساس در برابر گرمای بیش از حد
- کنترل انکوباتور برای تخممرغ یا خزندگان
- نظارت و تنظیم دما در انبار شراب یا اتاق نگهداری
سختافزار مورد نیاز
- آردوینو اونو (یا برد سازگار)
- ماجیول حساس(حس کننده) فشار بارومتریک BMP390
- ماجیول ریلی (برای کنترل بخاری/خنککننده)
- دستگاه بخاری یا خنککننده برای کنترل
- سیمهای جامپر
- برد بورد (اختیاری)
آشنایی با حساس(حس کننده) BMP390
BMP390 یک حساس(حس کننده) فشار بارومتریک بسیار دقیق است که توسط شرکت بوش ساخته شده است. حساس(حس کننده) واقعی فقط ۲ میلیمتر در ۲ میلیمتر در ۰.۷۵ میلیمتر اندازه دارد که آن را بسیار جمعوجور میکند. برد شکستآوت که استفاده میکنید شامل تمام اجزای پشتیبان لازم مانند مقاومتهای پولآپ، تنظیمکننده ولتاژ و مبدل سطح منطقی است که به شما امکان میدهد آن را با ۳.۳ ولت یا ۵ ولت تغذیه کنید (در ویدیو در ۰۱:۴۴).
حساس(حس کننده) میتواند فشار را از ۳۰۰ تا ۱۲۵۰ هکتوپاسکال با دقت مطلق ۰.۵± هکتوپاسکال بین ۰ تا ۶۵ درجه سانتیگراد اندازهگیری کند. دقت نسبی آن حتی بهتر است و ۰.۰۳± هکتوپاسکال است که تقریباً به ۲۵± سانتیمتر اختلاف ارتفاع تبدیل میشود. حساس(حس کننده) همچنین دارای حداکثر نرخ نمونهبرداری ۲۰۰ هرتز است که آن را برای کاربردهایی که نیاز به خواندن سریع دارند مناسب میسازد (در ویدیو در ۰۴:۱۰).
راهنمای سیمکشی
اتصال BMP390 به آردوینو با استفاده از رابط I2C ساده است که فقط به دو سیم برای ارتباط داده بهعلاوه اتصالات برق نیاز دارد. پایه VIN حساس(حس کننده) به ۵ ولت (یا ۳.۳ ولت) آردوینو متصل میشود، زمین به زمین متصل میشود، SCL به پایه SCL (A5 در اونو) و SDA به پایه SDA (A4 در اونو) متصل میشود (در ویدیو در ۰۵:۴۵).
برای ماجیول ریلی، پایه کنترل آن را به پایه دیجیتال ۸ آردوینو، VCC را به ۵ ولت و زمین را به زمین متصل میکنید. دستگاهی که میخواهید کنترل کنید (بخاری یا خنککننده) به پایههای خروجی ریلی متصل میشود.
یکی از ویژگیهای منحصربهفرد این پروژه این است که شِفر (کود) پایه ۱۲ را به عنوان خروجی برق برای ماجیول BMP390 تعریف میکند. این بدان معناست که میتوانید حساس(حس کننده) را مستقیماً از یک پایه آردوینو تغذیه کنید بدون نیاز به ریل برق جداگانه روی برد بورد (در ویدیو در ۰۸:۴۶). شِفر (کود) این پایه را در بخش setup روی HIGH تنظیم میکند تا ۵ ولت به حساس(حس کننده) ارائه دهد.
نصب کتابخانههای مورد نیاز
قبل از آپلود شِفر (کود)، باید کتابخانه Adafruit BMP3XX را نصب کنید. Arduino IDE را باز کنید، به Sketch → Include Library → Manage Libraries بروید، عبارت "Adafruit BMP3XX" را جستجو کنید و روی Install کلیک کنید (در ویدیو در ۱۰:۲۹). این کتابخانه تمام ارتباطات سطح پایین با حساس(حس کننده) BMP390 را مدیریت میکند.
توضیح شِفر (کود)
شِفر (کود) این پروژه ترموستات به گونهای طراحی شده است که بسیار قابل تنظیم باشد. بیایید تنظیمات کلیدی قابل پیکربندی توسط کاربر را در بالای برنامه بررسی کنیم.
تعریف پایهها
میتوانید تغییر دهید که کدام پایههای آردوینو برای برق حساس(حس کننده) و کنترل ریلی استفاده شوند:
int bmpVCCPin = 12;//define pin 12 as VCC for bmp sensor
const int relayPin = 8;
bmpVCCPin برق ۵ ولت را به ماجیول 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- واحد_دما: مقیاس دما را تنظیم میکند. برای سلسیوس از ۱، برای فارنهایت از ۲، یا برای کلوین از ۳ استفاده کنید.
- دمای_شروع: دمایی که در آن ریلی روشن میشود (برای حالت گرمایش) یا خاموش میشود (برای حالت سرمایش).
- دمای_توقف: دمایی که در آن ریلی خاموش میشود (برای حالت گرمایش) یا روشن میشود (برای حالت سرمایش).
- نوع_کنترل: برای کنترل گرمایش (روشن شدن هنگام سرما) مقدار ۱ یا برای کنترل سرمایش (روشن شدن هنگام گرما) مقدار ۲ را تنظیم کنید.
برای مثال، در نمایش، دمای شروع روی ۳۰ درجه سانتیگراد و دمای توقف روی ۴۵ درجه سانتیگراد تنظیم شده است تا بتوانید بهسرعت رفتار را با تفنگ حرارتی آزمایش کنید. در یک کاربرد واقعی، این مقادیر را نزدیکتر به هم تنظیم میکنید، مانند ۲۰ درجه سانتیگراد و ۲۳ درجه سانتیگراد، تا دمای اتاق راحت حفظ شود (در ویدیو در ۳۰:۰۷).
توابع سفارشی
شِفر (کود) شامل چندین تابع سفارشی است که میتوانید از آنها استفاده و آنها را تغییر دهید:
- loadControl(): این تابع منطق ترموستات را پیادهسازی میکند. دمای فعلی را با آستانههای START و STOP شما مقایسه میکند و تابع
relayControl()را بر اساس آن فراخوانی میکند. رفتار بر اساس اینکه CONTROL_TYPE را روی ۱ (گرمایش) یا ۲ (سرمایش) تنظیم کردهاید تغییر میکند. - relayControl(int state): این تابع ریلی را روشن یا خاموش میکند و وضعیت را در مانیتور سری چاپ میکند. به آن یا
relayONیاrelayOFFرا ارسال کنید. - readValues(): این تابع حساس(حس کننده) را میخواند و دما، فشار و ارتفاع را در متغیرهای سراسری ذخیره میکند. بهطور خودکار دما را به واحد انتخابی شما تبدیل میکند.
- printTemperature(): این تابع خواندن دما را با نماد واحد مناسب در مانیتور سری چاپ میکند.
نحوه عملکرد ترموستات
منطق ترموستات با مقایسه دمای فعلی با آستانههای پیکربندیشده شما کار میکند. در حالت گرمایش (CONTROL_TYPE = 1)، وقتی دما به دمای START_TEMPERATURE یا کمتر از آن برسد، ریلی روشن میشود تا دستگاه گرمایشی شما فعال شود. بخاری روشن میماند تا دما به دمای STOP_TEMPERATURE برسد، که در آن نقطه ریلی خاموش میشود. این یک اثر هیسترزیس ایجاد میکند که از چرخههای سریع روشن/خاموش جلوگیری میکند (در ویدیو در ۳۱:۰۴).
در حالت سرمایش (CONTROL_TYPE = 2)، منطق معکوس است. ریلی وقتی روشن میشود که دما به دمای STOP_TEMPERATURE برسد یا از آن فراتر رود، و وقتی دما به دمای START_TEMPERATURE برگردد خاموش میشود.
نمایش در ویدیو این کار را با یک تفنگ حرارتی نشان میدهد. وقتی دما به ۴۵ درجه سانتیگراد رسید، ریلی خاموش شد و چراغ نشانگر خاموش شد. پس از خنک شدن به ۳۰ درجه سانتیگراد، ریلی دوباره فعال شد تا بخاری را روشن کند (در ویدیو در ۳۱:۵۳).
نمایش زنده پروژه
ویدیو شامل یک آزمایش عملی ارتفاع BMP390 است. ارائهدهنده حساس(حس کننده) را به مکانی در اِجَکس، انتاریو، کانادا برد و ارتفاع را در سطح زمین نزدیک یک زمین اسکیت روی یخ اندازهگیری کرد. حساس(حس کننده) ابتدا تقریباً ۱۵- متر را نشان داد که نشاندهنده تفاوت بین کالیبراسیون فشار سطح دریا محلی و ارتفاع واقعی آن نقطه است (در ویدیو در ۳۳:۰۴).
با بردن حساس(حس کننده) به طبقه ۲۵ یک ساختمان نزدیک، خواندن به تقریباً ۵۷.۲ متر تغییر کرد. تفاوت حدود ۷۲ متر بین طبقه همکف و طبقه ۲۵ توانایی حساس(حس کننده) را در تشخیص تغییرات ارتفاع معنادار نشان میدهد. این آزمایش کاربردپذیری BMP390 را برای کاربردهایی که نیاز به نظارت بر ارتفاع دارند تأیید میکند (در ویدیو در ۳۶:۱۶).
نمایش ترموستات نشان میدهد که ریلی وقتی دما از آستانه توقف ۴۵ درجه سانتیگراد فراتر رفت خاموش میشود و چراغ نشانگر خاموش میشود. پس از خنک کردن حساس(حس کننده) به زیر ۳۰ درجه سانتیگراد، ریلی دوباره فعال شد و کنترل دمای قابل اعتماد مبتنی بر هیسترزیس را نشان داد (در ویدیو در ۳۱:۰۴).
پروژههای مرتبط از این ویدیو
- درس ۹۶-۱: حساس(حس کننده) فشار بارومتریک، دما و ارتفاع تقریبی BMP390 با آردوینو شِفر (کود) پایه
- درس ۹۶-۲: حساس(حس کننده) فشار بارومتریک، دما و ارتفاع تقریبی BMP390 با آردوینو روی LCD1602
- درس ۹۶-۳: حساس(حس کننده) فشار بارومتریک، دما و ارتفاع تقریبی BMP390 با آردوینو روی LCD2004
فصلها
- [۰۰:۰۰] معرفی پروژه حساس(حس کننده) BMP390
- [۰۱:۱۹] درک مشخصات حساس(حس کننده) BMP390
- [۰۵:۴۵] نمودار سیمکشی BMP390 با آردوینو اونو
- [۱۰:۲۹] نصب کتابخانه Adafruit BMP3XX
- [۱۱:۳۸] توضیح شِفر (کود) برای خواندن پایه حساس(حس کننده)
- [۱۵:۵۱] افزودن کنترل ریلی برای عملکرد ترموستات
- [۱۷:۳۰] راهاندازی نمایشگر LCD (اختیاری)
- [۲۲:۵۲] نمایش فشار و ارتفاع روی LCD
- [۳۰:۰۷] نمایش ترموستات با تفنگ حرارتی
- [۳۲:۱۲] آزمایش ارتفاع در طبقه ۲۵
تصاویر
/*
* 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
منابع و مراجع
-
خارجیآن را از بنگود خریداری کنیدbanggood.com
-
خارجی
-
خارجیآن را از علیاکسپرس خریداری کنیدs.click.aliexpress.com
-
خارجی
-
خارجی
-
خارجیصفحه رسمی محصول BMP390 بوشbosch-sensortec.com