عرض درجة حرارة BMP180 على شكل رسم بياني عمودي على شاشة الـ LCD
عرض درجة الحرارة كرسم بياني عمودي على شاشة LCD هو وسيلة عملية لجعل البيانات قابلة للقراءة من لمحة، خاصة من مسافة بعيدة. بدلاً من التحديق في قيمة عددية، يوفر الرسم البياني العمودي تمثيلاً بصريًا فوريًا لدرجة الحرارة الحالية بالنسبة لحد أقصى محدد. يجمع هذا المشروع بين جهاز استشعار الضغط الجوي ودرجة الحرارة BMP180 وشاشة LCD بحجم 16x2 I2C لإنشاء عرض درجة حرارة واضح ومتناسق. يمتلئ الرسم البياني كلما ارتفعت درجة الحرارة، وعندما تتجاوز القراءة الحد الأقصى الذي حددته، يتغير العرض ليظهر "حد أقصى" لمنع overflow.

هذا الإعداد مثالي لمجموعة متنوعة من التطبيقات حيث تكون الاستجابة البصرية السريعة أكثر أهمية من الأرقام الدقيقة:
- بناء ترمومتر بصري للغرفة للاستخدام في المنزل أو المكتب.
- إنشاء جهاز مراقبة درجة الحرارة لحوض ز reptiles أو حوض نباتات.
- عرض درجة حرارة لوحة تحكم طابعة ثلاثية الأبعاد أو ماكينة CNC.
- إنشاء محطة طقس بسيطة بتقرير درجة حرارة يسهل الاطلاع عليه.
- إضافة مقياس حرارة بصري إلى جهاز كمبيوتر مخصص أو مضخم صوت.
ستساعدك هذه الدليل في توصيل المستشعر والشاشة، وتكوين الكود المقدم، وفهم كيفية تخصيصه لمشاريعك الخاصة. يفترض هذا البرنامج التعليمي أنك على دراية بأساسيات مستشعر BMP180 ووحدة LCD I2C، حيث يركز على دمجهما مع مكتبة الرسوم البيانية الشريطية.
المعدات المطلوبة
- أردوينو أونو (أو لوحة مماثلة)
- مستشعر الضغط الجوي/درجة الحرارة BMP180
- شاشة LCD 16x2 مع وحدة I2C
- أسلاك التوصيل
- لوحة تجارب (اختياري)
دليل الأسلاك
يستخدم هذا المشروع بروتوكول I2C لكل من شاشة LCD ومستشعر BMP180، مما يبسط التوصيلات بشكل كبير. يتصل كلا الجهازين بنفس خطي البيانات ومصادر الطاقة. التوصيلات بسيطة، والاتصالات الملونة أدناه تتطابق مع العرض التقديمي في الفيديو.
أولاً، قم بتوصيل وحدة LCD. تحتوي حقيبة I2C على وحدة LCD على أربع دبابيس: VCC، GND، SDA، و SCL.
- LCD VCCسلك أبيض إلى أردوينو5 فولت
- إرضاء LCDإلى أردوينوخدمة الشبكة الأرضية
- شاشة LCD SDAالسلك الرمادي إلى أردوينوA4(دبوس SDA)
- LCD SCL(سلك وردي) إلى أردوينوأي 5(إبرة SCL)
بعد ذلك، قم بتوصيل مستشعر BMP180. من المهم أن نلاحظ أن هذا المستشعر لا يتحمل 5 فولت على دبوس VIN الخاص به ويجب أن يُغذى من الخط 3.3 فولت.
- BMP180 VINالسلك الرمادي إلى أردوينو٣.٣ فولت(تحذير: لا تتصل بـ 5 فولت وإلا سيتعرض المستشعر للتلف!)
- BMP180 الأرض(سلك أرجواني) إلى أردوينوجي ان دي
- BMP180 SDAسلك أخضر إلى أردوينوA4(ترميز SDA)
- BMP180 SCLالسلك الأزرق إلى الأردوينوA5(دبوس SCL)
نظرًا لأن كلا الجهازين على نفس ناقل I2C، يمكنك توصيل دبابيس SDA و SCL الخاصة بهما بنفس دبابيس Arduino (A4 و A5، على التوالي).

شرح الكود
تم تصميم الكود ليكون قابلاً للتكوين بسهولة. جميع الإعدادات الرئيسية موجودة في أعلى الرسم التخطيطي، مما يتيح لك تعديل السلوك دون الحاجة إلى التعمق في المنطق الأساسي. إليك المعايير الرئيسية التي يمكنك تغييرها:
#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وإذا كانت الوحدة هي درجة مئوية، فسوف يظهر 25°C كأداة مملوءة نصفياً، و50°C ستملؤها بالكامل. إذا ارتفعت درجة الحرارة فوق هذه القيمة، سيظهر العرض "الحد الأقصى" بدلاً من الرسم البياني. (في الفيديو عند 05:49)
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. (في الفيديو عند 09:24)
هناك أيضًا وظيفة مخصصة تُدعىgetTemp()في الكود. هذه الوظيفة تتعامل مع التواصل مع مستشعر BMP180. تقرأ درجة الحرارة، وتحولها إلى فهرنهايت إذا كنت قد قمت بإعدادها.UNITإلى'F'القيمة. إذا فشل المستشعر في التواصل، فإن الدالة تعيد999كرمز خطأ، يقوم الحلقة الأساسية بفحصه وعرض رسالة "خطأ" على الشاشة LCD. (في الفيديو عند 15:31)
عرض المشروع الحي
في الفيديو، يتم توضيح المشروع باستخدام مسدس حراري. عندما يتم توجيه المسدس الحراري نحو مستشعر BMP180، تزداد قراءة درجة الحرارة على شاشة LCD. مع ارتفاع درجة الحرارة، يمتلئ الرسم البياني بشكل بصري بشكل متناسب. عندما تتجاوز درجة الحرارة الحد الأقصى المحدد (50 درجة مئوية في العرض التوضيحي)، يختفي الرسم البياني وتظهر الشاشة "Max" جنبًا إلى جنب مع قراءة درجة الحرارة الفعلية. بمجرد إزالة مصدر الحرارة والعودة إلى انخفاض درجة الحرارة دون الحد الأقصى، يظهر الرسم البياني مرة أخرى ويعمل بشكل طبيعي مرة أخرى. هذا يُظهر بوضوح كيفية تغيير الرسم البياني مع درجة الحرارة وكيفية عمل حماية "Max" من overflow. (في الفيديو في 17:34)
يمكنك أيضًا تغيير الوحدة إلى فهرنهايت عن طريق الإعداد#define UNIT 'F'و ضبط الmaxTemperatureبناءً عليه. تُظهر التجربة أنه مع أقصى حرارة تبلغ 100°F، يعمل العرض بنفس الفعالية، مع عرض درجة الحرارة والرسم البياني الشريطي في الوحدة المحددة.
فصول
- مقدمة عن عرض درجة حرارة BMP180 كرسوم بيانية شريطية
- [00:43] لماذا نستخدم الرسم البياني الشريطي لعرض درجة الحرارة
- توصيل شاشة LCD ومستشعر BMP180
- [03:34] شرح الشيفرة والمكتبات المطلوبة
- [07:13] العثور على عنوان I2C لشاشتك LCD
- [09:24] ضبط موضع وطول مخطط الأعمدة
- فهم دالة getTemp()
- عرض مباشر باستخدام مسدس الحرارة :34
/* 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/////////////////////////////
الأشياء التي قد تحتاجها
-
أمازوناشترِ BMP180 من أمازونamzn.to
الموارد والمراجع
-
خارجيبيانات BMP180 (بي دي إف)cdn-shop.adafruit.com
-
خارجيتفاصيل المنتج من الشركة المصنعةbosch-sensortec.com
-
خارجيمقدمة عن مستشعر BMP180youtube.com
-
خارجيمكتبة SparkFun BMP180github.com
ملفات📁
مكتبات أردوينو (ملف مضغوط)
-
مكتبة مخطط الشريط LCD من Robojax (ملف ZIP)
robojax-LCD-bargraph-Library.zip0.10 MB