Prototipe Sistem Keamanan Pintu Menggunakan RFID dan Sensor Gerak Berbasis IOT (Internet Of Things) dengan Notifikasi Telegram
Sistem pengunci pintu saat ini masih menggunakan kunci konvensional, sehingga kurang efisien untuk rumah dengan banyak pintu karena terlalu banyak kunci yang harus dibawa, selain itu kunci konvensional mudah dibuka dan tidak dapat mengetahui adanya pencuri. Sehingga diperlukan kunci yang lebih praktis dan efisien, dari pernyataan tersebut memunculkan ide untuk membuat prototipe
sistem keamanan dan pendeteksi gerak pada pintu menggunakan RFID dan ESP32 cam berbasis NODEMCU dengan notifikasi telegram. Sensor RFID dan ESP32 cam merupakan komponen pendukung agar alat dapat dikendalikan. Solenoid doorlock dapat membuka dan mengunci pintu lewat perintah yang sebelumnya dikirim dari sensor RFID dan mengirimkan notifikasi ke telegram dan ESP32 cam akan mengirimkan gambar ketika mendeteksi gerak dan mengirimkannya ke telegram.
Berdasarkan hasil pengujian dapat disimpulkan bahwa simulasi alat pengaman pintu dapat beroperasi dengan baik, sesuai rancangan yang dibuat. ESP32 cam digunakan untuk mengirim gambar dan sensor PIR untuk mendeteksi gerakan sehingga ESP32 cam dapat menangkap gambar ketika mendeteksi adanya gerakan. RFID reader digunakan untuk membaca kode tag pada pada kartu. Solenoid dapat membuka kunci pintu apabila kode tag kartu sesuai dengan yang sudah terdaftar pada program Arduino lde, ketika pintu ditutup solenoid akan mengunci pintu kembali.
Rangkaian Skematik Prototipe :
Prototipe ini menggunakan 2 program yang saling terhubung antara NodeMCU dan ESP32 Cam, dimana Nodemcu berberan sebagai otak penggerak untuk solenoid yang terhubung oleh input berupa RFid dan Touch Sensor sedangkan ESP32 Cam berperan sebagai kamera yang akan menangkap gambar apabila sensor PIR mendeteksi adanya gerakan didepan pintu. Keduanya terhubung dengan alamat wifi dan Token id telegram yang sama, maka dari itu semua notifikasi dari nodemcu ataupun esp32 cam tetap menggunakan bot telegram yang sama. Program dapat dilihat dibawah :
Program NodeMCU :
#include <MFRC522.h>
#include "CTBot.h"
#define RST_PIN D1
#define SDA_PIN D2
#define SENSOR_PIN D8
int pinrelay = D0;
int buzzer = D4;
MFRC522 mfrc522(SDA_PIN, RST_PIN);
CTBot myBot;
String ssid = "Kamar Pojok";
String pass = "bobol.usaha123";
String token = "5602921990:AAHjgRDZ4UBkwgyZlw4V2mgpyGPbxgYzwjs";
const int id = 1349394860;
void setup(){
{
myBot.wifiConnect(ssid,pass);
myBot.setTelegramToken(token);
if (myBot.testConnection()) {
Serial.println("Koneksi Bagus");
} else {
Serial.println("Koneksi Jelek");
}
myBot.sendMessage(id, "Prototipe RFID");
Serial.println("pesan Terkirim");
}
{
Serial.begin(9600);
SPI.begin();
mfrc522.PCD_Init();
Serial.println("Put your card to the reader...");
pinMode(SENSOR_PIN, INPUT);
pinMode (pinrelay, OUTPUT);
pinMode (buzzer, OUTPUT);
}
}
void loop() {
{
digitalWrite (pinrelay, HIGH);
int ctsValue = digitalRead(SENSOR_PIN);
if (ctsValue == HIGH)
{
digitalWrite(pinrelay, LOW);
Serial.println("TOUCHED");
tone (buzzer, 1000, 1000);
myBot.sendMessage(id, "meninggalkan ruangan");
delay(3000);
}
else{
digitalWrite(pinrelay,HIGH);
Serial.println("not touched");
delay(1000);
}
}
{
if(!mfrc522.PICC_IsNewCardPresent()){
return;
}
if(!mfrc522.PICC_ReadCardSerial()){
return;
}
Serial.print("UID tag :");
String content = "";
byte letter;
for(byte i = 0; i < mfrc522.uid.size; i++){
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[i], HEX);
content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
Serial.println();
Serial.print("Pesan : ");
content.toUpperCase();
if(content.substring(1) == "FD E5 FB 8B"){
Serial.println("Fachri Muhammad");
Serial.println();
digitalWrite (pinrelay,LOW);
tone (buzzer, 1000, 1000);
myBot.sendMessage(id, "Fachri Muhammad Memasuki Ruangan");
delay(2000);
}
else if(content.substring(1) == "B7 51 22 63"){
Serial.println("Adul");
Serial.println();
digitalWrite (pinrelay, LOW);
tone (buzzer, 1000, 1000);
myBot.sendMessage(id, "Adul Memasuki Ruangan");
delay(2000);
}
else{
Serial.println("Kartu Tidak cocok");
myBot.sendMessage(id, "Ada yang memaksa Masuk");
tone (buzzer, 1000, 1000);
delay(300);
noTone (buzzer);
delay(300);
tone (buzzer, 1000, 1000);
delay(300);
noTone (buzzer);
delay(300);
tone (buzzer, 1000, 1000);
delay(300);
noTone (buzzer);
delay(300);
tone (buzzer, 1000, 1000);
delay(300);
noTone (buzzer);
delay(300);
tone (buzzer, 1000, 1000);
delay(300);
noTone (buzzer);
delay(300);
tone (buzzer, 1000, 1000);
delay(300);
noTone (buzzer);
delay(300);
}
Program ESP32 CAM :
const char* ssid = "Kamar Pojok"; //WIFI SSID
const char* password = "bobol.usaha123"; //WIFI password
String token = "5602921990:AAHjgRDZ4UBkwgyZlw4V2mgpyGPbxgYzwjs";
String chat_id = "1349394860";
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include "soc/soc.h"
#include "soc/rtc_cntl_reg.h"
#include "esp_camera.h"
//CAMERA_MODEL_AI_THINKER
#define PWDN_GPIO_NUM 32
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 0
#define SIOD_GPIO_NUM 26
#define SIOC_GPIO_NUM 27
#define Y9_GPIO_NUM 35
#define Y8_GPIO_NUM 34
#define Y7_GPIO_NUM 39
#define Y6_GPIO_NUM 36
#define Y5_GPIO_NUM 21
#define Y4_GPIO_NUM 19
#define Y3_GPIO_NUM 18
#define Y2_GPIO_NUM 5
#define VSYNC_GPIO_NUM 25
#define HREF_GPIO_NUM 23
#define PCLK_GPIO_NUM 22
int gpioPIR = 13; //PIR Motion Sensor
void setup()
{
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);
Serial.begin(115200);
delay(10);
WiFi.mode(WIFI_STA);
Serial.println("");
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
long int StartTime=millis();
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
if ((StartTime+10000) < millis()) break;
}
Serial.println("");
Serial.println("STAIP address: ");
Serial.println(WiFi.localIP());
Serial.println("");
if (WiFi.status() != WL_CONNECTED) {
Serial.println("Reset");
ledcAttachPin(4, 3);
ledcSetup(3, 5000, 8);
ledcWrite(3,10);
delay(200);
ledcWrite(3,0);
delay(200);
ledcDetachPin(3);
delay(1000);
ESP.restart();
}
else
{
ledcAttachPin(4, 3);
ledcSetup(3, 5000, 8);
for (int i=0;i<5;i++) {
ledcWrite(3,10);
delay(200);
ledcWrite(3,0);
delay(200);
}
ledcDetachPin(3);
}
camera_config_t config;
config.ledc_channel = LEDC_CHANNEL_0;
config.ledc_timer = LEDC_TIMER_0;
config.pin_d0 = Y2_GPIO_NUM;
config.pin_d1 = Y3_GPIO_NUM;
config.pin_d2 = Y4_GPIO_NUM;
config.pin_d3 = Y5_GPIO_NUM;
config.pin_d4 = Y6_GPIO_NUM;
config.pin_d5 = Y7_GPIO_NUM;
config.pin_d6 = Y8_GPIO_NUM;
config.pin_d7 = Y9_GPIO_NUM;
config.pin_xclk = XCLK_GPIO_NUM;
config.pin_pclk = PCLK_GPIO_NUM;
config.pin_vsync = VSYNC_GPIO_NUM;
config.pin_href = HREF_GPIO_NUM;
config.pin_sscb_sda = SIOD_GPIO_NUM;
config.pin_sscb_scl = SIOC_GPIO_NUM;
config.pin_pwdn = PWDN_GPIO_NUM;
config.pin_reset = RESET_GPIO_NUM;
config.xclk_freq_hz = 20000000;
config.pixel_format = PIXFORMAT_JPEG;
if(psramFound())
{
config.frame_size = FRAMESIZE_VGA;
config.jpeg_quality = 10; //0-63 lower number means higher quality
config.fb_count = 2;
}
else
{
config.frame_size = FRAMESIZE_QQVGA;
config.jpeg_quality = 12; //0-63 lower number means higher quality
config.fb_count = 1;
}
// camera init
esp_err_t err = esp_camera_init(&config);
if (err != ESP_OK)
{
Serial.printf("Camera init failed with error 0x%x", err);
delay(1000);
ESP.restart();
}
sensor_t * s = esp_camera_sensor_get();
s->set_framesize(s, FRAMESIZE_XGA);
}
void loop()
{
pinMode(gpioPIR, INPUT_PULLUP);
int v = digitalRead(gpioPIR);
Serial.println(v);
if (v==1)
{
alerts2Telegram(token, chat_id);
delay(10000);
}
delay(1000);
}
String alerts2Telegram(String token, String chat_id)
{
const char* myDomain = "api.telegram.org";
String getAll="", getBody = "";
camera_fb_t * fb = NULL;
fb = esp_camera_fb_get();
if(!fb)
{
Serial.println("Camera capture failed");
delay(1000);
ESP.restart();
return "Camera capture failed";
}
WiFiClientSecure client_tcp;
if (client_tcp.connect(myDomain, 443))
{
Serial.println("Connected to " + String(myDomain));
String head = "--India\r\nContent-Disposition: form-data; name=\"chat_id\";
\r\n\r\n" + chat_id + "\r\n--India\r\nContent-Disposition: form-data;
name=\"photo\"; filename=\"esp32-cam.jpg\"\r\nContent-Type:
image/jpeg\r\n\r\n";
String tail = "\r\n--India--\r\n";
uint16_t imageLen = fb->len;
uint16_t extraLen = head.length() + tail.length();
uint16_t totalLen = imageLen + extraLen;
client_tcp.println("POST /bot"+token+"/sendPhoto HTTP/1.1");
client_tcp.println("Host: " + String(myDomain));
client_tcp.println("Content-Length: " + String(totalLen));
client_tcp.println("Content-Type: multipart/form-data; boundary=India");
client_tcp.println();
client_tcp.print(head);
uint8_t *fbBuf = fb->buf;
size_t fbLen = fb->len;
for (size_t n=0;n<fbLen;n=n+1024)
{
if (n+1024<fbLen)
{
client_tcp.write(fbBuf, 1024);
fbBuf += 1024;
}
else if (fbLen%1024>0)
{
size_t remainder = fbLen%1024;
client_tcp.write(fbBuf, remainder);
}
}
client_tcp.print(tail);
esp_camera_fb_return(fb);
int waitTime = 10000; // timeout 10 seconds
long startTime = millis();
boolean state = false;
while ((startTime + waitTime) > millis())
{
Serial.print(".");
delay(100);
while (client_tcp.available())
{
char c = client_tcp.read();
if (c == '\n')
{
if (getAll.length()==0) state=true;
getAll = "";
}
else if (c != '\r')
getAll += String(c);
if (state==true) getBody += String(c);
startTime = millis();
}
if (getBody.length()>0) break;
}
client_tcp.stop();
Serial.println(getBody);
}
else {
getBody = "Connection to telegram failed.";
Serial.println("Connection to telegram failed.");
}
return getBody;
}
Komponen yang digunakan pada Prototipe :
- NodeMcu
- ESP32 CAM
- RFID
- Touch Sensor
- Sensor Pir
- Buzzer
- Solenoid lock Door
- Modul Relay 5V
- Power Supply