Verwendung eines Melexis MLX90614 Infrarot-Thermometers mit einem Arduino LCD1602
Temperaturmessung ohne physischen Kontakt ist eine faszinierende Fähigkeit, die die Tür zu vielen praktischen und kreativen Projekten öffnet. Das Melexis MLX90614 Infrarot-Thermometer macht dies möglich, indem es die von Objekten abgegebene Wärmestrahlung erkennt und Ihnen ermöglicht, die Temperatur aus sicherer Entfernung zu messen. Diese Anleitung zeigt Ihnen, wie Sie diesen vielseitigen Sensor mit einem Arduino verbinden und sowohl die Objekt- als auch die Umgebungstemperatur auf einem I2C-LCD-Bildschirm (entweder einem 16x2- oder 20x4-Zeichendisplay) anzeigen.


Dieses Projekt ist perfekt für eine Vielzahl von Anwendungen geeignet, wie zum Beispiel:
- Bau einer berührungslosen Fieber-Screening-Station für einen Klinik- oder Büroeingang.
- Überwachung der Temperatur eines 3D-Druckerbetts oder Hot-Ends, ohne den Druck zu beeinträchtigen.
- Erstellung eines sicheren, berührungslosen Lebensmitteltemperaturprüfers für Kochen oder Brauen.
- Entwicklung eines einfachen Anwesenheitsdetektors für Menschen durch Messung von Körpersignaturen.
- Überprüfung der Temperatur von beweglichen Maschinenteilen oder elektrischen Schalttafeln aus sicherer Entfernung.
Der MLX90614-Sensor kommuniziert über das I2C-Protokoll, was bedeutet, dass er nur zwei Datenpins (SDA und SCL) sowie Strom und Masse benötigt. Dies macht die Verkabelung unkompliziert und lässt viele Pins für andere Komponenten frei. Am Ende dieses Tutorials haben Sie ein funktionierendes Temperaturdisplay, das Messwerte in Celsius, Fahrenheit oder Kelvin anzeigen kann, und Sie verstehen, wie Sie den Code für Ihre spezifischen Anforderungen anpassen können.
Benötigte Hardware
Um dieses Projekt zu bauen, benötigen Sie die folgenden Komponenten:
- Arduino-Board (Uno, Nano, Mega usw.)
- MLX90614 Infrarot-Temperatursensor-Modul
- I2C-LCD-Display (16x2 oder 20x4 Zeichen)
- Jumper-Kabel
- Breadboard (optional, für einfachere Verbindungen)
Verkabelungsanleitung
Die Verkabelung für dieses Projekt ist einfach, da sowohl der MLX90614-Sensor als auch das LCD-Display das I2C-Kommunikationsprotokoll verwenden. Dies bedeutet, dass sie dieselben zwei Datenleitungen (SDA und SCL) gemeinsam nutzen können, die parallel verbunden sind. Der Sensor arbeitet mit 3,3-V-Logik, kann aber über den 3,3-V-Ausgang des Arduinos mit Strom versorgt werden. Das LCD-Modul benötigt jedoch typischerweise 5 V für seine Hintergrundbeleuchtung und Logik (im Video bei 03:15).
Hier ist die Verbindungsübersicht:
- MLX90614 VCC → Arduino 3,3 V
- MLX90614 GND → Arduino GND
- MLX90614 SCL → Arduino A5 (SCL)
- MLX90614 SDA → Arduino A4 (SDA)
- LCD VCC → Arduino 5 V
- LCD GND → Arduino GND
- LCD SCL → Arduino A5 (SCL)
- LCD SDA → Arduino A4 (SDA)
Da I2C ein Busprotokoll ist, können Sie bis zu 128 Geräte an denselben zwei Leitungen anschließen (im Video bei 03:44). Wenn Sie ein Arduino Uno oder Nano verwenden, befinden sich die SDA- und SCL-Pins auf A4 bzw. A5. Für andere Boards wie den Mega befinden sich diese Pins an anderen Stellen (20 und 21). Überprüfen Sie daher unbedingt das Pinout Ihres Boards.

Einrichten der Bibliotheken
Bevor Sie den Code hochladen, müssen Sie zwei wesentliche Bibliotheken installieren. Die erste ist die Adafruit MLX90614-Bibliothek, die die Kommunikation mit dem Temperatursensor übernimmt. Die zweite ist die LiquidCrystal I2C-Bibliothek, die die Steuerung des LCD-Displays über den I2C-Bus vereinfacht. Diese Bibliotheken können über den Arduino-Bibliotheksmanager installiert werden, indem Sie nach ihren Namen suchen.
Nach der Installation der Bibliotheken müssen Sie die I2C-Adressen Ihrer angeschlossenen Geräte ermitteln. Dies ist ein entscheidender Schritt, da sowohl der Sensor als auch das LCD ihre eigenen eindeutigen Adressen haben. Der bereitgestellte Code enthält ein spezielles "I2C-Scanner"-Sketch, das Sie auf Ihren Arduino hochladen können, um diese Adressen zu finden. Wenn Sie den Scanner mit beiden angeschlossenen Geräten ausführen, werden zwei Adressen im seriellen Monitor ausgegeben. Im Video wurde das LCD bei 0x3F und der MLX90614-Sensor bei 0x5A gefunden (im Video bei 06:28). Ihre Geräte können unterschiedliche Adressen haben. Daher ist es wichtig, den Scanner auszuführen und die Werte zu notieren.
Code-Erklärung
Der Code ist flexibel gestaltet, sodass Sie einfach anpassen können, welche Temperatureinheiten angezeigt werden und wie die Informationen auf dem LCD präsentiert werden. Hier sind die wichtigsten benutzerkonfigurierbaren Teile des Codes (im Video bei 04:31):
LCD-Konfiguration
Am Anfang des Codes finden Sie die Einstellungen für Ihr spezifisches LCD-Display. Sie müssen diese Werte an Ihre Hardware anpassen:
const uint8_t I2C_ADDRESS = 0x3f; // I2C-Adresse Ihres LCDs
const uint8_t LCD_CHAR = 16; // Anzahl der Zeichen pro Zeile (16 oder 20)
const uint8_t LCD_ROW = 2; // Anzahl der Zeilen auf dem Display (2 oder 4)
Ändern Sie I2C_ADDRESS auf die Adresse, die Sie mit dem I2C-Scanner gefunden haben. Wenn Sie ein 20x4-LCD verwenden, setzen Sie LCD_CHAR auf 20 und LCD_ROW auf 4.
Anzeigen von Temperatureinheiten
Der Code verwendet ein cleveres System von Buchstaben, um verschiedene Temperaturmesswerte darzustellen. Die Hauptfunktion printTemp('X') nimmt ein einzelnes Zeichenargument, um zu bestimmen, was angezeigt werden soll. Die Zuordnung ist wie folgt:
'C'- Objekttemperatur in Celsius'D'- Umgebungstemperatur in Celsius'F'- Objekttemperatur in Fahrenheit'G'- Umgebungstemperatur in Fahrenheit'K'- Objekttemperatur in Kelvin'L'- Umgebungstemperatur in Kelvin
In der loop()-Funktion können Sie auswählen, welche Messwerte angezeigt werden sollen, indem Sie die benötigten Zeilen auskommentieren. Um beispielsweise nur Celsius-Werte für Objekt- und Umgebungstemperatur anzuzeigen, würde Ihre Schleife wie folgt aussehen:
void loop() {
printTemp('C'); // Objekttemperatur in C
delay(2000);
printTemp('D'); // Umgebungstemperatur in C
delay(2000);
}
Wenn Sie sowohl Fahrenheit als auch Celsius anzeigen möchten, kommentieren Sie einfach die zusätzlichen Zeilen aus. Die Verzögerung von 2000 Millisekunden (2 Sekunden) zwischen den Messwerten gibt Ihnen Zeit, das Display zu lesen.
Anpassen der Anzeigebeschriftungen
Sie können die Textbeschriftungen ändern, die auf dem LCD erscheinen. Das Array typeName[] enthält die Beschriftungen für die Objekt- und Umgebungstemperaturen:
char *typeName[]={"Objekt:","Umgebung:"};
Sie können diese Zeichenfolgen ändern, um Text in Ihrer bevorzugten Sprache anzuzeigen, solange lateinische Zeichen verwendet werden (im Video bei 05:08).
Hinzufügen bedingter Aktionen
Der Code enthält auch eine nützliche Funktion getTemp('X'), die die Temperatur als Gleitkommazahl zurückgibt. Dies ermöglicht es Ihnen, Aktionen basierend auf Temperaturschwellenwerten auszuführen. Sie könnten beispielsweise ein Relais oder einen Summer einschalten, wenn die Temperatur einen bestimmten Wert überschreitet:
if( getTemp('C') > 40)
{
// hier etwas tun, wie ein Relais oder einen Summer einschalten
}
Dies ist besonders nützlich für die Erstellung von Alarmsystemen oder automatisierten Reaktionen auf Temperaturänderungen.
Vorführung
Sobald der Code hochgeladen und die Verkabelung korrekt ist, beginnt das LCD, Temperaturmesswerte anzuzeigen. In der Vorführung wurde der Sensor auf verschiedene Objekte gerichtet, um zu zeigen, wie er reagiert. Als er auf die Stirn einer Person gerichtet wurde, maß der Sensor eine Körpertemperatur von etwa 33-34°C (im Video bei 09:39). Als er auf eine kühlere Oberfläche gerichtet wurde, sanken die Messwerte auf etwa 26°C für das Objekt und 28°C für die Umgebungstemperatur (im Video bei 09:52).
Der Sensor ist recht stabil und liefert konsistente Messwerte. Das Video zeigt auch, wie der Code geändert werden kann, um nur Celsius-Messwerte anzuzeigen, indem die Zeilen für Fahrenheit und Kelvin auskommentiert werden. Dies geschieht, indem die Zeilen ausgewählt und die Kommentarfunktion der Arduino-IDE verwendet wird (Strg+/ oder Cmd+/), die doppelte Schrägstriche (//) am Anfang jeder Zeile hinzufügt.
Standardmäßig zeigt der Code Messwerte in Celsius für sowohl Objekt- als auch Umgebungstemperatur an. Sie können problemlos auf Fahrenheit oder Kelvin umschalten, indem Sie die entsprechenden Zeilen in der loop()-Funktion auskommentieren. Das LCD wechselt dann alle zwei Sekunden zwischen den Objekt- und Umgebungsmesswerten.
Kapitel
- [00:00] Einführung in das MLX90614- mit-LCD-Projekt
- [01:20] Anzeigeoptionen: LCD2004 und LCD1602
- [02:29] Verkabelung erklärt
- [04:28] Code erklärt
- [04:53] Finden der I2C-Adressen
- [08:35] Vorführung
- [10:47] Abschlussbemerkungen und Danksagungen
++
/***************************************************
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
Dinge, die Sie vielleicht brauchen
-
Amazon
-
AmazonMLX90614 Non-Contact sensor on Amazon Canadalink.amazon
-
eBay
-
AliExpressMLX90614 Non-Contact sensor on AliExpresss.click.aliexpress.com
Ressourcen & Referenzen
Dateien📁
Andere Dateien
-
Adafruit MLX90614 Bibliothek (von Robojax)
robojax_MLX90614-_Adafruit_Library-master.zip -
Melexis MLX90614 Datenblatt (PDF)
robojax_MLX90614_Datasheet-Melexis.pdf