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

نمایش دمای BMP180 به‌صورت نمودار میله‌ای بر روی ال سی دی

نمایش دمای BMP180 به‌صورت نمودار میله‌ای بر روی ال سی دی

نمایش دما به صورت یک نمودار میله‌ای بر روی صفحه نمایش LCD روشی عملی برای قابل خواندن کردن داده‌ها در یک نگاه، به‌ویژه از فاصله است. به جای اینکه به یک مقدار عددی خیره شوید، یک نمودار میله‌ای نمای بصری فوری از دمای فعلی نسبت به حداکثر تعریف‌شده به شما می‌دهد. این پروژه یک حساس(حس کننده) فشار بارومتری و دما BMP180 را با یک LCD I2C 16x2 ترکیب می‌کند تا یک نمایش واضح و متناسب از دما ایجاد کند. نمودار میله‌ای به محض افزایش دما پر می‌شود و زمانی که خوانش از حداکثر تنظیم‌شده شما فراتر رود، نمایش به "Max" تغییر می‌کند تا از سرریز جلوگیری کند.

این تنظیم برای انواع کاربردها که بازخورد بصری سریع مهم‌تر از اعداد دقیق است، ایده‌آل است:

  • ساخت یک دماسنج بصری برای منزل یا دفتر کار.
  • ایجاد یک مانیتور دما برای یک محفظه خزندگان یا تراریوم گیاهی.
  • نمایش دمای برد کنترل یک پرینتر سه‌بعدی یا دستگاه CNC.
  • ساخت یک ایستگاه هوایی ساده با یک نمایشگر دمایی که به راحتی قابل مشاهده باشد.
  • اضافه کردن یک دماسنج تصویری به یک ساختار کامپیوتر سفارشی یا تقویت‌کننده صوتی.

این راهنما شما را در مورد کشیدن سیم‌های حساس(حس کننده) و نمایشگر، تنظیم شِفر (کود) ارائه شده و درک نحوه سفارشی‌سازی آن برای پروژه‌های خودتان هدایت می‌کند. این آموزش فرض می‌کند که با اصول پایه‌ای حساس(حس کننده) BMP180 و ماجیول LCD I2C آشنا هستید، زیرا بر روی ترکیب آن‌ها با یک کتابخانه گراف بار تمرکز دارد.

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

  • آردوینو اونو (یا بورد مشابه)
  • حساس(حس کننده) فشارسنج/دما BMP180
  • LCD 16x2 با ماجیول I2C
  • کابل‌های جامپر
  • بردبرد (اختیاری)

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

این پروژه از پروتکل I2C برای هر دو صفحه نمایش LCD و حساس(حس کننده) BMP180 استفاده می‌کند که به طرز قابل توجهی سیم‌کشی را ساده می‌کند. هر دو دستگاه به همان دو خط داده و ریل‌های تغذیه متصل می‌شوند. سیم‌کشی ساده است و اتصالات شِفر (کود) شده با رنگ در زیر با دمونستراسی که در ویدیو مشاهده می‌شود مطابقت دارد.

نخست، ماجیول LCD را متصل کنید. بسته I2C روی LCD دارای چهار پایه است: VCC، GND، SDA و SCL.

  • LCD VCC(سیم سفید) به آردوینو۵ ولت
  • جی‌اِن‌دی ال‌سی‌دیبه آردوینوGND
  • LCD SDAبه آردوینو (سیم خاکستری)A4(پایه SDA)
  • LCD SCL(سیم صورتی) به آردوینوA5(SCL پایه)

سپس حساس(حس کننده) BMP180 را وصل کنید. نکته حائز اهمیت این است که این حساس(حس کننده) روی پایه VIN خود تحمل ۵ ولت ندارد و باید از ریل ۳.۳ ولت تغذیه شود.

  • BMP180 VINبه آردوینو (سیم خاکستری)3.3 ولت(هشدار: به 5 ولت متصل نشوید وگرنه حساس(حس کننده) آسیب خواهد دید!)
  • جی‌ام‌دی BMP180به آردوینو (سیم بنفش)GND
  • BMP180 SDA(سیم سبز) به آردوینوA4(پایه SDA)
  • BMP180 SCL(سیم آبی) به آردوینوA5(پایه SCL)

از آنجا که هر دو دستگاه بر روی همان بستر I2C هستند، می‌توانید پایه‌های SDA و SCL آن‌ها را به پایه‌های مشابه آردوینو (A4 و A5 به ترتیب) متصل کنید.

LCD Bargraph BMP180 LCD1602 wiring

توضیح شِفر (کود)

شِفر (کود) به گونه‌ای طراحی شده است که به راحتی قابل پیکربندی باشد. تنظیمات کلیدی همه در بالای طرح قرار دارند و به شما این امکان را می‌دهند که رفتار را بدون وارد شدن به منطق اصلی تنظیم کنید. در اینجا پارامترهای اصلی که می‌توانید تغییر دهید آورده شده‌اند:

#define UNIT 'C' // unit type C for Celsius F for Fahrenheit
#define maxTemperature 40 // is the value in Celsius or Fahrenheit set in line above

این دو خط واحد و مقیاس نمایش شما را کنترل می‌کند.UNITثابت فقط یک حرف بزرگ را قبول می‌کند'C'برای سلسیوس یا یک نامه بزرگ'F'برای فارنهایت. اینmaxTemperatureمقدار، حد بالایی نمودار میله‌ای شما را تعریف می‌کند. به عنوان مثال، اگر این را تنظیم کنید به50و واحد درجه حرارت سلسیوس است، پس ۲۵°C به عنوان یک نوار نیمه پر نمایش داده می‌شود و ۵۰°C آن را کاملاً پر می‌کند. اگر دما بالاتر از این مقدار برود، نمایشگر به جای نمودار "حداکثر" را نشان خواهد داد. (در ویدئو در ۰۵:۴۹)

LiquidCrystal_I2C lcd(0x3f,lcdNumCols,lcdLine); //0x3f is address for I2C

این خط LCD را راه‌اندازی می‌کند.0x3fآدرس I2C ماجیول LCD خاص شماست. این آدرس ممکن است بین تولیدکنندگان متفاوت باشد. برای پیدا کردن آن، می‌توانید یک اسکیچ اسکنر I2C اجرا کنید که معمولاً همراه با کتابخانه LCD گنجانده شده یا به صورت آنلاین در دسترس است. به سادگی اسکنر را بارگذاری کنید، نمایشگر مسلسل را باز کنید و این اسکنر آدرس هر دستگاه I2C متصل را گزارش خواهد داد. (در ویدیو در 07:13)

LcdBarGraphRobojax robojax(&lcd, 16, 0, 0);  // -- creating 16 character long bargraph starting at char 0 of line 0 (see video)

این خط خود گراف میله‌ای را پیکربندی می‌کند. پارامتر اول (&lcdبه یک شیء LCD شما ارجاع می‌دهد. پارامتر دوم (16) طول نمودار میله‌ای به صورت خصیصه است. پارامترهای سوم و چهارم (0, 0موقعیت شروع را تعریف کنید: اولی0ستون (موقعیت خصیصه) است و دومی0ردیف (خط) است. برای قرار دادن نمودار در خط دوم، باید مقدار آخر را به1. (در ویدیو در ۰۹:۲۴)

یک تابع سفارشی به نام نیز وجود داردgetTemp()در شِفر (کود). این تابع ارتباط با حساس(حس کننده) BMP180 را مدیریت می‌کند. دما را می‌خواند و اگر تنظیم کرده باشید، آن را به درجه فارنهایت تبدیل می‌کند.UNITبه'F'، و مقدار را برمی‌گرداند. اگر حساس(حس کننده) نتواند ارتباط برقرار کند، تابع برمی‌گرداند999به عنوان یک شِفر (کود) خطا که حلقه اصلی آن را بررسی کرده و پیام "خطا" را در LCD نمایش می‌دهد. (در ویدئو در ۱۵:۳۱)

نمایش پروژه زنده

در ویدئو، پروژه با استفاده از یک سشوار حرارتی نمایش داده می‌شود. زمانی که سشوار حرارتی روی حساس(حس کننده) BMP180 دمیده می‌شود، دما در صفحه LCD افزایش می‌یابد. با افزایش دما، نمودار میله‌ای به طور بصری نسبت به آن پر می‌شود. زمانی که دما از حداکثر تعریف‌شده (50 درجه سانتی‌گراد در دمو) فراتر می‌رود، نمودار میله‌ای ناپدید می‌شود و نمایشگر "Max" را به همراه قرائت دما نشان می‌دهد. هنگامی که منبع حرارت برداشته می‌شود و دما دوباره به زیر حداکثر می‌رسد، نمودار میله‌ای دوباره ظاهر شده و به طور طبیعی عمل می‌کند. این نشان می‌دهد که چگونه نمودار با دما مقیاس‌بندی می‌شود و چگونه حفاظت از سرریز "Max" کار می‌کند. (در ویدیو در 17:34)

شما همچنین می‌توانید واحد را با تنظیم به فارنهایت تغییر دهید#define UNIT 'F'و تنظیم کردن راmaxTemperatureبر این اساس. این نمایش نشان می‌دهد که با حداکثر 100°F، نمایش به طور مؤثر همان‌طور که انتظار می‌رود کار می‌کند و دما و نمودار میله‌ای را در واحد انتخاب‌شده نشان می‌دهد.

فصل‌ها

  • [00:00] مقدمه‌ای بر نمایش دما BMP180 به صورت نمودار میله‌ای
  • چرا از نمودار میله‌ای برای نمایش دما استفاده کنیم؟
  • [02:34] سیم‌کشی LCD و حساس(حس کننده) BMP180
  • توضیح شِفر (کود) و کتابخانه‌های مورد نیاز
  • [07:13] پیدا کردن آدرس I2C LCD شما
  • تنظیم موقعیت و طول نمودار میله‌ای :24
  • [15:31] درک تابع getTemp()
  • [17:34] نمایش زنده با سشوار حرارتی

تصاویر

LCD1602-I2C display module with 4 wires
LCD1602-I2C display module with 4 wires
LCD Bargraph BMP180 LCD1602 wiring
LCD Bargraph BMP180 LCD1602 wiring
BMP180 module 1
BMP180 module 1
BMP180 module 2 back
BMP180 module 2 back
BMP180 module 3 with pin
BMP180 module 3 with pin
195-Display BMP180 temperature as a bar graph on an LCD using Arduino
زبان: C++
/* Display temperature from BMP180 as bargraph on LCD 
 *  Original Sources: 
 *  BMP180 library from https://www.sparkfun.com/products/11824
 *  LCD library: https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library
 *  Bargraph library from https://playground.arduino.cc/Code/LcdBarGraph/
 *  
 *  
 *  Written and updated by Ahmad Shamshiri on June 05, 2019
 *  for Robojax in Ajax, Ontario
  Watch video tutorial for this code: https://youtu.be/0IojNYgDD7U
  If you need the schematic diagram of this circuit, please visit  http://bit.ly/rj-udemy

* Robojax Arduino Course on Udemy where you get the schematic diagram of this sketch 
 * and many other robotics-related lectures and codes. Purchase the course here: http://bit.ly/rj-udemy


- (GND) to GND
+ (VDD) to 3.3V

(WARNING: Do not connect + to 5V or the sensor will be damaged!)

*/

#include <SFE_BMP180.h>
#include <Wire.h>


SFE_BMP180 rjt;// creating object called "rjt" (robojax temperature)
#define UNIT 'C' // unit type C for Celsius F for Fahrenheit
#define maxTemperature 40 // is the value in Celsius or Fahrenheit set in line above

// LCD settings
#include <LiquidCrystal_I2C.h>
byte lcdNumCols = 16; // -- number of columns in the LCD
byte lcdLine = 2; // -- number of lines in the LCD

LiquidCrystal_I2C lcd(0x3f,lcdNumCols,lcdLine); //0x3f is address for I2C
                  // to get I2C address, run I2C Scanner. 
                  //Link is provided (in same page as this code) at http://robojax.com/learn/arduino
// bargraph settings
#include <LcdBarGraphRobojax.h>
LcdBarGraphRobojax robojax(&lcd, 16, 0, 0);  // -- creating 16 character long bargraph starting at char 0 of line 0 (see video)



void setup()
{
  Serial.begin(9600);//initialize serial monitor
 // -- initializing the LCD
  lcd.begin();
  lcd.clear();
  lcd.print("Robojax"); 
   
 
  // Initialize the sensor (it is important to get calibration values stored on the device).

  if (rjt.begin())
  {
   lcd.setCursor (0,1); //  
    lcd.print("BMP180 Bargraph");  
  }else {
    lcd.setCursor (0,1); //  
    lcd.print("BMP180 Failed"); 
    while(1); // Pause forever.
  }
  // -- give use some time to read the text above
  delay(2000);
  lcd.clear();  
}// setup

void loop()
{
 // Robojax BMP180 Bargraph main loop

 robojax.clearLine(1);// clear line 1 to display fresh temperature
 float T = getTemp();// get the temperature
 float Tgraph=T;
 if(T !=999){
     if( Tgraph > maxTemperature){   
        Tgraph =0;
     }
        robojax.drawValue( Tgraph, maxTemperature);// draw the bargraph     
      // Print out the measurement:
      Serial.print("temperature: ");
      Serial.print(T,2);


      lcd.setCursor (0,1); //
      if(T< maxTemperature){       
       lcd.print("Temp.:"); 
      }else{
       lcd.print("Max.:"); 
      }
      lcd.setCursor (7,1); //
      lcd.print(T); // print  
      lcd.print((char)223);// prints degree symbol
      if(UNIT =='C'){
        lcd.print("C");//
        Serial.println(" deg C");         
      }else{
        lcd.print("F");
        Serial.println(" deg F");         
      }
      
   



  }else{
    Serial.print("Status error");
      lcd.setCursor (0,1); //
      lcd.print("Error ");     
  }

delay(500);
}


/*
 * 
 * @brief gets the temperature in Celsius or Fahrenheit
 * @param unit, should be capital C or capital F, C=Celsius F=Fahrenheit
 * @return temperature in Celsius or Fahrenheit
 * Written by Ahmad Shamshiri for Robojax.com 
 * on Wednesday, June 5th, 2019 at 22:30 in Ajax, Ontario, Canada
 * 
 */
 ////////////////////////////////////////////
double getTemp(){
    char status;
  double Temp,newTemp;
 
status = rjt.startTemperature();
  if (status != 0)
  {
    // Wait for the measurement to complete:
    delay(status);

    // Retrieve the completed temperature measurement:
    // Note that the measurement is stored in the variable T.
    // Function returns 1 if successful, 0 if failure.

    status = rjt.getTemperature(Temp);
    if (status != 0)
    {  
      if (UNIT =='F')
      {
        newTemp = (9.0/5.0)*Temp+32.0;// convert to degrees Fahrenheit
      }else{
        newTemp = Temp;// keeps degree Celsius
      }
    }
    return newTemp;    
  }else{
    return 999;// if error, then return 999
  }
}//getTemp/////////////////////////////

مواردی که ممکن است به آن‌ها نیاز داشته باشید

منابع و مراجع

فایل‌ها📁

کتابخانه‌های آردوینو (zip)