Sistem RFID Lewat dengan Pemindaian Suhu Kontakless untuk Akses Karyawan Aman
Komponen dan Perlengkapan
| Komponen | Jumlah |
| Arduino MKR1000 | 1 |
| Pembaca RFID RC522 | 1 |
| OLED 0.96 inci 128x32 | 1 |
| MLX90614 | 1 |
Aplikasi dan Layanan Online
Tentang Proyek
Ketika karyawan mengakses perusahaan menggunakan tag RFID, kami juga mengukur suhu tubuh karyawan dengan termometer inframerah non-kontak. Jika ada suhu yang meningkat (salah satu gejala COVID-19), akses diblokir. Selain itu, semua data (identifikasi karyawan melalui RFID) dikirim ke situs web perusahaan yang memantau waktu kedatangan kerja dan suhu tubuh (identifikasi karyawan untuk UID RFID) tag.
Langkah 1. Instalasi Perangkat Lunak
Kami menggunakan Papan WiFi Arduino MKR 1000 sebagai kontroler. Kami akan memprogram di Arduino IDE. Secara default, Arduino IDE dikonfigurasi hanya untuk papan AVR. Untuk bekerja dengan platform Arduino MK Wi-Fi 1000, Anda perlu menambahkan dukungan untuk Arduino SAMD (32bit ARM Cortex-M0+) di Manajer Papan. Di Manajer Papan (Alat > Papan > Manajer Papan), cari Arduino SAMD dan klik tombol Instal.
Setelah menginstal perangkat lunak di Arduino IDE, menu Alat Papan akan mendukung papan Arduino Zero dan MKR, termasuk Papan WiFi MKR 1000. Hubungkan papan MKR 1000 ke komputer Anda menggunakan kabel USB. Driver seharusnya terinstal secara otomatis.
Langkah 2. Menghubungkan Sensor Suhu Inframerah MLX90614 ke Papan WiFi Arduino MKR 1000
MLX90614 adalah sensor inframerah untuk pengukuran suhu non-kontak. Ini dapat mengukur suhu dalam rentang -70 hingga 380 derajat Celsius dengan akurasi sekitar 0,5°C. Saya memiliki MLX90614DAA di stok.
Sensor ini menggunakan Protokol I2C. Tetapkan kontak sebagai berikut:
Diagram koneksi ke Papan WiFi Arduino MKR:
Untuk pemrograman, kami menggunakan perpustakaan Adafruit_MLX90614.h, yang harus diinstal melalui Manajer Perpustakaan (Sketsa > Sertakan perpustakaan > Manajer Perpustakaan). Unggah sketsa ke Papan Arduino (mlx90614_01.ino):
// Menghubungkan perpustakaan
#include <Wire.h>
#include <Adafruit_MLX90614.h>
// Membuat instance objek
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
void setup() {
Serial.begin(9600);
Serial.println("start");
// memulai sensor MLX90614
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);
}
Buka pemantau port serial. Suhu lingkungan dan suhu objek dikeluarkan ke port serial setiap 3 detik.
Langkah 3. Menghubungkan Layar OLED ke Papan WiFi Arduino MKR 1000
Proyek ini menggunakan layar OLED monokrom 12x32 dalam bentuk modul dengan pengikat yang diperlukan pada chip SSD1306. Modul-modul ini berjalan pada antarmuka I2C. Diagram koneksi ke Papan Arduino:
Saat memrogram, kami menggunakan perpustakaan Adafruit SSD1306. Memuat sketsa untuk keluaran suhu ke layar. Kami mengukur suhu setiap 3 detik (mlx90614_02.ino):
// Menghubungkan perpustakaan
#include <Wire.h>
#include <Adafruit_MLX90614.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Membuat instance objek
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
Adafruit_SSD1306 display(128, 32, &Wire, -1);
float temp;
unsigned long millis1=0;
void setup() {
Serial.begin(9600);
// memulai layar
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.setTextSize(1);
display.setTextColor(WHITE);
// opsi layar
display.clearDisplay();
display.display();
// memulai sensor MLX90614
mlx.begin();
// mulai
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();
}
}
Langkah 4. Menghubungkan Modul Pembaca RFID RC522 ke Papan WiFi Arduino MKR 1000
Ada berbagai macam tag RFID. Tag aktif dan pasif (tanpa sumber daya bawaan, didayai oleh arus yang diinduksi dalam antena oleh sinyal dari pembaca). Tag bekerja pada frekuensi berbeda: LF (125 - 134 kHz), HF (13.56 MHz), UHF (860 - 960 MHz). Alat yang membaca informasi dari tag dan menulis data ke dalamnya disebut pembaca. Dalam proyek Arduino, modul RFID-RC522 sangat sering digunakan sebagai pembaca. Modul ini dibuat pada chip MFRC522 dari perusahaan NSP, yang menyediakan kerja dengan tag RA (pada frekuensi 13.56 MHz).
Menghubungkan ke Papan WiFi MKR 1000 melalui Protokol SPI:
Sketsa deteksi UID untuk kartu RFID, pengukuran suhu, dan pesan tentang pembukaan atau penutupan input dengan keluaran ke port serial (mlx90614_03.ino):
// Menghubungkan perpustakaan
#include <Wire.h>
#include <Adafruit_MLX90614.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <SPI.h>
#include <MFRC522.h>
// Membuat instance objek
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
Adafruit_SSD1306 display(128, 32, &Wire, -1);
MFRC522 mfrc522(7, 6);
byte cardUID[4] = {0,0,0,0};
int res=1;
float temp;
unsigned long millis1=0;
void setup() {
Serial.begin(9600);
// memulai layar
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.setTextSize(1);
display.setTextColor(WHITE);
display.clearDisplay();
display.display();
// memulai sensor MLX90614
mlx.begin();
// mulai SPI
SPI.begin();
// inisialisasi MFRC522
mfrc522.PCD_Init();
Serial.println("start");
Serial.println("Wait RFID ....");
}
void loop() {
switch(res) {
case 1: // menunggu RFID
display.clearDisplay();
display.setCursor(10,10);
display.print(F("Wait RFID...."));
// Memeriksa apakah kartu diletakkan
if ( mfrc522.PICC_IsNewCardPresent()) {
// Membaca info kartu
if ( mfrc522.PICC_ReadCardSerial()) {
// simpan UID
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: // menunggu pengukuran suhu
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: // buka atau tutup
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;
default:
break;
}
}
Langkah 5. Menghubungkan Papan WiFi Arduino MKR 1000 ke Internet
Untuk menghubungkan Arduino MKR1000 ke jaringan Wi-Fi, kami akan menggunakan perpustakaan WiFi101, yang akan kami instal menggunakan Manajer Perpustakaan (Sketsa Sertakan perpustakaan Manajer Perpustakaan).
Unduh sketsa untuk menghubungkan Papan WiFi Arduino MKR 1000 ke titik akses yang diperlukan. Unggah contoh dari perpustakaan connectWithWPA.ino ke Papan dengan memasukkan data untuk hotspot WiFi Anda di tab:
#define SECRET_SID "my_D Link"
#define SECRET_PASS "********"
Setelah mengunduh sketsa, buka pemantau port serial, tempat Anda dapat memantau proses menghubungkan Papan WiFi Arduino MKR1000 ke titik akses.
Jika koneksi berhasil, lanjutkan.
Langkah 6. Membuat Basis Data Karyawan di Situs Web Perusahaan dan Basis Data untuk Mengumpulkan Pembacaan Suhu Harian di Pintu Masuk
Membuat basis data di hosting (MySQL) dan dua tabel di dalamnya:
- users - data karyawan dan uid mereka;
- temp - untuk mengumpulkan data suhu tubuh yang diukur di pintu masuk.
Sekarang di hosting kami membuat 2 skrip untuk memproses data yang dikirim oleh Arduino MKR 1000 WiFi. Skrip get_uid.php memeriksa ID di basis data dan mengembalikan dalam respons:
• #no – jika uid tidak ada di basis data
• #yes;<name> - jika uid ada di basis data
Isi skrip get_uid.php
<?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";
}
?>
Anda dapat menguji skrip dengan mengirim permintaan dari browser.
Skrip get_temp.php mengirim suhu karyawan ke basis data
Isi skrip get_temp.php
<?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);
$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";
}
?>
STEP 7. Mengirim Data dari Papan WiFi Arduino MKR 1000 ke Situs Web Perusahaan
Mari kita tulis 2 fungsi:
• send_uid_to_server () - mengirim uid ke server;
• send_temp_to_server () - mengirim suhu ke server.
int send_uid_to_server() {
int ret=3;
unsigned long previos;
int x=0;int f=0;
char s;
client.stop();
if (client.connect(server, 80)) {
String str="/firm/get_uid.php?uid=";
for (byte i = 0; i < 4; i++) {
str+=String(cardUID[i],HEX);
}
Serial.print("str=");Serial.println(str);
client.println("GET "+str+" HTTP/1.1");
client.println("Host: freeparkovka.ru");
client.println("User-Agent: ArduinoWiFi/1.1");
client.println("Connection: close");
client.println();
previos=millis();
for(int i=0;i<40;i++) response[i]=0;
do {
if(client.available() > 0) {
s = client.read();
if(s=='#') f=1;
if(f==1) {
response[x]=s;
x++;
}
Serial.write(s);
}
} while((millis() - previos) < 5000);
if(response[0]=='#') {
ret=command(response);
}
Serial.println(response);
return ret;
} else {
Serial.println("connection failed");
return 3;
}
}
void send_temp_to_server() {
client.stop();
if (client.connect(server, 80)) {
String str="/firm/get_temp.php?uid=";
for (byte i = 0; i < 4; i++) {
str+=String(cardUID[i],HEX);
}
str+="&temp="+String(temp);
Serial.print("str=");Serial.println(str);
client.println("GET "+str+" HTTP/1.1");
client.println("Host: freeparkovka.ru");
client.println("User-Agent: ArduinoWiFi/1.1");
client.println("Connection: close");
client.println();
Serial.println(response);
delay(10);
} else {
Serial.println("connection failed");
}
}
STEP 8. Menambahkan Relay untuk Mengaktifkan / Menonaktifkan Input
Menambahkan relay untuk mengaktifkan / menonaktifkan masuk ke perusahaan, tergantung pada nilai suhu. Diagram koneksi:
Dan tambahkan ke kode mengaktifkan/menonaktifkan relay untuk membuka atau menutup input, tergantung pada data suhu.
if(temp<37.5) { // OPEN
display.setCursor(10,0);
display.print(F("OPEN"));
Serial.println("OPEN");
digitalWrite(pinRelay,HIGH);
} else { // CLOSE
display.print(F("CLOSE"));
display.setCursor(10,0);
display.print(F("Temp high!!!"));
Serial.println("CLOSE");
Serial.println("Temp high!!!");
digitalWrite(pinRelay,LOW);
}
STEP 9. Halaman untuk Melihat Jarak Jauh Data Suhu Karyawan
Untuk melihat data yang dikirim ke server, buka halaman situs. Isi skrip untuk mengeluarkan halaman file view_temp.php
<?php
$location="localhost";
$user="********";
$pass="********";
$db_name="********";
if(! $db=mysqli_connect($location,$user,$pass,$db_name)){echo "connect error";}
$query0=" SELECT * FROM temp WHERE uid='".$_GET['uid']."' ";
$rez0=mysqli_query($db,$query0);
$content1.=date('Y-m-d')."<br><br>";
$content1.="<table>";
$query1="SELECT * FROM temp WHERE day >= CURDATE() ";
$rez1=mysqli_query($db,$query1); $i=1;
while($row1=mysqli_fetch_assoc($rez1)) {
$content1.="<tr>";
$content1.="<td>".$i."</td>";
$rez2=mysqli_query($db,"SELECT name FROM users WHERE id =".$row1['id_user']." ");
$row2=mysqli_fetch_assoc($rez2);
$content1.="<td>".$row2['name']."</td>";
$content1.="<td>".mb_substr($row1['day'],10,9)."</td>";
if($row1['temp']>37.5)
$content1.="<td style='background-color:red'>".$row1['temp']."</td>";
else
$content1.="<td>".$row1['temp']."</td>";
$content1.="</tr>";
$i++;
}
$content1.="</table>";
echo $content1;
?>
Kode
// Kode lengkap Arduino untuk sistem RFID dan pemindaian suhu
// Termasuk WiFi101, MFRC522, MLX90614, SSD1306, dan komunikasi server PHP.
// Lihat sketsa lengkap di atas dalam setiap langkah proyek.
Skematik
File skematik Fritzing tersedia dalam dokumen proyek untuk referensi rangkaian.