การใช้เครื่องวัดอุณหภูมิอินฟราเรด Melexis MLX90614 ร่วมกับ Arduino LCD1602
การวัดอุณหภูมิโดยไม่ต้องสัมผัสทางกายภาพเป็นความสามารถที่น่าทึ่งซึ่งเปิดประตูสู่โครงการที่ใช้งานได้จริงและสร้างสรรค์มากมาย เซนเซอร์อินฟราเรดเทอร์โมมิเตอร์ MLX90614 ของ Melexis ทำให้สิ่งนี้เป็นไปได้โดยการตรวจจับรังสีความร้อนที่ปล่อยออกมาจากวัตถุ ช่วยให้คุณวัดอุณหภูมิจากระยะที่ปลอดภัย คู่มือนี้จะแสดงวิธีเชื่อมต่อเซนเซอร์อเนกประสงค์นี้กับ Arduino และแสดงทั้งอุณหภูมิวัตถุและอุณหภูมิแวดล้อมบนจอ LCD แบบ I2C (จอแสดงผลแบบอักขระ 16x2 หรือ 20x4)


โครงการนี้เหมาะอย่างยิ่งสำหรับการใช้งานที่หลากหลาย เช่น:
- สร้างจุดคัดกรองไข้แบบไม่สัมผัสสำหรับคลินิกหรือทางเข้าออฟฟิศ
- ตรวจสอบอุณหภูมิของแท่นพิมพ์ 3 มิติหรือหัวร้อนโดยไม่รบกวนการพิมพ์
- สร้างเครื่องตรวจวัดอุณหภูมิอาหารแบบไม่สัมผัสที่ปลอดภัยสำหรับการปรุงอาหารหรือการหมัก
- พัฒนาเครื่องตรวจจับการมีอยู่ของมนุษย์อย่างง่ายโดยการวัดลายเซ็นความร้อนของร่างกาย
- ตรวจสอบอุณหภูมิของชิ้นส่วนเครื่องจักรที่เคลื่อนที่หรือแผงไฟฟ้าจากระยะที่ปลอดภัย
เซนเซอร์ MLX90614 สื่อสารผ่านโปรโตคอล I2C ซึ่งหมายความว่าต้องใช้พินข้อมูลเพียงสองพิน (SDA และ SCL) บวกกับไฟเลี้ยงและกราวด์ ทำให้การเดินสายไฟตรงไปตรงมาและเหลือพินว่างมากมายสำหรับส่วนประกอบอื่น ๆ เมื่อสิ้นสุดบทช่วยสอนนี้ คุณจะมีจอแสดงอุณหภูมิที่ใช้งานได้ซึ่งสามารถแสดงค่าที่อ่านได้ในหน่วยเซลเซียส ฟาเรนไฮต์ หรือเคลวิน และคุณจะเข้าใจวิธีปรับแต่งโค้ดให้ตรงกับความต้องการเฉพาะของคุณ
ฮาร์ดแวร์ที่ต้องใช้
ในการสร้างโครงการนี้ คุณจะต้องมีส่วนประกอบต่อไปนี้:
- บอร์ด Arduino (Uno, Nano, Mega ฯลฯ)
- โมดูลเซนเซอร์วัดอุณหภูมิอินฟราเรด MLX90614
- จอ LCD แบบ I2C (อักขระ 16x2 หรือ 20x4)
- สายจัมเปอร์
- เบรดบอร์ด (ไม่จำเป็น สำหรับการเชื่อมต่อที่ง่ายขึ้น)
คู่มือการเดินสายไฟ
การเดินสายไฟสำหรับโครงการนี้ง่ายเพราะทั้งเซนเซอร์ MLX90614 และจอ LCD ใช้โปรโตคอลการสื่อสาร I2C ซึ่งหมายความว่าสามารถใช้สายข้อมูลสองเส้นเดียวกัน (SDA และ SCL) ร่วมกันได้ โดยเชื่อมต่อแบบขนาน เซนเซอร์ทำงานที่ลอจิก 3.3V แต่สามารถจ่ายไฟจากเอาต์พุต 3.3V ของ Arduino ได้ อย่างไรก็ตาม โมดูล 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) ดังนั้นโปรดตรวจสอบผังพินของบอร์ดของคุณ

การติดตั้งไลบรารี
ก่อนอัปโหลดโค้ด คุณต้องติดตั้งไลบรารีที่จำเป็นสองตัว ไลบรารีแรกคือ Adafruit MLX90614 ซึ่งจัดการการสื่อสารกับเซนเซอร์วัดอุณหภูมิ ไลบรารีที่สองคือ LiquidCrystal I2C ซึ่งทำให้การควบคุมจอ LCD ผ่านบัส I2C ง่ายขึ้น ไลบรารีเหล่านี้สามารถติดตั้งได้ผ่าน Arduino Library Manager โดยค้นหาชื่อของไลบรารี
หลังจากติดตั้งไลบรารีแล้ว คุณต้องระบุที่อยู่ I2C ของอุปกรณ์ที่เชื่อมต่อของคุณ นี่เป็นขั้นตอนสำคัญเพราะทั้งเซนเซอร์และจอ LCD มีที่อยู่เฉพาะของตัวเอง โค้ดที่ให้มาประกอบด้วยสเก็ตช์ "I2C Scanner" พิเศษที่คุณสามารถอัปโหลดไปยัง Arduino เพื่อค้นหาที่อยู่เหล่านี้ เมื่อคุณรันสแกนเนอร์โดยเชื่อมต่ออุปกรณ์ทั้งสองไว้ มันจะพิมพ์ที่อยู่สองที่อยู่ไปยัง Serial Monitor ในวิดีโอ พบจอ LCD ที่ 0x3F และเซนเซอร์ MLX90614 ที่ 0x5A (ในวิดีโอที่ 06:28) อุปกรณ์ของคุณอาจมีที่อยู่ที่แตกต่างกัน ดังนั้นจึงจำเป็นต้องรันสแกนเนอร์และจดค่าต่าง ๆ
คำอธิบายโค้ด
โค้ดถูกออกแบบมาให้มีความยืดหยุ่น ช่วยให้คุณปรับแต่งได้ง่ายว่าต้องการแสดงหน่วยอุณหภูมิใดและนำเสนอข้อมูลบนจอ LCD อย่างไร นี่คือส่วนสำคัญของโค้ดที่ผู้ใช้สามารถกำหนดค่าได้ (ในวิดีโอที่ 04:31):
การกำหนดค่าจอ LCD
ที่ด้านบนของโค้ด คุณจะพบการตั้งค่าสำหรับจอ LCD เฉพาะของคุณ คุณต้องปรับค่าเหล่านี้ให้ตรงกับฮาร์ดแวร์ของคุณ:
const uint8_t I2C_ADDRESS = 0x3f; // ที่อยู่ I2C ของจอ LCD ของคุณ
const uint8_t LCD_CHAR = 16; // จำนวนอักขระต่อบรรทัด (16 หรือ 20)
const uint8_t LCD_ROW = 2; // จำนวนบรรทัดบนจอแสดงผล (2 หรือ 4)
เปลี่ยน I2C_ADDRESS เป็นที่อยู่ที่คุณพบโดยใช้ I2C scanner หากคุณใช้จอ LCD 20x4 ให้ตั้งค่า LCD_CHAR เป็น 20 และ LCD_ROW เป็น 4
การแสดงหน่วยอุณหภูมิ
โค้ดใช้ระบบตัวอักษรที่ชาญฉลาดเพื่อแสดงค่าอุณหภูมิที่แตกต่างกัน ฟังก์ชันหลัก printTemp('X') รับอาร์กิวเมนต์อักขระตัวเดียวเพื่อกำหนดสิ่งที่จะแสดง การแมปมีดังนี้:
'C'- อุณหภูมิวัตถุในหน่วยเซลเซียส'D'- อุณหภูมิแวดล้อมในหน่วยเซลเซียส'F'- อุณหภูมิวัตถุในหน่วยฟาเรนไฮต์'G'- อุณหภูมิแวดล้อมในหน่วยฟาเรนไฮต์'K'- อุณหภูมิวัตถุในหน่วยเคลวิน'L'- อุณหภูมิแวดล้อมในหน่วยเคลวิน
ในฟังก์ชัน loop() คุณสามารถเลือกได้ว่าจะแสดงค่าที่อ่านได้ใดบ้างโดยการเอาเครื่องหมายคอมเมนต์ออกจากบรรทัดที่ต้องการ ตัวอย่างเช่น หากต้องการแสดงเฉพาะค่าองศาเซลเซียสสำหรับทั้งอุณหภูมิวัตถุและอุณหภูมิแวดล้อม ลูปของคุณจะมีลักษณะดังนี้:
void loop() {
printTemp('C'); // อุณหภูมิวัตถุในหน่วย C
delay(2000);
printTemp('D'); // อุณหภูมิแวดล้อมในหน่วย C
delay(2000);
}
หากคุณต้องการแสดงทั้งฟาเรนไฮต์และเซลเซียส เพียงแค่เอาเครื่องหมายคอมเมนต์ออกจากบรรทัดเพิ่มเติม ระยะหน่วง 2000 มิลลิวินาที (2 วินาที) ระหว่างการอ่านค่าแต่ละครั้งให้เวลาคุณในการอ่านจอแสดงผล
การปรับแต่งป้ายกำกับที่แสดง
คุณสามารถเปลี่ยนข้อความป้ายกำกับที่ปรากฏบนจอ LCD ได้ อาร์เรย์ typeName[] ประกอบด้วยป้ายกำกับสำหรับอุณหภูมิวัตถุและอุณหภูมิแวดล้อม:
char *typeName[]={"Object:","Ambient:"};
คุณสามารถแก้ไขสตริงเหล่านี้เพื่อแสดงข้อความในภาษาที่คุณต้องการได้ ตราบใดที่ใช้ตัวอักษรละติน (ในวิดีโอที่ 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] คำกล่าวปิดท้ายและเครดิต
++
/***************************************************
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
สิ่งที่คุณอาจต้องการ
-
อเมซอน
-
อเมซอนMLX90614 Non-Contact sensor on Amazon Canadalink.amazon
-
อีเบย์
-
อาลีเอ็กซ์เพรสMLX90614 Non-Contact sensor on AliExpresss.click.aliexpress.com
แหล่งข้อมูลและเอกสารอ้างอิง
ไฟล์📁
ไฟล์อื่น ๆ
-
Adafruit MLX90614 library (from Robojax)
robojax_MLX90614-_Adafruit_Library-master.zip -
Melexis MLX90614 datasheet (PDF)
robojax_MLX90614_Datasheet-Melexis.pdf