شِفر (کود) جستجو

درس ۹۶-۴: حساس(حس کننده) فشار بارومتریک، دما و ارتفاع تقریبی BMP390 با آردوینو بهعنوان ترموستات

درس ۹۶-۴: حساس(حس کننده) فشار بارومتریک، دما و ارتفاع تقریبی BMP390 با آردوینو بهعنوان ترموستات

این آموزش نحوه ساخت یک ترموستات هوشمند با استفاده از حساس(حس کننده) فشار بارومتریک BMP390، دما و ارتفاع تقریبی با آردوینو را نشان می‌دهد. BMP390 یک حساس(حس کننده) بسیار دقیق از شرکت بوش است که می‌تواند دما، فشار را اندازه‌گیری کرده و ارتفاع تقریبی را بر اساس فشار سطح دریا محاسبه کند. در این پروژه، از آن برای کنترل یک ریلی استفاده می‌کنیم که می‌تواند بخاری یا خنک‌کننده را بر اساس آستانه‌های دما روشن و خاموش کند و یک سیستم ترموستات کاملاً کاربردی ایجاد کند.

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

این پروژه کاربردهای عملی متعددی دارد، از جمله:

  • ایجاد ترموستات خانه هوشمند برای حفظ دمای راحت اتاق
  • ساخت سیستم تهویه گلخانه با کنترل دما
  • محافظت از تجهیزات الکترونیکی حساس در برابر گرمای بیش از حد
  • کنترل انکوباتور برای تخم‌مرغ یا خزندگان
  • نظارت و تنظیم دما در انبار شراب یا اتاق نگهداری
BMP380_pink-module-3-size

سخت‌افزار مورد نیاز

  • آردوینو اونو (یا برد سازگار)
  • ماجیول حساس(حس کننده) فشار بارومتریک BMP390
  • ماجیول ریلی (برای کنترل بخاری/خنک‌کننده)
  • دستگاه بخاری یا خنک‌کننده برای کنترل
  • سیم‌های جامپر
  • برد بورد (اختیاری)

آشنایی با حساس(حس کننده) BMP390

BMP390 یک حساس(حس کننده) فشار بارومتریک بسیار دقیق است که توسط شرکت بوش ساخته شده است. حساس(حس کننده) واقعی فقط ۲ میلی‌متر در ۲ میلی‌متر در ۰.۷۵ میلی‌متر اندازه دارد که آن را بسیار جمع‌وجور می‌کند. برد شکست‌آوت که استفاده می‌کنید شامل تمام اجزای پشتیبان لازم مانند مقاومت‌های پول‌آپ، تنظیم‌کننده ولتاژ و مبدل سطح منطقی است که به شما امکان می‌دهد آن را با ۳.۳ ولت یا ۵ ولت تغذیه کنید (در ویدیو در ۰۱:۴۴).

حساس(حس کننده) می‌تواند فشار را از ۳۰۰ تا ۱۲۵۰ هکتوپاسکال با دقت مطلق ۰.۵± هکتوپاسکال بین ۰ تا ۶۵ درجه سانتی‌گراد اندازه‌گیری کند. دقت نسبی آن حتی بهتر است و ۰.۰۳± هکتوپاسکال است که تقریباً به ۲۵± سانتی‌متر اختلاف ارتفاع تبدیل می‌شود. حساس(حس کننده) همچنین دارای حداکثر نرخ نمونه‌برداری ۲۰۰ هرتز است که آن را برای کاربردهایی که نیاز به خواندن سریع دارند مناسب می‌سازد (در ویدیو در ۰۴:۱۰).

راهنمای سیم‌کشی

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

اتصال 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 ماجیول ریلی را کنترل می‌کند که بخاری یا خنک‌کننده شما را روشن و خاموش می‌کند.

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
  • واحد_دما: مقیاس دما را تنظیم میکند. برای سلسیوس از ۱، برای فارنهایت از ۲، یا برای کلوین از ۳ استفاده کنید.
  • دمای_شروع: دمایی که در آن ریلی روشن میشود (برای حالت گرمایش) یا خاموش میشود (برای حالت سرمایش).
  • دمای_توقف: دمایی که در آن ریلی خاموش میشود (برای حالت گرمایش) یا روشن میشود (برای حالت سرمایش).
  • نوع_کنترل: برای کنترل گرمایش (روشن شدن هنگام سرما) مقدار ۱ یا برای کنترل سرمایش (روشن شدن هنگام گرما) مقدار ۲ را تنظیم کنید.

برای مثال، در نمایش، دمای شروع روی ۳۰ درجه سانتیگراد و دمای توقف روی ۴۵ درجه سانتیگراد تنظیم شده است تا بتوانید بهسرعت رفتار را با تفنگ حرارتی آزمایش کنید. در یک کاربرد واقعی، این مقادیر را نزدیکتر به هم تنظیم میکنید، مانند ۲۰ درجه سانتیگراد و ۲۳ درجه سانتیگراد، تا دمای اتاق راحت حفظ شود (در ویدیو در ۳۰:۰۷).

توابع سفارشی

شِفر (کود) شامل چندین تابع سفارشی است که میتوانید از آنها استفاده و آنها را تغییر دهید:

  • 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
  • [۰۵:۴۵] نمودار سیمکشی BMP390 با آردوینو اونو
  • [۱۰:۲۹] نصب کتابخانه Adafruit BMP3XX
  • [۱۱:۳۸] توضیح شِفر (کود) برای خواندن پایه حساس(حس کننده)
  • [۱۵:۵۱] افزودن کنترل ریلی برای عملکرد ترموستات
  • [۱۷:۳۰] راهاندازی نمایشگر LCD (اختیاری)
  • [۲۲:۵۲] نمایش فشار و ارتفاع روی LCD
  • [۳۰:۰۷] نمایش ترموستات با تفنگ حرارتی
  • [۳۲:۱۲] آزمایش ارتفاع در طبقه ۲۵

تصاویر

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)