Search Code

Menggunakan Termometer Inframerah Melexis MLX90614 dengan Arduino LCD1602

Menggunakan Termometer Inframerah Melexis MLX90614 dengan Arduino LCD1602

Mengukur suhu tanpa kontak fisik adalah kemampuan menarik yang membuka pintu bagi banyak proyek praktis dan kreatif. Termometer inframerah Melexis MLX90614 memungkinkan hal ini dengan mendeteksi radiasi termal yang dipancarkan objek, sehingga Anda dapat mengukur suhu dari jarak aman. Panduan ini akan menunjukkan cara menghubungkan sensor serbaguna ini ke Arduino dan menampilkan suhu objek serta suhu sekitar pada layar LCD I2C (baik layar karakter 16x2 atau 20x4).

Proyek ini sangat cocok untuk berbagai aplikasi, seperti:

  • Membangun stasiun pemeriksaan demam tanpa sentuhan untuk pintu masuk klinik atau kantor.
  • Memantau suhu alas printer 3D atau hot-end tanpa mengganggu proses pencetakan.
  • Membuat pemeriksa suhu makanan tanpa kontak yang aman untuk memasak atau menyeduh.
  • Mengembangkan detektor kehadiran manusia sederhana dengan mengukur tanda panas tubuh.
  • Memeriksa suhu bagian mesin yang bergerak atau panel listrik dari jarak aman.

Sensor MLX90614 berkomunikasi melalui protokol I2C, yang berarti hanya memerlukan dua pin data (SDA dan SCL) ditambah daya dan ground. Ini membuat pengkabelan menjadi sederhana dan menyisakan banyak pin untuk komponen lain. Di akhir tutorial ini, Anda akan memiliki tampilan suhu yang berfungsi dan dapat menampilkan pembacaan dalam Celsius, Fahrenheit, atau Kelvin, serta memahami cara menyesuaikan kode untuk kebutuhan spesifik Anda.

Perangkat Keras yang Dibutuhkan

Untuk membangun proyek ini, Anda memerlukan komponen berikut:

  • Papan Arduino (Uno, Nano, Mega, dll.)
  • Modul sensor suhu inframerah MLX90614
  • Layar LCD I2C (16x2 atau 20x4 karakter)
  • Kabel jumper
  • Breadboard (opsional, untuk koneksi yang lebih mudah)

Panduan Pengkabelan

Pengkabelan untuk proyek ini sederhana karena baik sensor MLX90614 maupun layar LCD menggunakan protokol komunikasi I2C. Ini berarti keduanya dapat berbagi dua jalur data yang sama (SDA dan SCL), yang dihubungkan secara paralel. Sensor beroperasi pada logika 3.3V, tetapi dapat diberi daya dari output 3.3V Arduino. Modul LCD, bagaimanapun, biasanya memerlukan 5V untuk lampu latar dan logikanya (di video pada 03:15).

Berikut rincian koneksinya:

  • 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)

Karena I2C adalah protokol bus, Anda dapat menghubungkan hingga 128 perangkat pada dua jalur yang sama (di video pada 03:44). Jika Anda menggunakan Arduino Uno atau Nano, pin SDA dan SCL terletak di A4 dan A5 masing-masing. Untuk papan lain seperti Mega, pin-pin ini berada di lokasi berbeda (20 dan 21), jadi pastikan untuk memeriksa pinout papan Anda.

MLX90614_LCD_wiring

Menyiapkan Library

Sebelum mengunggah kode, Anda perlu menginstal dua library penting. Yang pertama adalah library Adafruit MLX90614, yang menangani komunikasi dengan sensor suhu. Yang kedua adalah library LiquidCrystal I2C, yang menyederhanakan kontrol layar LCD melalui bus I2C. Library ini dapat diinstal melalui Library Manager Arduino dengan mencari namanya.

Setelah menginstal library, Anda harus menentukan alamat I2C dari perangkat yang terhubung. Ini adalah langkah penting karena baik sensor maupun LCD memiliki alamat unik masing-masing. Kode yang disediakan mencakup sketsa "I2C Scanner" khusus yang dapat Anda unggah ke Arduino untuk menemukan alamat-alamat ini. Saat Anda menjalankan pemindai dengan kedua perangkat terhubung, ia akan mencetak dua alamat ke Serial Monitor. Dalam video, LCD ditemukan di 0x3F dan sensor MLX90614 di 0x5A (di video pada 06:28). Perangkat Anda mungkin memiliki alamat yang berbeda, jadi sangat penting untuk menjalankan pemindai dan mencatat nilainya.

Penjelasan Kode

Kode ini dirancang agar fleksibel, memungkinkan Anda dengan mudah menyesuaikan unit suhu yang ditampilkan dan bagaimana informasi disajikan di LCD. Berikut adalah bagian-bagian kode yang dapat dikonfigurasi oleh pengguna (di video pada 04:31):

Konfigurasi LCD

Di bagian atas kode, Anda akan menemukan pengaturan untuk layar LCD spesifik Anda. Anda perlu menyesuaikan nilai-nilai ini agar sesuai dengan perangkat keras Anda:

const uint8_t I2C_ADDRESS = 0x3f;  // Alamat I2C dari LCD Anda
const uint8_t LCD_CHAR = 16;       // Jumlah karakter per baris (16 atau 20)
const uint8_t LCD_ROW = 2;         // Jumlah baris pada layar (2 atau 4)

Ubah I2C_ADDRESS ke alamat yang Anda temukan menggunakan pemindai I2C. Jika Anda menggunakan LCD 20x4, atur LCD_CHAR menjadi 20 dan LCD_ROW menjadi 4.

Menampilkan Unit Suhu

Kode ini menggunakan sistem huruf yang cerdas untuk mewakili berbagai pembacaan suhu. Fungsi utama printTemp('X') mengambil satu argumen karakter untuk menentukan apa yang akan ditampilkan. Pemetaannya adalah sebagai berikut:

  • 'C' - Suhu objek dalam Celsius
  • 'D' - Suhu sekitar dalam Celsius
  • 'F' - Suhu objek dalam Fahrenheit
  • 'G' - Suhu sekitar dalam Fahrenheit
  • 'K' - Suhu objek dalam Kelvin
  • 'L' - Suhu sekitar dalam Kelvin

Dalam fungsi loop(), Anda dapat memilih pembacaan mana yang akan ditampilkan dengan menghapus tanda komentar pada baris yang Anda perlukan. Misalnya, untuk hanya menampilkan pembacaan Celsius untuk suhu objek dan lingkungan, loop Anda akan terlihat seperti ini:

void loop() {
  printTemp('C'); // suhu objek dalam C
  delay(2000);
  printTemp('D'); // suhu lingkungan dalam C
  delay(2000);
}

Jika Anda ingin menampilkan Fahrenheit dan Celsius, cukup hapus tanda komentar pada baris tambahan. Penundaan 2000 milidetik (2 detik) antara pembacaan memberi Anda waktu untuk membaca tampilan.

Menyesuaikan Label Tampilan

Anda dapat mengubah label teks yang muncul di LCD. Array typeName[] berisi label untuk suhu objek dan lingkungan:

char *typeName[]={"Objek:","Lingkungan:"};

Anda dapat memodifikasi string ini untuk menampilkan teks dalam bahasa yang Anda inginkan, selama menggunakan karakter Latin (di video pada 05:08).

Menambahkan Tindakan Bersyarat

Kode ini juga menyertakan fungsi yang berguna getTemp('X') yang mengembalikan suhu sebagai angka floating-point. Ini memungkinkan Anda melakukan tindakan berdasarkan ambang suhu. Misalnya, Anda dapat menyalakan relay atau buzzer jika suhu melebihi nilai tertentu:

if( getTemp('C') > 40)
{
  // lakukan sesuatu di sini, seperti menyalakan relay atau buzzer
}

Ini sangat berguna untuk membuat sistem alarm atau respons otomatis terhadap perubahan suhu.

Demonstrasi

Setelah kode diunggah dan kabel terpasang dengan benar, LCD akan mulai menampilkan pembacaan suhu. Dalam demonstrasi, sensor diarahkan ke berbagai objek untuk menunjukkan bagaimana ia merespons. Saat diarahkan ke dahi seseorang, sensor mengukur suhu tubuh sekitar 33-34°C (di video pada 09:39). Saat diarahkan ke permukaan yang lebih dingin, pembacaan turun menjadi sekitar 26°C untuk objek dan 28°C untuk suhu lingkungan (di video pada 09:52).

Sensor ini cukup stabil dan memberikan pembacaan yang konsisten. Video juga menunjukkan cara memodifikasi kode untuk hanya menampilkan pembacaan Celsius dengan memberi komentar pada baris untuk Fahrenheit dan Kelvin. Ini dilakukan dengan memilih baris dan menggunakan fitur komentar Arduino IDE (Ctrl+/ atau Cmd+/), yang menambahkan garis miring ganda (//) di awal setiap baris.

Secara default, kode menampilkan pembacaan dalam Celsius untuk suhu objek dan lingkungan. Anda dapat dengan mudah beralih ke Fahrenheit atau Kelvin dengan menghapus tanda komentar pada baris yang sesuai dalam fungsi loop(). LCD kemudian akan bergantian antara pembacaan objek dan lingkungan setiap dua detik.

Bab

  • [00:00] Pengenalan proyek MLX90614 dengan LCD
  • [01:20] Opsi tampilan: LCD2004 dan LCD1602
  • [02:29] Penjelasan Kabel
  • [04:28] Penjelasan kode
  • [04:53] Menemukan alamat I2C
  • [08:35] Demonstrasi
  • [10:47] Penutup dan kredit

Gambar

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

Hal-hal yang mungkin Anda butuhkan

Sumber daya & referensi

Berkas📁

File lainnya