RFID-Zutrittskontrolle mit berührungsloser Temperaturmessung für sicheren Mitarbeiterzugang
Bauteile und Zubehör
| Arduino MKR1000 (WiFi) | 1 |
| RFID-Leser RC522 | 1 |
| OLED-Display 0,96″ 128×32 (SSD1306) | 1 |
| MLX90614 Infrarot-Temperatursensor | 1 |
Apps und Online-Dienste
- Arduino IDE
- Fritzing (für Schaltpläne)
Über das Projekt
Mitarbeiter erhalten per RFID-Tag Zutritt. Zusätzlich wird berührungslos die Körpertemperatur gemessen (MLX90614). Bei erhöhter Temperatur (> 37,5 °C) wird der Zutritt verweigert. Alle Daten (RFID-UID, Temperatur, Zeitstempel) werden an einen Webserver (MySQL/PHP) gesendet und können remote eingesehen werden.



Schritt 1: Software-Installation
Arduino IDE um SAMD-Boards (MKR1000) erweitern: Werkzeuge → Board → Boardverwalter → „Arduino SAMD“ installieren. MKR1000 per USB anschließen (Treiber installieren sich automatisch).


Schritt 2: MLX90614 anschließen
I2C-Sensor, Messbereich -70…+380 °C, Genauigkeit ~0,5 °C. Anschluss: VDD an 3,3 V, GND, SDA an SDA, SCL an SCL. Bibliothek Adafruit_MLX90614 installieren.



Test-Sketch:
#include <Wire.h>
#include <Adafruit_MLX90614.h>
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
void setup() {
Serial.begin(9600);
Serial.println("start");
mlx.begin();
}
void loop() {
Serial.print("Ambient = "); Serial.print(mlx.readAmbientTempC()); Serial.print("*C");
Serial.print("\tObject = "); Serial.print(mlx.readObjectTempC()); Serial.print("*C");
Serial.print("\tObject = "); Serial.print(mlx.readObjectTempF()); Serial.println("*F");
delay(3000);
}
Schritt 3: OLED-Display anschließen
I2C-Display (SSD1306, 128×32). Bibliothek Adafruit_SSD1306 & Adafruit_GFX installieren.

Test-Sketch (Temperatur alle 3 s anzeigen):
#include <Wire.h>
#include <Adafruit_MLX90614.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
Adafruit_SSD1306 display(128, 32, &Wire, -1);
float temp; unsigned long millis1 = 0;
void setup() {
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.setTextSize(1); display.setTextColor(WHITE);
display.clearDisplay(); display.display();
mlx.begin(); Serial.println("start");
}
void loop() {
if (millis() - millis1 >= 3000) {
display.clearDisplay();
display.setCursor(10,10); display.println(F("Wait temp...."));
temp = mlx.readObjectTempC();
display.setCursor(10,20); display.print(temp); display.print(F(" *C"));
display.display();
millis1 = millis();
}
}
Schritt 4: RC522 RFID-Leser anschließen
SPI-Schnittstelle. Modul arbeitet mit 13,56 MHz (HF). Bibliothek MFRC522 installieren.


Sketch: UID lesen, Temperatur messen, „OPEN“/„CLOSE“ anzeigen.
#include <Wire.h>
#include <Adafruit_MLX90614.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <SPI.h>
#include <MFRC522.h>
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
Adafruit_SSD1306 display(128, 32, &Wire, -1);
MFRC522 mfrc522(7, 6); // SS=7, RST=6
byte cardUID[4] = {0,0,0,0};
int res = 1; float temp; unsigned long millis1 = 0;
void setup() {
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.setTextSize(1); display.setTextColor(WHITE);
display.clearDisplay(); display.display();
mlx.begin(); SPI.begin(); mfrc522.PCD_Init();
Serial.println("start"); Serial.println("Wait RFID ....");
}
void loop() {
switch(res) {
case 1: // RFID warten
display.clearDisplay(); display.setCursor(10,10); display.print(F("Wait RFID...."));
if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) {
Serial.print(F("Card UID:")); display.setCursor(10,20);
for (byte i=0;i<4;i++) { cardUID[i]=mfrc522.uid.uidByte[i]; Serial.print(cardUID[i],HEX); display.print(cardUID[i],HEX); }
Serial.println(); Serial.println("Wait temp...."); res=3;
}
mfrc522.PICC_HaltA(); mfrc522.PCD_StopCrypto1();
display.display(); break;
case 3: // Temp messen
delay(2000); display.clearDisplay(); display.setCursor(10,10); display.println(F("Wait temp...."));
temp = mlx.readObjectTempC(); display.setCursor(10,20); display.print(temp); display.print(F(" *C")); display.display();
if (temp>34.0 && temp<42.0) res=5; break;
case 5: // OPEN/CLOSE
display.clearDisplay(); display.setCursor(10,10); display.print(F("Temp=")); display.print(temp); display.print(F("*C"));
display.setCursor(10,20);
if (temp<37.5) { display.print(F("OPEN")); Serial.println("OPEN"); }
else { display.print(F("CLOSE")); display.setCursor(10,0); display.print(F("Temp high!!!")); Serial.println("CLOSE"); Serial.println("Temp high!!!"); }
display.display(); delay(3000); Serial.println("Wait RFID ...."); res=1; break;
}
}
Schritt 5: MKR1000 mit WLAN verbinden
Bibliothek WiFi101 installieren. Beispiel connectWithWPA laden, SSID/Passwort eintragen, hochladen, Serial Monitor beobachten.


Schritt 6: Datenbank & PHP-Skripte auf Webserver
MySQL-Datenbank mit zwei Tabellen:
users(id, name, uid)temp(id_user, temp, day)


get_uid.php – prüft UID, antwortet #yes;Name oder #no.
<?php
$location="localhost"; $user="..."; $pass="..."; $db_name="...";
if(! $db=mysqli_connect($location,$user,$pass,$db_name)) {echo "connect error";}
$query0=" SELECT * FROM users WHERE uid='".$_GET['uid']."' ";
$rez0=mysqli_query($db,$query0);
if(mysqli_num_rows($rez0)>0) { $row0=mysqli_fetch_assoc($rez0); echo "#yes;".$row0['name']."$"; }
else { echo "#no$"; }
?>
get_temp.php – speichert Temperatur für gültige UID.
<?php
// ... DB-Verbindung wie oben ...
$query0=" SELECT * FROM users WHERE uid='".$_GET['uid']."' ";
$rez0=mysqli_query($db,$query0);
if(mysqli_num_rows($rez0)>0) {
$row0=mysqli_fetch_assoc($rez0);
$query1=" INSERT INTO temp SET id_user='".$row0['id']."', temp='".$_GET['temp']."', day='".date('Y-m-d H:i:s')."' ";
mysqli_query($db,$query1); echo "#yes";
} else { echo "#no"; }
?>
Schritt 7: Daten vom MKR1000 an Server senden
Zwei Funktionen im Arduino-Sketch: send_uid_to_server() & send_temp_to_server() (HTTP GET).
Schritt 8: Relais für Türsteuerung
Relais an Pin 5: HIGH = Tür öffnen (Temp < 37,5 °C), LOW = Tür geschlossen.

Schritt 9: Webseite zur Anzeige der Temperaturdaten
view_temp.php listet heutige Einträge tabellarisch (rote Markierung bei Fieber).
<?php
// ... DB-Verbindung ...
$query1="SELECT * FROM temp WHERE day >= CURDATE()";
$rez1=mysqli_query($db,$query1); $i=1;
echo date('Y-m-d')."<br><br><table>";
while($row1=mysqli_fetch_assoc($rez1)) {
echo "<tr><td>".$i."</td>";
$rez2=mysqli_query($db,"SELECT name FROM users WHERE id=".$row1['id_user']);
$row2=mysqli_fetch_assoc($rez2); echo "<td>".$row2['name']."</td>";
echo "<td>".mb_substr($row1['day'],10,9)."</td>";
if($row1['temp']>37.5) echo "<td style='background-color:red'>".$row1['temp']."</td>";
else echo "<td>".$row1['temp']."</td>";
echo "</tr>"; $i++;
}
echo "</table>";
?>

Code (Gesamt-Sketch & Einzelschritte)
Der vollständige Arduino-Sketch (mlx90614_07.ino) sowie alle Teilschritte (Sensor, Display, RFID, PHP-Skripte) sind im Originalprojekt als Download verfügbar.
Schaltpläne (Fritzing-Dateien)
- 24_pAT1JQdrD1.fzz
- 05_ZnJZPiMYsB.fzz
- 08_RyXONO1VtK.fzz
- 12_jyWaOQUelW.fzz
Herstellungsprozess
- Integriertes QR-, RFID- und Temperatur-Verifikations-Zugangskontrollsystem
- Temperaturgesteuerter Lüfter: DIY Relais-System für Medienmöbel-Kühlung
- Professionelle Temperaturüberwachung mit Raspberry Pi und DS18B20
- Präzise Temperaturüberwachung im Server-Schrank mit Raspberry Pi
- LM35-basiertes Temperatursteuerungssystem mit AT89S52 Mikrocontroller
- Raspberry Pi Heimtemperaturmonitor mit MCP9808, InfluxDB & Grafana bauen
- Automatisiertes Pool-Befüllungs- und Überwachungssystem
- Häufige Kühlfehler in Industrie-Schalttafeln: Überhitzung & Ausfälle vermeiden
- Temperaturkontrolle im Druckguss meistern für optimale Qualität
- Temperaturkontrolle auf Baustellen: Umfassender Mietleitfaden