Search Code

Melexis MLX90614 انفراریڈ تھرمامیٹر کو Arduino LCD1602 کے ساتھ استعمال کرنا

Melexis MLX90614 انفراریڈ تھرمامیٹر کو Arduino LCD1602 کے ساتھ استعمال کرنا

جسمانی رابطے کے بغیر درجہ حرارت کی پیمائش ایک دلچسپ صلاحیت ہے جو بہت سے عملی اور تخلیقی منصوبوں کے دروازے کھولتی ہے۔ Melexis MLX90614 انفراریڈ تھرمامیٹر اشیاء سے خارج ہونے والی حرارتی شعاعوں کا پتہ لگا کر یہ ممکن بناتا ہے، جس سے آپ محفوظ فاصلے سے درجہ حرارت کی پیمائش کر سکتے ہیں۔ یہ گائیڈ آپ کو دکھائے گا کہ اس ورسٹائل سینسر کو Arduino سے کیسے جوڑیں اور آبجیکٹ اور محیطی درجہ حرارت دونوں کو I2C LCD اسکرین (یا تو 16x2 یا 20x4 کریکٹر ڈسپلے) پر کیسے دکھائیں۔

یہ پروجیکٹ وسیع پیمانے پر ایپلیکیشنز کے لیے بہترین ہے، جیسے:

  • کلینک یا آفس کے داخلی مقام کے لیے بغیر چھوئے بخار کی اسکریننگ اسٹیشن بنانا۔
  • پرنٹ میں مداخلت کیے بغیر 3D پرنٹر بیڈ یا ہاٹ اینڈ کا درجہ حرارت مانیٹر کرنا۔
  • کھانا پکانے یا بریونگ کے لیے محفوظ، غیر رابطہ فوڈ ٹمپریچر چیکر بنانا۔
  • جسمانی حرارت کے نشانات کی پیمائش کرکے ایک سادہ انسانی موجودگی کا پتہ لگانے والا آلہ تیار کرنا۔
  • مشین کے پرزوں یا برقی پینلز کا درجہ حرارت محفوظ فاصلے سے چیک کرنا۔

MLX90614 سینسر I2C پروٹوکول پر کمیونیکیشن کرتا ہے، جس کا مطلب ہے کہ اسے صرف دو ڈیٹا پن (SDA اور SCL) کے علاوہ پاور اور گراؤنڈ کی ضرورت ہوتی ہے۔ یہ وائرنگ کو سیدھا بناتا ہے اور دوسرے اجزاء کے لیے کافی پن خالی چھوڑ دیتا ہے۔ اس ٹیوٹوریل کے اختتام تک، آپ کے پاس ایک کام کرنے والا درجہ حرارت ڈسپلے ہوگا جو سیلسیس، فارن ہائیٹ، یا کیلون میں ریڈنگ دکھا سکتا ہے، اور آپ سمجھ جائیں گے کہ اپنی مخصوص ضروریات کے لیے کوڈ کو کیسے کسٹمائز کریں۔

مطلوبہ ہارڈویئر

اس پروجیکٹ کو بنانے کے لیے، آپ کو درج ذیل اجزاء کی ضرورت ہوگی:

  • Arduino بورڈ (Uno، Nano، Mega، وغیرہ)
  • MLX90614 انفراریڈ درجہ حرارت سینسر ماجیول
  • I2C LCD ڈسپلے (16x2 یا 20x4 کریکٹر)
  • جمپر تار
  • بریڈ بورڈ (اختیاری، آسان کنکشن کے لیے)

وائرنگ گائیڈ

اس پروجیکٹ کی وائرنگ آسان ہے کیونکہ MLX90614 سینسر اور LCD ڈسپلے دونوں I2C کمیونیکیشن پروٹوکول استعمال کرتے ہیں۔ اس کا مطلب ہے کہ وہ ایک ہی دو ڈیٹا لائنز (SDA اور SCL) شیئر کر سکتے ہیں، جو متوازی طور پر جڑی ہوتی ہیں۔ سینسر 3.3V لاجک پر کام کرتا ہے، لیکن اسے Arduino کے 3.3V آؤٹ پٹ سے پاور کیا جا سکتا ہے۔ تاہم، LCD ماجیول کو عام طور پر اس کے بیک لائٹ اور لاجک کے لیے 5V کی ضرورت ہوتی ہے (ویڈیو میں 03:15 پر)۔

یہاں کنکشن کی تفصیل ہے:

  • MLX90614 VCC → Arduino 3.3V
  • MLX90614 GND → Arduino GND
  • MLX90614 SCL → Arduino A5 (SCL)
  • MLX90614 SDA → Arduino A4 (SDA)
  • LCD VCC → Arduino 5V
  • LCD GND → Arduino GND
  • LCD SCL → Arduino A5 (SCL)
  • LCD SDA → Arduino A4 (SDA)

چونکہ I2C ایک بس پروٹوکول ہے، آپ ایک ہی دو لائنوں پر 128 ڈیوائسز تک جوڑ سکتے ہیں (ویڈیو میں 03:44 پر)۔ اگر آپ Arduino Uno یا Nano استعمال کر رہے ہیں، تو SDA اور SCL پن بالترتیب A4 اور A5 پر واقع ہیں۔ دوسرے بورڈز جیسے Mega کے لیے، یہ پن مختلف مقامات (20 اور 21) پر ہیں، لہذا اپنے بورڈ کا پن آؤٹ ضرور چیک کریں۔

MLX90614_LCD_wiring

لائبریریز سیٹ اپ کرنا

کوڈ اپ لوڈ کرنے سے پہلے، آپ کو دو ضروری لائبریریز انسٹال کرنی ہوں گی۔ پہلی Adafruit MLX90614 لائبریری ہے، جو درجہ حرارت سینسر کے ساتھ کمیونیکیشن کو ہینڈل کرتی ہے۔ دوسری LiquidCrystal I2C لائبریری ہے، جو I2C بس پر LCD ڈسپلے کو کنٹرول کرنے کو آسان بناتی ہے۔ یہ لائبریریز Arduino لائبریری مینیجر کے ذریعے ان کے نام تلاش کرکے انسٹال کی جا سکتی ہیں۔

لائبریریز انسٹال کرنے کے بعد، آپ کو اپنے منسلک ڈیوائسز کے I2C ایڈریس معلوم کرنے ہوں گے۔ یہ ایک اہم مرحلہ ہے کیونکہ سینسر اور LCD دونوں کے اپنے منفرد ایڈریس ہوتے ہیں۔ فراہم کردہ کوڈ میں ایک خاص "I2C اسکینر" اسکیچ شامل ہے جسے آپ ان ایڈریسز کو تلاش کرنے کے لیے اپنے Arduino پر اپ لوڈ کر سکتے ہیں۔ جب آپ دونوں ڈیوائسز کو جوڑ کر اسکینر چلاتے ہیں، تو یہ سیریل مانیٹر پر دو ایڈریس پرنٹ کرے گا۔ ویڈیو میں، LCD 0x3F پر اور MLX90614 سینسر 0x5A پر پایا گیا (ویڈیو میں 06:28 پر)۔ آپ کے ڈیوائسز کے ایڈریس مختلف ہو سکتے ہیں، لہذا اسکینر چلانا اور ویلیوز نوٹ کرنا ضروری ہے۔

کوڈ کی وضاحت

کوڈ کو لچکدار بنانے کے لیے ڈیزائن کیا گیا ہے، جس سے آپ آسانی سے کسٹمائز کر سکتے ہیں کہ کون سے درجہ حرارت کی اکائیاں دکھائی جائیں اور معلومات LCD پر کیسے پیش کی جائیں۔ یہاں کوڈ کے اہم صارف-کنفیگر ایبل حصے ہیں (ویڈیو میں 04:31 پر):

LCD کنفیگریشن

کوڈ کے اوپری حصے میں، آپ کو اپنے مخصوص LCD ڈسپلے کی سیٹنگز ملیں گی۔ آپ کو ان ویلیوز کو اپنے ہارڈویئر سے مماثل کرنے کے لیے ایڈجسٹ کرنا ہوگا:

const uint8_t I2C_ADDRESS = 0x3f;  // آپ کے LCD کا I2C ایڈریس
const uint8_t LCD_CHAR = 16;       // فی لائن کریکٹرز کی تعداد (16 یا 20)
const uint8_t LCD_ROW = 2;         // ڈسپلے پر لائنوں کی تعداد (2 یا 4)

I2C_ADDRESS کو اس ایڈریس میں تبدیل کریں جو آپ نے I2C اسکینر سے پایا تھا۔ اگر آپ 20x4 LCD استعمال کر رہے ہیں، تو LCD_CHAR کو 20 اور LCD_ROW کو 4 سیٹ کریں۔

درجہ حرارت کی اکائیاں دکھانا

کوڈ مختلف درجہ حرارت کی ریڈنگز کی نمائندگی کے لیے حروف کا ایک ذہین نظام استعمال کرتا ہے۔ مرکزی فنکشن printTemp('X') ایک حرف آرگیومینٹ لیتا ہے تاکہ یہ طے کیا جا سکے کہ کیا دکھانا ہے۔ میپنگ درج ذیل ہے:

  • 'C' - آبجیکٹ کا درجہ حرارت سیلسیس میں
  • 'D' - محیطی درجہ حرارت سیلسیس میں
  • 'F' - آبجیکٹ کا درجہ حرارت فارن ہائیٹ میں
  • 'G' - محیطی درجہ حرارت فارن ہائیٹ میں
  • 'K' - آبجیکٹ کا درجہ حرارت کیلون میں
  • 'L' - محیطی درجہ حرارت کیلون میں

loop() فنکشن میں، آپ اپنی ضرورت کی لائنوں کو غیر تبصرہ کرکے منتخب کر سکتے ہیں کہ کون سی ریڈنگز دکھانی ہیں۔ مثال کے طور پر، آبجیکٹ اور محیطی درجہ حرارت دونوں کے لیے صرف سیلسیس ریڈنگز دکھانے کے لیے، آپ کا لوپ اس طرح نظر آئے گا:

void loop() {
  printTemp('C'); // آبجیکٹ کا درجہ حرارت سیلسیس میں
  delay(2000);
  printTemp('D'); // محیطی درجہ حرارت سیلسیس میں
  delay(2000);
}

اگر آپ فارن ہائیٹ اور سیلسیس دونوں دکھانا چاہتے ہیں، تو صرف اضافی لائنوں کو غیر تبصرہ کریں۔ ریڈنگز کے درمیان 2000 ملی سیکنڈ (2 سیکنڈ) کی تاخیر آپ کو ڈسپلے پڑھنے کا وقت دیتی ہے۔

ڈسپلے لیبلز کو حسب ضرورت بنانا

آپ LCD پر ظاہر ہونے والے متن کے لیبلز کو تبدیل کر سکتے ہیں۔ typeName[] صف میں آبجیکٹ اور محیطی درجہ حرارت کے لیبلز شامل ہیں:

char *typeName[]={"آبجیکٹ:","محیطی:"};

آپ ان سٹرنگز کو اپنی پسندیدہ زبان میں متن دکھانے کے لیے تبدیل کر سکتے ہیں، جب تک یہ لاطینی حروف استعمال کرتی ہیں (ویڈیو میں 05:08 پر)۔

مشروط اعمال شامل کرنا

کوڈ میں ایک مفید فنکشن getTemp('X') بھی شامل ہے جو درجہ حرارت کو فلوٹنگ پوائنٹ نمبر کے طور پر واپس کرتا ہے۔ یہ آپ کو درجہ حرارت کی حدوں کی بنیاد پر اعمال کرنے کی اجازت دیتا ہے۔ مثال کے طور پر، اگر درجہ حرارت کسی خاص قدر سے زیادہ ہو تو آپ ریلے یا بزر آن کر سکتے ہیں:

if( getTemp('C') > 40)
{
  // یہاں کچھ کریں، جیسے ریلے یا بزر آن کریں
}

یہ خاص طور پر الارم سسٹم یا درجہ حرارت کی تبدیلیوں کے خودکار ردعمل بنانے کے لیے مفید ہے۔

مظاہرہ

کوڈ اپ لوڈ ہونے اور وائرنگ درست ہونے کے بعد، LCD درجہ حرارت کی ریڈنگز دکھانا شروع کر دے گا۔ مظاہرے میں، سینسر کو مختلف اشیاء کی طرف اشارہ کیا گیا تاکہ یہ دکھایا جا سکے کہ یہ کیسے ردعمل دیتا ہے۔ جب کسی شخص کے ماتھے کی طرف اشارہ کیا گیا، تو سینسر نے جسم کا درجہ حرارت تقریباً 33-34°C ناپا (ویڈیو میں 09:39 پر)۔ جب کسی ٹھنڈی سطح کی طرف اشارہ کیا گیا، تو ریڈنگز آبجیکٹ کے لیے تقریباً 26°C اور محیطی درجہ حرارت کے لیے 28°C تک گر گئیں (ویڈیو میں 09:52 پر)۔

سینسر کافی مستحکم ہے اور مستقل ریڈنگز فراہم کرتا ہے۔ ویڈیو یہ بھی دکھاتی ہے کہ فارن ہائیٹ اور کیلون کی لائنوں کو تبصرہ کرکے صرف سیلسیس ریڈنگز دکھانے کے لیے کوڈ کو کیسے تبدیل کیا جائے۔ یہ لائنوں کو منتخب کرکے اور Arduino IDE کی تبصرہ فیچر (Ctrl+/ یا Cmd+/) استعمال کرکے کیا جاتا ہے، جو ہر لائن کے شروع میں ڈبل سلیش (//) شامل کرتا ہے۔

پہلے سے طے شدہ طور پر، کوڈ آبجیکٹ اور محیطی درجہ حرارت دونوں کے لیے سیلسیس میں ریڈنگز دکھاتا ہے۔ آپ loop() فنکشن میں مناسب لائنوں کو غیر تبصرہ کرکے آسانی سے فارن ہائیٹ یا کیلون پر سوئچ کر سکتے ہیں۔ LCD پھر ہر دو سیکنڈ میں آبجیکٹ اور محیطی ریڈنگز کے درمیان متبادل ہوگا۔

ابواب

  • [00:00] MLX90614 اور LCD پروجیکٹ کا تعارف
  • [01:20] ڈسپلے کے اختیارات: LCD2004 اور LCD1602
  • [02:29] وائرنگ کی وضاحت
  • [04:28] کوڈ کی وضاحت
  • [04:53] I2C پتے تلاش کرنا
  • [08:35] مظاہرہ
  • [10:47] اختتامی کلمات اور کریڈٹس

تصاویر

MLX90614_LCD_wiring
MLX90614_LCD_wiring
MLX90614-4
MLX90614-4
MLX90614-3
MLX90614-3
MLX90614-2
MLX90614-2
MLX90614-1-ESF
MLX90614-1-ESF
335-Using MLX90614 Infrared Temperature Sensor with LCD1602
زبان: C++
++
/*************************************************** 
  This is a library example for the MLX90614 Infrared Temperature Sensor with LCD1602 
Original Library and code source: https://github.com/adafruit/Adafruit-MLX90614-Library

This code has been mostly updated.
It displays the temperature on LCD1602 or LCD2004 in C, F, and K for object and for ambient.

 * 
 * Watch video instructions for this code:  https://youtu.be/_iO2L4P_irw
Updated/written by Ahmad Shamshiri on June 28, 2020 
 
 * in Ajax, Ontario, Canada. www.robojax.com

Introduction to MLX90614 Infrared Temperature Sensor: https://youtu.be/cFDSqiEIunw

 * Get this code and other Arduino codes from Robojax.com
Learn Arduino step by step in a structured course with all material, wiring diagrams, and libraries
all in one place. Purchase My course on Udemy.com http://robojax.com/L/?id=62

If you found this tutorial helpful, please support me so I can continue creating 
content like this. 

or make a donation using PayPal http://robojax.com/L/?id=64

 *  * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been downloaded from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.

Origin
  Written by Limor Fried/Ladyada for Adafruit Industries.  
  BSD license, all text above must be included in any redistribution
 ****************************************************/

#include <Wire.h>
#include <Adafruit_MLX90614.h>
char *typeName[]={"Object:","Ambient:"};

Adafruit_MLX90614 mlx = Adafruit_MLX90614();

#include <LiquidCrystal_I2C.h>
const uint8_t I2C_ADDRESS =0x3f;
const uint8_t LCD_CHAR= 16;
const uint8_t LCD_ROW= 2;
LiquidCrystal_I2C lcd(I2C_ADDRESS, LCD_CHAR,LCD_ROW);


void setup() {
  Serial.begin(9600);

  Serial.println("Robojax MLX90614 test");  

   if (!mlx.begin()) //Begin returns 0 on a good init
  {
      lcd.print("MLX90614 Failed");
      lcd.setCursor(0,1);
      lcd.print("check wiring!");      
    while (1)
      ;
  }  
  Wire.begin();
  lcd.begin();
  lcd.backlight();  
      lcd.print("Robojax MLX90614");
      lcd.setCursor(0,1);
      lcd.print("Infrared Temp.");          
      delay(2000);       
      clearCharacters(LCD_ROW-1,0, LCD_CHAR-1);
       
  
}//setup() end

void loop() {
  //Robojax Example for MLX90614 with LCD
  printTemp('C');//object temperature in C
  delay(2000);
  
  printTemp('D');//ambient temperature in C
  delay(2000);
//    
//  printTemp('F'); //object temperature in F
//  delay(2000);
//     
//  printTemp('G'); //ambient temperature in F
//  delay(2000);  
//  if( getTemp('C')>40)
//  {
//    //do something here
//  }
//  
//  printTemp('K'); //object temperature in K
//  delay(2000);    
//  printTemp('L');//ambient temperature in K  
//  delay(2000);  


  //Robojax Example for MLX90614
}

/*
 * @brief returns temperature or relative humidity
 * @param "type" is a character
 *     C = Object Celsius
 *     D = Ambient Celsius
 *     
 *     K = Object Kelvin
 *     L = Ambient Kelvin
 *     
 *     F = Object Fahrenheit
 *     G = Ambient Fahrenheit

 * @return returns one of the values above
 * Usage: to get Fahrenheit type: getTemp('F')
 * to print it on serial monitor Serial.println(getTemp('F'));
 * Written by Ahmad Shamshiri on March 30, 2020. 
 * in Ajax, Ontario, Canada
 * www.Robojax.com 
 */
float getTemp(char type)
{
   // Robojax.com MLX90614 Code
  float value;
    float tempObjec = mlx.readObjectTempC();//in C object
    float tempAmbient = mlx.readAmbientTempC();
   if(type =='F')
   {
    value = mlx.readObjectTempF(); //Fahrenheit Object
   }else if(type =='G')
   {
    value = mlx.readAmbientTempF();//Fahrenheit Ambient
   }else if(type =='K')
   {
    value = tempObjec + 273.15;// Object Kelvin
   }else if(type =='L')
   {
    value = tempAmbient + 273.15;//Ambient Kelvin
   }else if(type =='C')
   {
    value = tempObjec;
   }else if(type =='D')
   {
    value = tempAmbient;
   }
   return value;
    // Robojax.com MLX90614 Code
}//getTemp

/*
 * @brief nothing
 * @param "type" is a character
 *     C = Object Celsius
 *     D = Ambient Celsius
 *     
 *     K = Object Kelvin
 *     L = Ambient Kelvin
 *     
 *     F = Object Fahrenheit
 *     G = Ambient Fahrenheit

 * @return prints temperature value in serial monitor
 * Usage: to get Fahrenheit type: getTemp('F')
 * to print it on serial monitor Serial.println(getTemp('F'));
 * Written by Ahmad Shamshiri on March 30, 2020 at 21:51
 * in Ajax, Ontario, Canada
 * www.Robojax.com 
 */
void printTemp(char type)
{
 clearCharacters(1,0, LCD_CHAR-1 );  
  // Robojax.com MLX90614 Code
  float tmp =getTemp(type);
      lcd.setCursor(0,1);
      
  if(type =='C')
  {

      lcd.print(typeName[0]);  
      lcd.print(" ");
      lcd.print(tmp);        
      lcd.print((char)223);// 
      lcd.print("C");      
              

  }else if(type =='D')
  {
      lcd.print(typeName[1]); 
      lcd.print(" ");
      lcd.print(tmp);        
      lcd.print((char)223);// 
      lcd.print("C");        
  }else if(type =='F')
  {
      lcd.print(typeName[0]); 
      lcd.print(" ");
      lcd.print(tmp);        
      lcd.print((char)223);// 
      lcd.print("F");        
  }else if(type =='G')
  {
      lcd.print(typeName[1]);
      lcd.print(" ");
      lcd.print(tmp);        
      lcd.print((char)223);// 
      lcd.print("F");        
  }

  else if(type =='K')
  {
      lcd.print(typeName[0]); 
      lcd.print(" ");
      lcd.print(tmp);        
      lcd.print((char)223);// 
      lcd.print("K");        
  }  
  else if(type =='L')
  {
      lcd.print(typeName[1]);
      lcd.print(" ");
      lcd.print(tmp);        
      lcd.print((char)223);// 
      lcd.print("K");        

  }

// Robojax.com MLX90614 Code
}//printTemp(char type)


/*
   clearCharacters(uint8_t row,uint8_t start, uint8_t stop)
 * @brief clears a line of display (erases all characters)
 * @param none
 * @return does not return anything
 * Written by Ahmad Shamshiri
 * www.Robojax.com code May 28, 2020 at 16:21 in Ajax, Ontario, Canada
 */
void clearCharacters(uint8_t row,uint8_t start, uint8_t stop )
{
    for (int i=start; i<=stop; i++)
    {
    lcd.setCursor (i,row); //  
    lcd.write(254);
    } 

}//clearCharacters

آپ کو جن چیزوں کی ضرورت ہو سکتی ہے

وسائل اور حوالہ جات

فائلیں📁

دیگر فائلیں