Gerade in den kälteren Jahreszeiten ist es interessant die Temperatur von Oberflächen zu kennen. Die meisten Sensoren messen allerdings nur die Umgebungstemperatur, daher möchten wir uns ansehen, wie man mit dem Raspberry Pi den MLX90614 Infrarot-Temperatursensor auslesen kann. Dieser kann nicht nur die Temperatur des Raums messen, sondern auch von Oberflächen – ohne diese zu berühren. So kann ein solches kontaktlose Thermometer zum Beispiel zum Fieber messen genutzt werden.
In diesem Tutorial schauen wir uns an, wie man den MLX90614 Sensor verkabelt und mittels Python am Raspberry Pi zur Temperaturmessung benutzt
Temperatursensor Zubehör
In diesem Tutorial werden folgende Bauteile verwendet:
- Raspberry Pi
- MLX90614 Temperatursensor auf PCB Board
- Jumper Kabel
- optional: Breadboard
Der Vorteil zu anderen Temperatursensoren wie dem DHT11 oder DS18B20 besteht darin, dass wir Temperaturen von Objekten eben auch komplett kontaktlos messen können!
Raspberry Pi MLX90614 Schaltdiagramm
Beginnen wir damit den Sensor an den Raspberry Pi anzuschließen. Dafür ist folgende Tabelle geeignet (die Pins kannst du ebenfalls hier nachsehen):
MLX90614 Sensor | Raspberry Pi |
---|---|
VIN | 5V (Pin 2) |
GND | GND (Pin 6) |
SCL | GPIO 3 (Pin 5) |
SDA | GPIO 2 (Pin 3) |
Schematisch sieht der Aufbau dann folgendermaßen aus:
Im Datenblatt ist beschrieben, wie der Sensor per I2C oder aber per PWM (Pulsdauermodulation) ausgelesen werden kann. Dem widmen wir uns als Nächstes. Doch vorher müssen wir noch ein paar Vorbereitungen treffen und die I2C Adresse des MLX90614 Sensors auslesen.
Vorbereitung: I2C aktivieren
Wir möchten den Sensor im Folgenden per I2C auslesen. Daher müssen wir es als Erstes aktivieren bzw. sicherstellen, dass es aktiv ist. Verbinde dich per SSH mit dem Raspberry Pi und gib folgendes ins Terminal ein:
sudo raspi-config
Unter „Interfacing Options“ > „I2C“ aktivieren das automatische Laden des I2C Kernel Moduls.
Anschließend können wir testen, ob der MLX90614 Temperatursensor bereits erkannt wird.
pi@raspberrypi:~ $ sudo i2cdetect -y 1
Das Ergebnis sieht folgendermaßen aus (unter der Adresse 5A ist der Sensor gelistet):
pi@raspberrypi:~ $ sudo i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- 5a -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
MLX90614 Beispielcode laden und Temperatur messen
Schauen wir noch einmal ins Datenblatt. Hier finden wir einige nützliche Informationen:
- Temperaturbereich: -40 … +125 °C
- Register 0x06 (Ta) enthält die Umgebungstemperatur („Ambient Temperature measured from the chip“)
- Register 0x07 (To) enthält die gemessene Objekttemperatur, auf die der
- Field of View (FoV) von ca. 80° – das gemessene Objekt sollte also nicht zu weit entfernt sein
Das Auslesen an sich ist relativ simpel. Wir lesen lediglich an der I2C-Adresse (0x5A) den entsprechenden Wert aus (0x07 für die Objekttemperatur). Dafür habe ich eine kleine Klasse geschrieben, die folgenden Python-Code enthält:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
import smbus import time class MLX90614(): MLX90614_TA = 0x06 MLX90614_TOBJ1 = 0x07 def __init__(self, address = 0x5a, bus = 1): self.address = address self.bus = smbus.SMBus(bus) def readValue(self, registerAddress): error = None for i in range(3): try: return self.bus.read_word_data(self.address, registerAddress) except IOError as e: error = e sleep(0.1) raise error def valueToCelcius(self, value): return -273.15 + (value * 0.02) def readObjectTemperature(self): value = self.readValue(self.MLX90614_TOBJ1) return self.valueToCelcius(value) def readAmbientTemperature(self): value = self.readValue(self.MLX90614_TA) return self.valueToCelcius(value) |
Wir können und das Repository dazu einfach klonen:
git clone https://github.com/tutRPi/Raspberry-Pi-MLX90614-Python
Außerdem ist eine kleine Beispieldatei dabei, die du einfach ausführen kannst:
cd Raspberry-Pi-MLX90614-Python sudo python example.py
Die MLX90614 Klasse kannst du einfach in anderen Projekten einbinden und somit die Temperatur auslesen.
Sofern weiteres Interesse an dem MLX90614 Infrarotsensor in Verbindung mit dem Raspberry Pi oder ESP8266 besteht, würde ich mich über einen Kommentar freuen. Angedacht sind z.B. 3d-gedruckte kontaktlose Messgeräte mit Display, wie im Titelbild zu sehen ist.
18 Kommentare
Super Beitrag!
Eine Kleinigkeit zur Korrektur:
„sudo raspbi-config“ muss heißen „ sudo raspi-config“
Danke, ist verbessert 🙂
Toller Beitrag! Ja ein Beitrag zur Nuztung mit einem ESP8266 wäre super. Dann könnte man entfernte Objekte überwachen, z.B.: einen Kaminofen für die Steuerung der Dunsabzugshaube in Verbindung mit einem Fensterschalter oder Vorlauf / Rücklauftemperatur der Heizung, etc.
Toller Beitrag! Über ein Folgeprojekt: 3d-gedruckte kontaktlose Messgeräte mit Display, wie im Titelbild zu sehen ist, würde ich mich freuen
Ja, bitte mehr davon
ob man damit 4 Kochfelder vom Herd überwachen könnte?
Ja, wobei man auf den Winkel und den Abstand achten müsste. Falls du es ausprobierst, kannst du ja mal berichten
+1
Wenn Du eine Idee hast wo und wie die Sensoren angebracht werden sollen.
Von oben wird nichts werden, da ja der Topf steht. Schräg von der Seite wird möglicherweise bei einer alten Platte gehen, aber nicht bei einem Ceran – Kochfeld. Die Sensoren müssten auch so angebracht werden, das sie beim Kochen nicht stören und müssen geschützt sein, wenn mal was überkocht.
Von unten wird es auch kaum klappen. Die Aussichten : eher Daumen runter.
Ganz wichtig, was bei dem Beitrag fehlt!
Kontaktloses Messen ist im Prinzip eine gute Sache und wird auch durch mich genutzt.
Aber das Messen an glänzenden Metalloberflächen ist so nicht möglich !
Diese Flächen strahlen ganz wenig Wärme ab. Da misst du an einem Alu – Kühlkörper möglicherweise 40° C , während die reale Temperatur schon über 200 ° C ist. Das ist bedingt durch das Messverfahren. Wenn man das Strahlungsverhalten der Oberfläche kennt, kann man den Fehler berechnen.
Das muss man einfach wissen und beachten!
Hallo Aro, ich habe schon etliche Tests mit dem MLX gemacht.
Die Problematik mit den unterschiedlichsten Oberflächen ist klar, jedoch habe ich sehr hohe Abweichungen bei den Temperaturwerten bei unterschiedlichen Abständen (2-30 cm) zum messenden Objekt. Gibt’s irgendwelche Informationen, wie ich reproduzierbar Ergebnisse bekomme?
Das ist ganz einfach. Ich habe jetzt keine Angabe zu dem Öffnungswinkel deines Sensor.
Die Sensoren werden mit einem FOV zwischen 5 und 35 Grad produziert !
Wenn Du sehr nah an der zu messenden Fläche bist, dann erfasst Du wirklich nur die interessierende Fläche. Je größer der Abstand und je größer der Öffnungswinkel deines Sensors, desto größer ist die Wahrscheinlichkeit, andere andere Objekte mit zu erfassen.
Das Ergebnis ist dann der Durchschnitt aller erfassten Flächen!
Möglicherweise wirkt sich bei großem Öffnungswinkel auch aus, das damit eine größere Fläche erfasst wird, wenn man sich entfernt. Am besten mal eine große Fläche mit konstanter Temperatur suchen, den Abstand messen und schrittweise ändern. Die Werte in eine Tabelle eintragen. Damit hast Du den abstansabhängigen Fehler. Dann das gleiche noch mal mit einer kleinen Fläche vor einem Hintergrund mit anderer Temperatur. Da merkst Du, ab welchem Abstand der Sensor an der Messstelle vorbei schaut. Ohne diese Daten ist das würfeln, hat aber nichts mit Messen zu tun.
Ich habe mir vor längerer Zeit mal ein komplettes Gerät für unter 10 Euro aus China kommen lassen und kann damit keinen Unterschied bei unterschiedlichen Abständen feststellen.
Display?
Auch für den kleinen raspi möglich?
Tragbare Version?
Was verstehst Du unter Display ? Was ist ein kleiner Raspi ?
Es gibt heute Treiber für sehr viele verschiedene LCD – Displays. Wenn Du unter der Bezeichnung Deines Displays im Netz suchst, findest Du sicher ein Beispiel.
Tragbare Version mit Raspi ist Unsinn. Ein fertiges Gerät kostet nur den Bruchteil eines Raspi, hat eine fertige Anzeige und benötigt normale Batterien, die lange halten.
Der Selbstbau lohnt aber, wenn Du die Daten irgend wie in ein anderes, übergeordnetes Projekt übernehmen willst, oder wenn Du Dich durch eigene Versuche in das Fachgebiet einarbeiten willst.
Man kann sicher fast alles irgend wie selbst bauen, man sollte aber immer überlegen, ob es Sinn macht, oder ob man sein Geld und seine Zeit besser in ein anderes Projekt steckt.
Da muss jeder seine eigenen Prioritäten setzen.
Hallo,
das ist ein sehr interessanter Beitrag. Vielen Dank.
Wie viele MLX90614 Sensoren kann man eigentlich an einen Raspberry Pi anschliessen?
Ich bräuchte 4 oder 8 Sensoren. Falls es 8 Sensoren sind bräuchte ich jeweils einen Mittelwert 2er Sensoren. Diese 4 Ausgänge bräuchte ich als Analog Ausgang 0-5V .
Die Messgenauigkeit braucht nicht unter 1 C° zu sein.
haben andere Sensoren wie ZB der gy-mlx90614-dci die gleichen Ein- und Ausgänge
Ist das
https://www.melexis.com/en/product/mlx90640/far-infrared-thermal-sensor-array
32×24 Pixel, seit Corona leider nicht mehr zu bekommen.
Oder als 8×8: AMG8833
Viel Spaß, wenn das Zeug wieder lieferbar ist!
Hallo Leser.
Bei mir funktioniert das Programm mit dem Sensor MLX90614 nicht.
Fehlermeldung im Programm MLX90614.py
Line 2: unused import time
Line 20 : Name ´sleep´ is not defined
Line 21 : Exception must be derived from Base-Exception
Was muss man machen , damit das Programm läuft?
Hallo,
wird hier noch entwickelt?
Ich möchte auf einer Strecke von 275 cm mit 12 Sensoren verschiedene Temperaturbereiche überwachen und in einem Zeitraum von 20 Minuten aufzeichnen. Wird es mit dem Programm auch funktionieren?
Lassen sich am Pi soviele Sensoren anmelden und über einen solchen Zeitraum aus den Sensoren aufzeichnen?