Search Code

આર્ડુઇનો LCD1602 સાથે Melexis MLX90614 ઇન્ફ્રારેડ થર્મોમીટરનો ઉપયોગ કરીને

આર્ડુઇનો LCD1602 સાથે Melexis MLX90614 ઇન્ફ્રારેડ થર્મોમીટરનો ઉપયોગ કરીને

< પ્રત્યક્ષ શારીરિક સંપર્ક વિના તાપમાન માપવું એ એક આકર્ષક ક્ષમતા છે જે ઘણા વ્યવહારુ અને સર્જનાત્મક પ્રોજેક્ટ્સ માટે દ્વાર ખોલે છે. 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 સ્કેનરનો ઉપયોગ કરીને તમને મળેલા સરનામામાં I2C_ADDRESS બદલો. જો તમે 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] સમાપન ટિપ્પણીઓ અને ક્રેડિટ્સ

Images

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
Language: 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

Resources & references

Files📁

Other files