Použitie Melexis MLX90614 infračerveného teplomera s Arduino LCD1602
Meranie teploty bez fyzického kontaktu je fascinujúca schopnosť, ktorá otvára dvere mnohým praktickým a kreatívnym projektom. Melexis MLX90614 infračervený teplomer to umožňuje detekciou tepelného žiarenia emitovaného objektmi, čo vám umožňuje merať teplotu z bezpečnej vzdialenosti. Táto príručka vám ukáže, ako pripojiť tento všestranný senzor k Arduinu a zobraziť teplotu objektu aj okolia na I2C LCD obrazovke (buď 16x2 alebo 20x4 znakový displej).


Tento projekt je ideálny pre širokú škálu aplikácií, ako napríklad:
- Vybudovanie bezkontaktnej stanice na meranie horúčky pre vstup do kliniky alebo kancelárie.
- Monitorovanie teploty podložky alebo horúceho konca 3D tlačiarne bez zasahovania do tlače.
- Vytvorenie bezpečnej bezkontaktnej kontroly teploty jedla pre varenie alebo varenie piva.
- Vyvinutie jednoduchého detektora prítomnosti osôb meraním tepelných signatúr tela.
- Kontrola teploty pohyblivých častí strojov alebo elektrických panelov z bezpečnej vzdialenosti.
Senzor MLX90614 komunikuje cez protokol I2C, čo znamená, že vyžaduje iba dva dátové piny (SDA a SCL) plus napájanie a uzemnenie. To zjednodušuje zapojenie a ponecháva dostatok pinov voľných pre ďalšie komponenty. Na konci tohto tutoriálu budete mať funkčný teplotný displej, ktorý môže zobrazovať hodnoty v stupňoch Celzia, Fahrenheita alebo Kelvina, a budete rozumieť, ako prispôsobiť kód vašim konkrétnym potrebám.
Potrebný hardvér
Na zostavenie tohto projektu budete potrebovať nasledujúce komponenty:
- Doska Arduino (Uno, Nano, Mega atď.)
- Modul infračerveného teplotného senzora MLX90614
- I2C LCD displej (16x2 alebo 20x4 znakov)
- Prepojovacie vodiče
- Nepájivé pole (voliteľné, pre jednoduchšie pripojenia)
Sprievodca zapojením
Zapojenie pre tento projekt je jednoduché, pretože senzor MLX90614 aj LCD displej používajú komunikačný protokol I2C. To znamená, že môžu zdieľať rovnaké dva dátové vodiče (SDA a SCL), ktoré sú zapojené paralelne. Senzor pracuje s logikou 3,3V, ale môže byť napájaný z 3,3V výstupu Arduina. LCD modul však zvyčajne vyžaduje 5V pre podsvietenie a logiku (vo videu o 03:15).
Tu je rozpis pripojení:
- 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)
Keďže I2C je zbernicový protokol, môžete pripojiť až 128 zariadení na rovnaké dva vodiče (vo videu o 03:44). Ak používate Arduino Uno alebo Nano, piny SDA a SCL sa nachádzajú na A4 a A5. Pre iné dosky, ako je Mega, sú tieto piny na rôznych miestach (20 a 21), takže si určite skontrolujte pinout vašej dosky.

Nastavenie knižníc
Pred nahratím kódu musíte nainštalovať dve základné knižnice. Prvá je knižnica Adafruit MLX90614, ktorá spracováva komunikáciu s teplotným senzorom. Druhá je knižnica LiquidCrystal I2C, ktorá zjednodušuje ovládanie LCD displeja cez zbernicu I2C. Tieto knižnice je možné nainštalovať cez Správcu knižníc Arduino vyhľadaním ich názvov.
Po nainštalovaní knižníc musíte určiť I2C adresy vašich pripojených zariadení. Toto je kritický krok, pretože senzor aj LCD majú svoje vlastné jedinečné adresy. Poskytnutý kód obsahuje špeciálny náčrt "I2C Scanner", ktorý môžete nahrať do Arduina na nájdenie týchto adries. Keď spustíte skener s oboma pripojenými zariadeniami, vytlačí dve adresy do sériového monitora. Vo videu bola LCD adresa nájdená na 0x3F a senzor MLX90614 na 0x5A (vo videu o 06:28). Vaše zariadenia môžu mať rôzne adresy, preto je nevyhnutné spustiť skener a zaznamenať hodnoty.
Vysvetlenie kódu
Kód je navrhnutý tak, aby bol flexibilný, čo vám umožňuje ľahko prispôsobiť, ktoré teplotné jednotky sa zobrazujú a ako sú informácie prezentované na LCD. Tu sú kľúčové časti kódu, ktoré môžete konfigurovať (vo videu o 04:31):
Konfigurácia LCD
Na začiatku kódu nájdete nastavenia pre váš konkrétny LCD displej. Tieto hodnoty musíte upraviť tak, aby zodpovedali vášmu hardvéru:
const uint8_t I2C_ADDRESS = 0x3f; // I2C adresa vášho LCD
const uint8_t LCD_CHAR = 16; // Počet znakov na riadok (16 alebo 20)
const uint8_t LCD_ROW = 2; // Počet riadkov na displeji (2 alebo 4)
Zmeňte I2C_ADDRESS na adresu, ktorú ste našli pomocou I2C skenera. Ak používate 20x4 LCD, nastavte LCD_CHAR na 20 a LCD_ROW na 4.
Zobrazenie teplotných jednotiek
Kód používa dômyselný systém písmen na reprezentáciu rôznych teplotných hodnôt. Hlavná funkcia printTemp('X') prijíma jeden znakový argument na určenie, čo sa má zobraziť. Mapovanie je nasledovné:
'C'- Teplota objektu v stupňoch Celzia'D'- Teplota okolia v stupňoch Celzia'F'- Teplota objektu v stupňoch Fahrenheita'G'- Teplota okolia v stupňoch Fahrenheita'K'- Teplota objektu v Kelvinoch'L'- Teplota okolia v Kelvinoch
Vo funkcii loop() si môžete vybrať, ktoré hodnoty sa majú zobrazovať, odkomentovaním riadkov, ktoré potrebujete. Napríklad, ak chcete zobraziť iba hodnoty v stupňoch Celzia pre teplotu objektu aj okolia, váš loop() by vyzeral takto:
void loop() {
printTemp('C'); // teplota objektu v °C
delay(2000);
printTemp('D'); // teplota okolia v °C
delay(2000);
}
Ak chcete zobraziť stupne Fahrenheita aj Celzia, jednoducho odkomentujte ďalšie riadky. Oneskorenie 2000 milisekúnd (2 sekundy) medzi jednotlivými meraniami vám dáva čas na prečítanie displeja.
Prispôsobenie textových popisov
Môžete zmeniť textové popisy, ktoré sa zobrazujú na LCD. Pole typeName[] obsahuje popisy pre teplotu objektu a okolia:
char *typeName[]={"Objekt:","Okolie:"};
Tieto reťazce môžete upraviť tak, aby sa text zobrazoval vo vašom preferovanom jazyku, pokiaľ používa latinské znaky (vo videu o 05:08).
Pridanie podmienených akcií
Kód tiež obsahuje užitočnú funkciu getTemp('X'), ktorá vracia teplotu ako číslo s plávajúcou desatinnou čiarkou. To vám umožňuje vykonávať akcie na základe teplotných prahov. Napríklad by ste mohli zapnúť relé alebo bzučiak, ak teplota prekročí určitú hodnotu:
if( getTemp('C') > 40)
{
// urobte tu niečo, napríklad zapnite relé alebo bzučiak
}
To je obzvlášť užitočné na vytváranie alarmových systémov alebo automatických reakcií na zmeny teploty.
Demonštrácia
Po nahratí kódu a správnom zapojení začne LCD zobrazovať hodnoty teploty. V demonštrácii bol senzor nasmerovaný na rôzne objekty, aby sa ukázalo, ako reaguje. Pri nasmerovaní na čelo osoby senzor nameral telesnú teplotu okolo 33–34 °C (vo videu o 09:39). Pri nasmerovaní na chladnejší povrch hodnoty klesli na približne 26 °C pre objekt a 28 °C pre teplotu okolia (vo videu o 09:52).
Senzor je pomerne stabilný a poskytuje konzistentné hodnoty. Video tiež ukazuje, ako upraviť kód tak, aby sa zobrazovali iba hodnoty v stupňoch Celzia, a to zakomentovaním riadkov pre Fahrenheita a Kelvina. To sa vykoná výberom riadkov a použitím funkcie komentovania v Arduino IDE (Ctrl+/ alebo Cmd+/), ktorá pridá dvojité lomky (//) na začiatok každého riadka.
V predvolenom nastavení kód zobrazuje hodnoty v stupňoch Celzia pre teplotu objektu aj okolia. Ľahko môžete prepnúť na Fahrenheita alebo Kelvina odkomentovaním príslušných riadkov vo funkcii loop(). LCD potom bude každé dve sekundy striedať hodnoty objektu a okolia.
Kapitoly
- [00:00] Úvod k projektu MLX90614 s LCD
- [01:20] Možnosti displeja: LCD2004 a LCD1602
- [02:29] Vysvetlenie zapojenia
- [04:28] Vysvetlenie kódu
- [04:53] Nájdenie adries I2C
- [08:35] Demonštrácia
- [10:47] Záverečné poznámky a poďakovanie
++
/***************************************************
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
Things you might need
-
Amazon
-
AmazonMLX90614 Non-Contact sensor on Amazon Canadalink.amazon
-
eBay
-
AliExpressMLX90614 Non-Contact sensor on AliExpresss.click.aliexpress.com
Resources & references
-
Internal
Files📁
Other files
-
Adafruit MLX90614 library (from Robojax)
robojax_MLX90614-_Adafruit_Library-master.zip -
Melexis MLX90614 datasheet (PDF)
robojax_MLX90614_Datasheet-Melexis.pdf