Sử dụng Nhiệt kế hồng ngoại Melexis MLX90614 với Arduino LCD1602
Đo nhiệt độ mà không cần tiếp xúc vật lý là một khả năng thú vị, mở ra cánh cửa cho nhiều dự án thực tế và sáng tạo. Cảm biến nhiệt hồng ngoại Melexis MLX90614 giúp bạn thực hiện điều này bằng cách phát hiện bức xạ nhiệt phát ra từ vật thể, cho phép bạn đo nhiệt độ từ khoảng cách an toàn. Hướng dẫn này sẽ chỉ cho bạn cách kết nối cảm biến đa năng này với Arduino và hiển thị cả nhiệt độ vật thể lẫn nhiệt độ môi trường trên màn hình LCD I2C (màn hình ký tự 16x2 hoặc 20x4).


Dự án này hoàn hảo cho nhiều ứng dụng đa dạng, chẳng hạn như:
- Xây dựng trạm sàng lọc sốt không chạm cho lối vào phòng khám hoặc văn phòng.
- Giám sát nhiệt độ bàn máy in 3D hoặc đầu đùn mà không cản trở quá trình in.
- Tạo máy kiểm tra nhiệt độ thực phẩm an toàn, không tiếp xúc cho việc nấu ăn hoặc ủ bia.
- Phát triển bộ phát hiện sự hiện diện của con người đơn giản bằng cách đo dấu hiệu nhiệt cơ thể.
- Kiểm tra nhiệt độ của các bộ phận máy chuyển động hoặc tủ điện từ khoảng cách an toàn.
Cảm biến MLX90614 giao tiếp qua giao thức I2C, nghĩa là nó chỉ cần hai chân dữ liệu (SDA và SCL) cùng với nguồn và đất. Điều này giúp việc nối dây trở nên đơn giản và để lại nhiều chân trống cho các linh kiện khác. Đến cuối hướng dẫn này, bạn sẽ có một màn hình nhiệt độ hoạt động có thể hiển thị số đo theo độ C, độ F hoặc Kelvin, và bạn sẽ hiểu cách tùy chỉnh mã cho nhu cầu cụ thể của mình.
Phần cứng cần thiết
Để xây dựng dự án này, bạn sẽ cần các linh kiện sau:
- Bo mạch Arduino (Uno, Nano, Mega, v.v.)
- Mô-đun cảm biến nhiệt độ hồng ngoại MLX90614
- Màn hình LCD I2C (16x2 hoặc 20x4 ký tự)
- Dây jumper
- Breadboard (tùy chọn, để kết nối dễ dàng hơn)
Hướng dẫn nối dây
Việc nối dây cho dự án này rất đơn giản vì cả cảm biến MLX90614 và màn hình LCD đều sử dụng giao thức truyền thông I2C. Điều này có nghĩa là chúng có thể dùng chung hai đường dữ liệu (SDA và SCL), được kết nối song song. Cảm biến hoạt động ở mức logic 3.3V, nhưng nó có thể được cấp nguồn từ đầu ra 3.3V của Arduino. Tuy nhiên, mô-đun LCD thường yêu cầu 5V cho đèn nền và logic (trong video ở phút 03:15).
Dưới đây là chi tiết kết nối:
- 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)
Vì I2C là giao thức bus, bạn có thể kết nối tối đa 128 thiết bị trên cùng hai đường dây (trong video ở phút 03:44). Nếu bạn sử dụng Arduino Uno hoặc Nano, các chân SDA và SCL nằm lần lượt tại A4 và A5. Đối với các bo mạch khác như Mega, các chân này nằm ở vị trí khác (20 và 21), vì vậy hãy kiểm tra sơ đồ chân của bo mạch bạn.

Thiết lập các thư viện
Trước khi tải mã lên, bạn cần cài đặt hai thư viện thiết yếu. Thư viện đầu tiên là Adafruit MLX90614, xử lý giao tiếp với cảm biến nhiệt độ. Thư viện thứ hai là LiquidCrystal I2C, giúp đơn giản hóa việc điều khiển màn hình LCD qua bus I2C. Các thư viện này có thể được cài đặt thông qua Trình quản lý thư viện Arduino bằng cách tìm kiếm tên của chúng.
Sau khi cài đặt các thư viện, bạn phải xác định địa chỉ I2C của các thiết bị được kết nối. Đây là bước quan trọng vì cả cảm biến và màn hình LCD đều có địa chỉ riêng. Mã được cung cấp bao gồm một bản phác thảo "I2C Scanner" đặc biệt mà bạn có thể tải lên Arduino để tìm các địa chỉ này. Khi bạn chạy trình quét với cả hai thiết bị được kết nối, nó sẽ in hai địa chỉ ra Serial Monitor. Trong video, màn hình LCD được tìm thấy tại 0x3F và cảm biến MLX90614 tại 0x5A (trong video ở phút 06:28). Thiết bị của bạn có thể có địa chỉ khác, vì vậy điều cần thiết là chạy trình quét và ghi lại các giá trị.
Giải thích mã
Mã được thiết kế linh hoạt, cho phép bạn dễ dàng tùy chỉnh đơn vị nhiệt độ được hiển thị và cách trình bày thông tin trên màn hình LCD. Dưới đây là các phần chính có thể tùy chỉnh của mã (trong video ở phút 04:31):
Cấu hình LCD
Ở đầu mã, bạn sẽ tìm thấy các cài đặt cho màn hình LCD cụ thể của mình. Bạn cần điều chỉnh các giá trị này cho phù hợp với phần cứng:
const uint8_t I2C_ADDRESS = 0x3f; // Địa chỉ I2C của màn hình LCD
const uint8_t LCD_CHAR = 16; // Số ký tự trên mỗi dòng (16 hoặc 20)
const uint8_t LCD_ROW = 2; // Số dòng trên màn hình (2 hoặc 4)
Thay đổi I2C_ADDRESS thành địa chỉ bạn tìm thấy bằng trình quét I2C. Nếu bạn sử dụng LCD 20x4, hãy đặt LCD_CHAR thành 20 và LCD_ROW thành 4.
Hiển thị đơn vị nhiệt độ
Mã sử dụng một hệ thống chữ cái thông minh để biểu thị các số đo nhiệt độ khác nhau. Hàm chính printTemp('X') nhận một đối số ký tự duy nhất để xác định nội dung hiển thị. Ánh xạ như sau:
'C'- Nhiệt độ vật thể theo độ C'D'- Nhiệt độ môi trường theo độ C'F'- Nhiệt độ vật thể theo độ F'G'- Nhiệt độ môi trường theo độ F'K'- Nhiệt độ vật thể theo Kelvin'L'- Nhiệt độ môi trường theo Kelvin
Trong hàm loop(), bạn có thể chọn các chỉ số muốn hiển thị bằng cách bỏ ghi chú các dòng bạn cần. Ví dụ, để chỉ hiển thị chỉ số Celsius cho cả nhiệt độ vật thể và nhiệt độ môi trường, vòng lặp của bạn sẽ trông như thế này:
void loop() {
printTemp('C'); // nhiệt độ vật thể tính bằng C
delay(2000);
printTemp('D'); // nhiệt độ môi trường tính bằng C
delay(2000);
}
Nếu bạn muốn hiển thị cả Fahrenheit và Celsius, chỉ cần bỏ ghi chú các dòng bổ sung. Độ trễ 2000 mili giây (2 giây) giữa các lần đọc giúp bạn có thời gian để đọc màn hình.
Tùy chỉnh nhãn hiển thị
Bạn có thể thay đổi các nhãn văn bản xuất hiện trên LCD. Mảng typeName[] chứa các nhãn cho nhiệt độ vật thể và nhiệt độ môi trường:
char *typeName[]={"Vật thể:","Môi trường:"};
Bạn có thể sửa đổi các chuỗi này để hiển thị văn bản bằng ngôn ngữ bạn mong muốn, miễn là nó sử dụng ký tự Latin (trong video tại 05:08).
Thêm hành động có điều kiện
Mã cũng bao gồm một hàm hữu ích getTemp('X') trả về nhiệt độ dưới dạng số dấu phẩy động. Điều này cho phép bạn thực hiện các hành động dựa trên ngưỡng nhiệt độ. Ví dụ, bạn có thể bật rơ-le hoặc còi nếu nhiệt độ vượt quá một giá trị nhất định:
if( getTemp('C') > 40)
{
// làm gì đó ở đây, như bật rơ-le hoặc còi
}
Điều này đặc biệt hữu ích để tạo hệ thống báo động hoặc phản hồi tự động đối với sự thay đổi nhiệt độ.
Trình diễn
Sau khi mã được tải lên và dây nối chính xác, LCD sẽ bắt đầu hiển thị các chỉ số nhiệt độ. Trong phần trình diễn, cảm biến được hướng vào các vật thể khác nhau để cho thấy cách nó phản hồi. Khi hướng vào trán một người, cảm biến đo nhiệt độ cơ thể khoảng 33-34°C (trong video tại 09:39). Khi hướng vào một bề mặt mát hơn, các chỉ số giảm xuống khoảng 26°C cho vật thể và 28°C cho nhiệt độ môi trường (trong video tại 09:52).
Cảm biến khá ổn định và cung cấp các chỉ số nhất quán. Video cũng trình diễn cách sửa đổi mã để chỉ hiển thị chỉ số Celsius bằng cách ghi chú các dòng cho Fahrenheit và Kelvin. Việc này được thực hiện bằng cách chọn các dòng và sử dụng tính năng ghi chú của Arduino IDE (Ctrl+/ hoặc Cmd+/), thêm dấu gạch chéo kép (//) vào đầu mỗi dòng.
Theo mặc định, mã hiển thị chỉ số Celsius cho cả nhiệt độ vật thể và nhiệt độ môi trường. Bạn có thể dễ dàng chuyển sang Fahrenheit hoặc Kelvin bằng cách bỏ ghi chú các dòng thích hợp trong hàm loop(). LCD sau đó sẽ xen kẽ giữa các chỉ số vật thể và môi trường mỗi hai giây.
Các chương
- [00:00] Giới thiệu về dự án MLX90614 với LCD
- [01:20] Tùy chọn hiển thị: LCD2004 và LCD1602
- [02:29] Giải thích cách nối dây
- [04:28] Giải thích mã
- [04:53] Tìm địa chỉ I2C
- [08:35] Trình diễn
- [10:47] Lời kết và ghi công
++
/***************************************************
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
Nghĩ bạn có thể cần
-
Amazon
-
AmazonMLX90614 Non-Contact sensor on Amazon Canadalink.amazon
-
eBay
-
AliExpressMLX90614 Non-Contact sensor on AliExpresss.click.aliexpress.com
Tài nguyên & tài liệu tham khảo
Tập tin📁
Các tập tin khác
-
Adafruit MLX90614 library (from Robojax)
robojax_MLX90614-_Adafruit_Library-master.zip -
Melexis MLX90614 datasheet (PDF)
robojax_MLX90614_Datasheet-Melexis.pdf