MONITORING PRESENSI PERPUSTAKAAN ELEKTRO MENGGUNAKAN KARTU E-PJE BERBASIS INTERNET OF THINGS

 

MONITORING PRESENSI PERPUSTAKAAN ELEKTRO MENGGUNAKAN KARTU E-PJE BERBASIS INTERNET OF THINGS


Disusun Oleh :

Sonia Audira                             3.32.20.2.22

Yohan Wahyu Pradana             3.32.20.2.26

EK-3C

D-3 Teknik Elektronika

Jurusan Teknik Elektro

Politeknik Negeri Semarang

 Pengertian

MONITORING PRESENSI PERPUSTAKAAN ELEKTRO MENGGUNAKAN KARTU E-PJE BERBASIS INTERNET OF THINGS adalah sebuah alat pengganti kertas dimana mahasiswa dalam proses presensi di perpustakaan  elektro tidak lagi menggunakan tanda tangan pada kertas, namun menggunakan kartu E-PJE yang ditempelkan pada alat tersebut. Kemudian data yang terbaca akan di proses oleh NodeMcu8266 dan kemudian dikirimkan ke spreadsheet. Pada spreadsheet ditampilkan dan tersimpan data-data secara otomatis.

Latar Belakang

Seiring dengan perkembangan zaman, dalam kegiatan akademik khususnya pada perpustakaan jurusan yang ada di Politeknik Negeri Semarang, kegiatan pendataan presensi adalah hal yang wajib dilakukan oleh seluruh mahasiswa Politeknik Negeri Semarang apabila memasuki perpustakaan. Pada umumnya, presensi dilakukan dengan penandatanganan lembar kehadiran yang telah disediakan oleh petugas perpustakaan. Penandatanganan yang dilakukan setiap hari ini dinilai tidak efektif. Selain tidak ramah lingkungan karena menggunakan bahan kertas juga dapat menimbulkan antrean, presensi manual juga bisa dimanipulasi oleh oknum-oknum yang tidak bertanggungjawab.

Oleh karena itu, untuk menemukan solusi dari permasalahan tersebut, kami membuat sebuah Tugas Akhir yang bertujuan untuk mempermudah dan menghindari kecurangan yang dilakukan oleh mahasiswa dalam melakukan presensi dan membantu meringankan petugas perpustakaan dalam pendataan mahasiswa yang hadir ke perpustakaan. “Monitoring Presensi Perpustakaan Elektro Menggunakan Kartu E-PJE Berbasis Internet of Things” adalah alat elektronik yang dapat digunakan untuk menggantikan presensi manual. Alat ini nantinya bekerja dengan sistem scanning yang berbasis Internet of Things. Kartu PJE yang di-scanning pada mesin absensi, kemudian dilakukan pengolahan data yang akan menghasilkan informasi kehadiran mahasiswa yang lebih cepat dan akurat.

Rumusan Masalah

      1.  Bagaimana solusi untuk menciptakan sistem presensi yang efektif bagi mahasiswa?
      2.  Bagaimana cara membuat sistem “Monitoring Presensi Mahasiswa Menggunakan Kartu E-PJE Berbasis Internet of Things?
      3. Bagaimana prinsip kerja dari sistem presensi tersebut?

Batasan Masalah

1. Alat Ini hanya menggunakan kartu E-PJE untuk bisa presensi pada saat berkunjung ke perpustakaan jurusan elektro.

2.  Kartu E-PJE terdaftar pada system


Komponen Yang Digunakan

1.     NodeMcu ESP8266


Gambar 1. NodeMcu ESP8266

NodeMCU adalah sebuah board elektronik yang berbasis chip ESP8266 dengan kemampuan menjalankan fungsi mikrokontroler dan juga koneksi internet (WiFi).

        2.     LCD


Gambar 2. LCD

Liquid Crystal Display (LCD) merupakan tampilan visual yang menggunakan daya rendah dengan pengontrol kontras dan kecerahan.

 

2I2C


Gambar 3. I2C

I2C adalah modul LCD yang dikendalikan secara serial sinkron dengan protokol I2C/IIC (Inter Integrated Circuit) atau TWI (Two Wire Interface). 

4.     RFID



Gambar 4. RFID

Teknologi Modul RFID atau Radio Frequency Identification adalah suatu teknik mengamati obyek yang dilakukan dengan menggunakan pancaran gelombang radio.

Luaran dan Masukan

1.     Masukan : RFID

2.     Luaran : Buzzer, LCD, Sreadsheet   

     Diagram Block 

Gambar 5. Diagram Block

    Diagram Alir


Gambar 6. Diagram Alir

Gambar Pengawatan

Gambar 7. Gambar Pengawatan

                    Program
                    /* ------------------------------------------------------------------------
 * ------------------------------------------------------------------------*/
 
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <SPI.h>
#include <MFRC522.h>
#include <HTTPSRedirect.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);
//---------------------------------------------------------------------------------------------------------
// Enter Google Script Deployment ID:
const char *GScriptId = "AKfycbyA91FlDAjhl_FtYlZToknm4HH5YunOuEN6LVRug_qLfojGNsHvmQcS8PJPwca95Dcj";
//---------------------------------------------------------------------------------------------------------
// Enter network credentials:
const char* ssid     = "AndroidAP";
const char* password = "siliwangi";
//---------------------------------------------------------------------------------------------------------
// Enter command (insert_row or append_row) and your Google Sheets sheet name (default is Sheet1):
String payload_base =  "{\"command\": \"insert_row\", \"sheet_name\": \"Sheet1\", \"values\": ";
String payload = "";
//---------------------------------------------------------------------------------------------------------
// Google Sheets setup (do not edit)
const char* host        = "script.google.com";
const int   httpsPort   = 443;
const char* fingerprint = "";
String url = String("/macros/s/") + GScriptId + "/exec";
HTTPSRedirect* client = nullptr;
//------------------------------------------------------------
// Declare variables that will be published to Google Sheets
String student_id;
//------------------------------------------------------------
int blocks[] = {4,5,6,8,9};
#define total_blocks  (sizeof(blocks) / sizeof(blocks[0]))
//------------------------------------------------------------
#define RST_PIN  0  //D3
#define SS_PIN   2  //D4
#define BUZZER   3  //S3
//------------------------------------------------------------
MFRC522 mfrc522(SS_PIN, RST_PIN);
MFRC522::MIFARE_Key key;  
MFRC522::StatusCode status;
//------------------------------------------------------------
/* Be aware of Sector Trailer Blocks */
int blockNum = 2;  
/* Create another array to read data from Block */
/* Legthn of buffer should be 2 Bytes more than the size of Block (16 Bytes) */
byte bufferLen = 18;
byte readBlockData[18];
//------------------------------------------------------------

/**********************************
 * setup Function
**********************************/
void setup() {
  //----------------------------------------------------------
  Serial.begin(9600);        
  delay(10);
  Serial.println('\n');
  //----------------------------------------------------------
  SPI.begin();
  //----------------------------------------------------------
  pinMode(BUZZER, OUTPUT);
  //initialize lcd screen
  lcd.begin();
  // turn on the backlight
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0,0); //col=0 row=0
  lcd.print("Connecting to");
  lcd.setCursor(0,1); //col=0 row=0
  lcd.print("WiFi...");
  //----------------------------------------------------------
  // Connect to WiFi
  WiFi.begin(ssid, password);             
  Serial.print("Connecting to ");
  Serial.print(ssid); Serial.println(" ...");
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
  Serial.println('\n');
  Serial.println("Connection established!");  
  Serial.print("IP address:\t");
  Serial.println(WiFi.localIP());
  //----------------------------------------------------------
  // Use HTTPSRedirect class to create a new TLS connection
  client = new HTTPSRedirect(httpsPort);
  client->setInsecure();
  client->setPrintResponseBody(true);
  client->setContentTypeHeader("application/json");
  //----------------------------------------------------------
  lcd.clear();
  lcd.setCursor(0,0); //col=0 row=0
  lcd.print("Connecting to");
  lcd.setCursor(0,1); //col=0 row=0
  lcd.print("Google ");
  delay(5000);
  //----------------------------------------------------------
  Serial.print("Connecting to ");
  Serial.println(host);
  //----------------------------------------------------------
  // Try to connect for a maximum of 5 times
  bool flag = false;
  for(int i=0; i<5; i++){ 
    int retval = client->connect(host, httpsPort);
    //*****************
    if (retval == 1){
      flag = true;
      String msg = "Connected. OK";
      Serial.println(msg);
      lcd.clear();
      lcd.setCursor(0,0); //col=0 row=0
      lcd.print(msg);
      delay(2000);
      break;
    }
    //*****************
    else
      Serial.println("Connection failed. Retrying...");
    //*****************
  }
  //----------------------------------------------------------
  if (!flag){
    //________________
    lcd.clear();
    lcd.setCursor(0,0); //col=0 row=0
    lcd.print("Connection fail");
    //________________
    Serial.print("Could not connect to server: ");
    Serial.println(host);
    delay(5000);
    return;
    //________________
  }
  //----------------------------------------------------------
  delete client;    // delete HTTPSRedirect object
  client = nullptr; // delete HTTPSRedirect object
  //----------------------------------------------------------  
}

/**********************************
 * loop Function
**********************************/
void loop() {
  //----------------------------------------------------------------
  static bool flag = false;
  if (!flag){
    client = new HTTPSRedirect(httpsPort);
    client->setInsecure();
    flag = true;
    client->setPrintResponseBody(true);
    client->setContentTypeHeader("application/json");
  }
  if (client != nullptr){
    if (!client->connected())
      {client->connect(host, httpsPort);}
  }
  else{Serial.println("Error creating client object!");}
  //----------------------------------------------------------------
  lcd.clear();
  lcd.setCursor(0,0); //col=0 row=0
  lcd.print("Scan Kartumu");
  
  /* Initialize MFRC522 Module */
  mfrc522.PCD_Init();
  /* Look for new cards */
  /* Reset the loop if no new card is present on RC522 Reader */
  if ( ! mfrc522.PICC_IsNewCardPresent()) {return;}
  /* Select one of the cards */
  if ( ! mfrc522.PICC_ReadCardSerial()) {return;}
  /* Read data from the same block */
  Serial.println();
  Serial.println(F("Reading last data from RFID..."));  
  //----------------------------------------------------------------
  String values = "", data;
  /*
  //creating payload - method 1
  //----------------------------------------------------------------
  ReadDataFromBlock(blocks[0], readBlockData); //student id
  data = String((char*)readBlockData); data.trim();
  student_id = data;
  //----------------------------------------------------------------
  ReadDataFromBlock(blocks[1], readBlockData); //first name
  data = String((char*)readBlockData); data.trim();
  first_name = data;
  //----------------------------------------------------------------
  ReadDataFromBlock(blocks[2], readBlockData); //last name
  data = String((char*)readBlockData); data.trim();
  last_name = data;
  //----------------------------------------------------------------
  ReadDataFromBlock(blocks[3], readBlockData); //phone number
  data = String((char*)readBlockData); data.trim();
  phone_number = data;
  //----------------------------------------------------------------
  ReadDataFromBlock(blocks[4], readBlockData); //address
  data = String((char*)readBlockData); data.trim();
  address = data; data = "";
  //----------------------------------------------------------------
  values = "\"" + student_id + ",";
  values += first_name + ",";
  values += last_name + ",";
  values += phone_number + ",";
  values += address + "\"}";
  //----------------------------------------------------------------*/
  //creating payload - method 2 - More efficient
  for (byte i = 0; i < total_blocks; i++) {
    ReadDataFromBlock(blocks[i], readBlockData);
    //*****************
    if(i == 0){
      data = String((char*)readBlockData);
      data.trim();
      student_id = data;
      values = "\"" + data + ",";
    }
    //*****************
    else if(i == total_blocks-1){
      data = String((char*)readBlockData);
      data.trim();
      values += data + "\"}";
    }
    //*****************
    else{
      data = String((char*)readBlockData);
      data.trim();
      values += data + ",";
    }
  }
  
  //----------------------------------------------------------------
  // Create json object string to send to Google Sheets
  // values = "\"" + value0 + "," + value1 + "," + value2 + "\"}"
  payload = payload_base + values;
  //----------------------------------------------------------------
  lcd.clear();
  lcd.setCursor(0,0); //col=0 row=0
  lcd.print("Mengirim Data");
  lcd.setCursor(0,1); //col=0 row=0
  lcd.print("Tunggu...");
  //----------------------------------------------------------------
  // Publish data to Google Sheets
  Serial.println("Publishing data...");
  Serial.println(payload);
  if(client->POST(url, host, payload)){ 
    // do stuff here if publish was successful
    lcd.clear();
    lcd.setCursor(0,0); //col=0 row=0
    lcd.print("Student ID: "+student_id);
    lcd.setCursor(0,1); //col=0 row=0
    lcd.print("Sukses");
    digitalWrite(BUZZER, HIGH);
    delay(200);
    digitalWrite(BUZZER, LOW);
    delay(200);
    digitalWrite(BUZZER, HIGH);
    delay(200);
    digitalWrite(BUZZER, LOW);
    delay(3000);
  }
  //----------------------------------------------------------------
  else{
    // do stuff here if publish was not successful
    Serial.println("Error while connecting");
    lcd.clear();
    lcd.setCursor(0,0); //col=0 row=0
    lcd.print("Failed.");
    lcd.setCursor(0,1); //col=0 row=0
    lcd.print("Try Again");
  }
  //----------------------------------------------------------------
  // a delay of several seconds is required before publishing again    
  delay(5000);
}

/**********************************
 * ReadDataFromBlock() function
 **********************************/
void ReadDataFromBlock(int blockNum, byte readBlockData[]) 
  //----------------------------------------------------------------------------
  /* Prepare the ksy for authentication */
  /* All keys are set to FFFFFFFFFFFFh at chip delivery from the factory */
  for (byte i = 0; i < 6; i++) {
    key.keyByte[i] = 0xFF;
  }
  //----------------------------------------------------------------------------
  /* Authenticating the desired data block for Read access using Key A */
  status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, blockNum, &key, &(mfrc522.uid));
  //----------------------------------------------------------------------------s
  if (status != MFRC522::STATUS_OK){
     Serial.print("Authentication failed for Read: ");
     Serial.println(mfrc522.GetStatusCodeName(status));
     return;
  }
  //----------------------------------------------------------------------------
  else {
    Serial.println("Authentication success");
  }
  //----------------------------------------------------------------------------
  /* Reading data from the Block */
  status = mfrc522.MIFARE_Read(blockNum, readBlockData, &bufferLen);
  if (status != MFRC522::STATUS_OK) {
    Serial.print("Reading failed: ");
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }
  //----------------------------------------------------------------------------
  else {
    readBlockData[16] = ' ';
    readBlockData[17] = ' ';
    Serial.println("Block was read successfully");  
  }
  //----------------------------------------------------------------------------
}

 Link PPT Materi Presentasi

                       Link Github Monitoring Presensi E-PJE







b

 

 

 

Komentar