Rabu, 07 Oktober 2026

RANCANG BANGUN SISTEM KEAMANAN PASSKEY BERBASIS MIKROKONTROLER ESP32 DENGAN WEB SERVER DAN BASIS DATA MICROSD CARD

 LAPORAN PROYEK INTERNET OF THINGS (IoT)

RANCANG BANGUN SISTEM KEAMANAN PASSKEY

BERBASIS MIKROKONTROLER ESP32 DENGAN

WEB SERVER DAN BASIS DATA MICROSD CARD



(Simulasi Menggunakan Platform Wokwi)




Disusun oleh:

Ubaidillah Maulidul Ula                      24051204115

Ali Syava Ramadhan                           24051204121

Georvin Octianno                               24051204185

Adie Tirta Satria                                  24051204108




BAB I

PENDAHULUAN

1.1  Latar Belakang

Perkembangan teknologi Internet of Things (IoT) telah mengubah cara perangkat elektronik berinteraksi dengan manusia maupun dengan perangkat lain. Melalui IoT, sebuah benda fisik dapat dilengkapi kemampuan komunikasi data sehingga mampu dikendalikan dan dipantau dari jarak jauh. Salah satu penerapan IoT yang paling banyak dijumpai di lingkungan rumah, kantor, maupun laboratorium adalah sistem kendali akses (access control), yaitu sistem yang membatasi siapa saja yang boleh memasuki atau menggunakan suatu fasilitas.

Sistem kendali akses konvensional umumnya masih mengandalkan kunci mekanis yang mudah hilang, mudah diduplikasi, dan tidak meninggalkan catatan siapa yang mengaksesnya. Permasalahan tersebut dapat diatasi dengan sistem kendali akses elektronik berbasis mikrokontroler. Pengguna cukup memasukkan sepasang kredensial berupa key dan password, kemudian sistem memverifikasi kredensial tersebut terhadap data yang tersimpan dan memberikan umpan balik secara langsung.

Pada proyek ini digunakan mikrokontroler ESP32 sebagai pusat kendali sistem. ESP32 dipilih karena telah dilengkapi modul Wi-Fi dan Bluetooth terintegrasi, memiliki daya komputasi yang memadai, serta harganya relatif terjangkau. Kemampuan Wi-Fi ESP32 dimanfaatkan untuk membangun access point sekaligus web server mandiri, sehingga pengguna dapat melakukan proses verifikasi melalui peramban pada telepon genggam atau komputer tanpa memerlukan jaringan internet maupun server eksternal.

Data kredensial tidak ditanamkan langsung di dalam kode program, melainkan disimpan pada modul MicroSD Card dalam bentuk berkas paskey.csv. Pendekatan ini membuat daftar pengguna dapat ditambah, diubah, atau dihapus tanpa perlu mengunggah ulang program ke mikrokontroler. Sebagai penanda keberhasilan verifikasi, sistem dilengkapi buzzer yang akan berbunyi selama satu detik setiap kali kredensial yang dimasukkan dinyatakan valid.

Agar perancangan dapat diuji tanpa terkendala ketersediaan perangkat keras, seluruh rangkaian dan program disimulasikan terlebih dahulu menggunakan platform Wokwi. Wokwi merupakan simulator elektronika berbasis web yang mendukung ESP32 beserta berbagai modul pendukungnya, sehingga kesalahan perancangan dapat ditemukan lebih awal sebelum sistem diwujudkan dalam bentuk perangkat keras nyata.

1.2  Rumusan Masalah

Berdasarkan latar belakang di atas, rumusan masalah dalam penulisan laporan ini adalah sebagai berikut.

  1. Bagaimana merancang rangkaian sistem keamanan passkey berbasis ESP32 yang terhubung dengan modul MicroSD Card dan buzzer?

  2. Bagaimana membangun access point dan web server pada ESP32 agar pengguna dapat mengirimkan kredensial melalui antarmuka web?

  3. Bagaimana proses pembacaan dan pencocokan data kredensial pada berkas paskey.csv yang tersimpan di dalam MicroSD Card?

  4. Bagaimana unjuk kerja sistem dalam membedakan kredensial yang valid dan kredensial yang tidak valid berdasarkan hasil pengujian?

1.3  Tujuan

Tujuan yang hendak dicapai melalui proyek ini adalah sebagai berikut.

  1. Merancang dan mensimulasikan rangkaian sistem keamanan passkey berbasis mikrokontroler ESP32 pada platform Wokwi.

  2. Mengimplementasikan access point dan web server asinkron pada ESP32 sebagai antarmuka masukan kredensial.

  3. Memanfaatkan modul MicroSD Card sebagai media penyimpanan basis data kredensial dalam format CSV.

  4. Menguji keberhasilan sistem dalam memverifikasi kredensial serta mengaktifkan buzzer sebagai indikator akses yang diterima.

1.4  Batasan Masalah

Agar pembahasan tetap terarah, penulisan laporan ini dibatasi pada hal-hal berikut.

  1. Sistem dibangun dan diuji sepenuhnya dalam bentuk simulasi pada platform Wokwi, belum diimplementasikan pada perangkat keras nyata.

  2. Mikrokontroler yang digunakan adalah ESP32 DevKit C V4 dengan modul MicroSD Card dan buzzer pasif sebagai komponen pendukung.

  3. Basis data kredensial berupa satu berkas paskey.csv yang berisi 23 pasang key dan password dan bersifat statis, yaitu tidak dapat ditambah atau diubah melalui antarmuka web.

  4. ESP32 bekerja dalam mode WIFI_AP (jaringan lokal mandiri) sehingga sistem tidak terhubung ke jaringan internet.

  5. Aspek kriptografi, penyandian kata sandi, dan pengamanan jalur komunikasi tidak menjadi fokus pembahasan, namun dibahas secara singkat sebagai bahan evaluasi.

1.5  Manfaat

Hasil dari proyek ini diharapkan dapat memberikan manfaat sebagai berikut.

  1. Bagi penulis, menambah pemahaman mengenai pemrograman mikrokontroler ESP32, komunikasi SPI, serta pembangunan web server pada perangkat tertanam.

  2. Bagi pembaca, menjadi rujukan dalam merancang sistem kendali akses sederhana berbasis IoT beserta penyimpanan datanya.

  3. Bagi pengembangan selanjutnya, menjadi dasar pengembangan sistem keamanan yang lebih lengkap, misalnya dengan penambahan RFID, pencatatan log akses, atau penyandian kata sandi.



BAB II

TINJAUAN PUSTAKA

2.1  Internet of Things (IoT)

Internet of Things (IoT) adalah konsep yang menggambarkan jaringan benda-benda fisik yang ditanami perangkat elektronik, perangkat lunak, sensor, dan konektivitas jaringan sehingga mampu mengumpulkan serta bertukar data. Istilah ini pertama kali dipopulerkan oleh Kevin Ashton pada tahun 1999 dalam konteks rantai pasok berbasis RFID, dan kini berkembang luas ke bidang rumah pintar, kesehatan, pertanian, hingga sistem keamanan.

Secara umum arsitektur sistem IoT terdiri atas tiga lapisan, yaitu lapisan perangkat (sensor dan aktuator), lapisan jaringan (protokol komunikasi), dan lapisan aplikasi (antarmuka pengguna). Pada proyek ini, modul MicroSD Card dan masukan pengguna berperan sebagai sumber data, Wi-Fi berperan sebagai lapisan jaringan, sedangkan halaman web yang disajikan ESP32 berperan sebagai lapisan aplikasi.

2.2  Mikrokontroler ESP32

ESP32 merupakan sistem-on-chip (SoC) produksi Espressif Systems yang mengintegrasikan prosesor Xtensa LX6 dua inti berkecepatan hingga 240 MHz, memori SRAM internal sebesar 520 KB, modul Wi-Fi 802.11 b/g/n, serta Bluetooth v4.2. Kelengkapan tersebut menjadikan ESP32 banyak digunakan pada proyek IoT karena tidak lagi memerlukan modul komunikasi tambahan.

Papan pengembangan yang digunakan pada proyek ini adalah ESP32 DevKit C V4. Papan ini menyediakan sejumlah pin GPIO yang dapat difungsikan sebagai masukan maupun keluaran digital, serta mendukung berbagai antarmuka komunikasi seperti UART, I2C, dan SPI. Tegangan kerja ESP32 adalah 3,3 volt sehingga seluruh modul yang terhubung harus bekerja pada tingkat tegangan yang sama.

ESP32 dapat bekerja dalam tiga mode jaringan, yaitu WIFI_STA (terhubung ke jaringan Wi-Fi yang sudah ada), WIFI_AP (membuat jaringan Wi-Fi sendiri), dan WIFI_AP_STA (gabungan keduanya). Pada proyek ini digunakan mode WIFI_AP sehingga ESP32 memancarkan jaringannya sendiri dengan alamat IP bawaan 192.168.4.1.

Gambar 2.1  Papan ESP32 DevKit C V4 pada simulator Wokwi

2.3  Modul MicroSD Card dan Protokol SPI

MicroSD Card adalah media penyimpanan non-volatil berkapasitas besar yang datanya tetap tersimpan meskipun catu daya diputus. Modul MicroSD Card menyediakan dudukan kartu beserta rangkaian antarmuka agar kartu dapat diakses oleh mikrokontroler melalui protokol SPI (Serial Peripheral Interface).

SPI merupakan protokol komunikasi serial sinkron dengan arsitektur master-slave yang menggunakan empat jalur utama, yaitu SCK (Serial Clock) sebagai sumber pulsa detak, MOSI atau DI (Master Out Slave In) untuk pengiriman data dari master ke slave, MISO atau DO (Master In Slave Out) untuk arah sebaliknya, dan CS atau SS (Chip Select) untuk memilih perangkat slave yang sedang diajak berkomunikasi.

Pada lingkungan Arduino, akses terhadap kartu SD difasilitasi oleh pustaka SD.h yang bekerja di atas lapisan sistem berkas FS.h. Pustaka ini menyediakan fungsi untuk membuka, membaca, menulis, dan menutup berkas dengan pola penggunaan yang menyerupai operasi berkas pada komputer.

Gambar 2.2  Modul MicroSD Card dengan antarmuka SPI

2.4  Buzzer

Buzzer adalah komponen keluaran yang mengubah sinyal listrik menjadi getaran suara. Buzzer pasif memerlukan sinyal berfrekuensi tertentu agar dapat berbunyi, sehingga nada yang dihasilkan dapat diatur melalui program. Pada lingkungan Arduino, pembangkitan nada dilakukan menggunakan fungsi tone() dengan parameter berupa nomor pin dan frekuensi dalam satuan hertz, sedangkan fungsi noTone() digunakan untuk menghentikannya.

Dalam sistem keamanan, buzzer umumnya difungsikan sebagai indikator audio untuk memberi tahu pengguna bahwa suatu peristiwa telah terjadi, misalnya akses diterima, akses ditolak, atau terjadi gangguan pada sistem.

Gambar 2.3  Buzzer sebagai indikator audio

2.5  Access Point dan Web Server pada ESP32

Access point adalah perangkat yang memancarkan jaringan nirkabel sehingga perangkat lain dapat terhubung kepadanya. ESP32 mampu berperan sebagai access point melalui fungsi WiFi.softAP() dengan parameter berupa nama jaringan (SSID) dan kata sandi. Setelah jaringan aktif, setiap perangkat yang terhubung akan memperoleh alamat IP dari ESP32.

Di atas jaringan tersebut dijalankan web server yang bertugas menerima permintaan HTTP dan mengirimkan tanggapan berupa halaman web. Proyek ini menggunakan pustaka ESPAsyncWebServer yang bekerja di atas pustaka AsyncTCP. Berbeda dengan web server sinkron bawaan, server asinkron tidak menghentikan jalannya program ketika menunggu permintaan masuk, melainkan menanganinya melalui mekanisme callback. Dengan demikian, fungsi loop() tetap dapat menjalankan tugas lain, misalnya memantau durasi nyala buzzer.

Permintaan ditangani melalui metode server.on() yang memetakan sebuah alamat (endpoint) ke fungsi penanganannya. Nilai yang dikirim pengguna melalui formulir dapat dibaca menggunakan request->getParam(), sedangkan tanggapan dikirimkan melalui request->send().

2.6  Format Comma Separated Values (CSV)

Comma Separated Values (CSV) adalah format berkas teks sederhana untuk menyimpan data tabel. Setiap baris berkas mewakili satu rekaman data, sedangkan setiap kolom dipisahkan oleh tanda koma. Aturan umum format ini dibakukan dalam RFC 4180. Karena berupa teks biasa, berkas CSV berukuran kecil, mudah dibaca manusia, dan dapat diproses dengan operasi string sederhana tanpa memerlukan mesin basis data.

Keterbatasan format CSV adalah tidak adanya indeks, sehingga pencarian data dilakukan secara berurutan dari baris pertama hingga baris yang dicari ditemukan. Untuk jumlah data yang relatif sedikit seperti pada proyek ini, keterbatasan tersebut tidak menimbulkan masalah berarti.

2.7  Simulator Wokwi

Wokwi adalah simulator elektronika berbasis web yang memungkinkan perancangan rangkaian sekaligus pengujian program tanpa perangkat keras fisik. Wokwi mendukung berbagai papan mikrokontroler, antara lain Arduino Uno, ESP32, dan Raspberry Pi Pico, serta menyediakan komponen pendukung seperti sensor, layar, modul MicroSD Card, dan buzzer.

Rangkaian pada Wokwi dijelaskan melalui berkas diagram.json yang memuat daftar komponen beserta hubungan antar pinnya, sedangkan pustaka eksternal didaftarkan pada berkas libraries.txt. Wokwi juga menyediakan Serial Monitor untuk memantau keluaran program dan mengirimkan masukan, serta memungkinkan pengguna mengunggah berkas ke dalam kartu SD virtual.



BAB III

PEMBAHASAN

3.1  Alat dan Bahan

Komponen yang digunakan dalam perancangan sistem beserta fungsinya masing-masing disajikan pada Tabel 3.1. Seluruh komponen tersedia pada pustaka komponen simulator Wokwi.

Tabel 3.1  Daftar alat dan bahan

No

Komponen

Jumlah

Fungsi

1

ESP32 DevKit C V4

1 buah

Pusat kendali sistem, penyedia access point dan web server

2

Modul MicroSD Card

1 buah

Media penyimpanan berkas basis data paskey.csv

3

Buzzer

1 buah

Indikator audio ketika kredensial dinyatakan valid

4

Kabel jumper

10 jalur

Penghubung antarpin komponen

5

Simulator Wokwi

1 proyek

Lingkungan simulasi rangkaian dan program

6

Arduino IDE / Wokwi Editor

1 unit

Perangkat lunak penulisan dan kompilasi program


Selain komponen perangkat keras, sistem memerlukan tiga pustaka eksternal yang didaftarkan pada berkas libraries.txt, yaitu pustaka SD untuk pengaksesan kartu memori, serta Async TCP dan ESP Async WebServer untuk pembangunan web server asinkron.

3.2  Perancangan Sistem

Sistem dirancang mengikuti pola masukan-proses-keluaran. Masukan sistem berupa pasangan key dan password yang dikirimkan pengguna, baik melalui formulir pada halaman web maupun melalui perintah teks pada Serial Monitor. Masukan tersebut kemudian diproses oleh ESP32 dengan cara membandingkannya terhadap data yang terbaca dari berkas pada MicroSD Card. Hasil pembandingan ditampilkan sebagai halaman web dan pesan pada Serial Monitor, serta diwujudkan dalam bentuk bunyi buzzer apabila kredensial dinyatakan valid.

Gambar 3.1  Blok diagram sistem keamanan passkey berbasis ESP32

3.3  Perancangan Rangkaian

Rangkaian sistem terdiri atas tiga komponen utama yang seluruhnya terhubung langsung ke papan ESP32. Modul MicroSD Card dihubungkan melalui antarmuka SPI menggunakan enam jalur, sedangkan buzzer cukup memerlukan dua jalur, yaitu satu jalur sinyal dan satu jalur pentanahan. Catu daya modul MicroSD Card diambil dari pin 3V3 ESP32 karena modul bekerja pada tegangan 3,3 volt.

Gambar 3.2  Rangkaian sistem pada simulator Wokwi

Hubungan antarpin secara rinci ditampilkan pada Tabel 3.2.

Tabel 3.2  Konfigurasi hubungan antarpin

No

Pin ESP32

Terhubung ke

Keterangan

1

GPIO 4

SD Card - CS

Chip Select, pemilih modul kartu SD

2

GPIO 23

SD Card - DI (MOSI)

Jalur data dari ESP32 menuju kartu SD

3

GPIO 19

SD Card - DO (MISO)

Jalur data dari kartu SD menuju ESP32

4

GPIO 18

SD Card - SCK

Jalur pulsa detak komunikasi SPI

5

3V3

SD Card - VCC

Catu daya modul sebesar 3,3 volt

6

GND

SD Card - GND

Pentanahan modul kartu SD

7

GPIO 26

Buzzer - pin 1

Keluaran sinyal nada menuju buzzer

8

GND

Buzzer - pin 2

Pentanahan buzzer

9

TX / RX

Serial Monitor

Komunikasi UART pada 115200 bps


Konfigurasi tersebut tersimpan pada berkas diagram.json milik proyek Wokwi dengan isi bagian hubungan sebagai berikut.

Kutipan berkas diagram.json

"connections": [

  [ "esp:TX",    "$serialMonitor:RX", "",      [] ],

  [ "esp:RX",    "$serialMonitor:TX", "",      [] ],

  [ "esp:4",     "sd1:CS",            "green", [ "h30", "v30"   ] ],

  [ "esp:23",    "sd1:DI",            "green", [ "h40", "v10"   ] ],

  [ "esp:19",    "sd1:DO",            "green", [ "h50", "v-10"  ] ],

  [ "esp:18",    "sd1:SCK",           "green", [ "h60", "v-30"  ] ],

  [ "esp:3V3",   "sd1:VCC",           "red",   [ "h70", "v-50"  ] ],

  [ "esp:GND.1", "sd1:GND",           "black", [ "h80", "v-70"  ] ],

  [ "esp:26",    "bz1:1",             "red",   [ "h90", "v-100" ] ],

  [ "esp:GND.2", "bz1:2",             "black", [ "h100","v-120" ] ]

]

3.4  Perancangan Basis Data paskey.csv

Basis data kredensial disimpan pada berkas paskey.csv yang diletakkan di direktori utama kartu SD. Berkas ini memuat 23 baris data dengan tiga kolom pada setiap barisnya dan tidak menggunakan baris judul. Struktur kolomnya dijelaskan pada Tabel 3.3.

Tabel 3.3  Struktur kolom berkas paskey.csv

Kolom

Nama

Contoh isi

Keterangan

1

id

2

Nomor urut rekaman, tidak digunakan dalam proses pencocokan

2

key

YLv2EAI

Kunci akses sepanjang 7 karakter alfanumerik

3

pass

fI5cWX1

Kata sandi sepanjang 7 karakter alfanumerik


Cuplikan isi berkas tersebut ditampilkan berikut ini.

Isi berkas paskey.csv (dipersingkat)

0,TYVYIRT, JbEiufs

1,GNdZ3cL, bgakSpN

2,YLv2EAI, fI5cWX1

3,CCBjEmz,mxp6Zt0

4,QONng10, qIQulik

5,33NY7PN, 0oGvNtm

...

20,aBXLaSy, XKRz6Xj

21,LbA5fhw, vc15NVW

22,uu7zBnT,JSZdnIA


Sebagian baris memiliki spasi setelah tanda koma, misalnya 0,TYVYIRT, JbEiufs. Ketidakseragaman penulisan ini ditangani di dalam program menggunakan metode trim() yang menghapus spasi di awal dan akhir setiap potongan teks sebelum dibandingkan, sehingga tidak menyebabkan kegagalan pencocokan.

3.5  Diagram Alir Program

Alur kerja program secara keseluruhan digambarkan pada Gambar 3.3. Program diawali dengan proses inisialisasi, dilanjutkan dengan pembentukan jaringan dan web server, kemudian memasuki keadaan menunggu permintaan login secara berulang.

Gambar 3.3  Diagram alir program sistem keamanan passkey

3.6  Implementasi Program

Program ditulis dalam bahasa C++ pada kerangka kerja Arduino. Pembahasan berikut membagi program menjadi enam bagian sesuai urutan penulisannya. Penulisan bagian CSS pada halaman web ditata ulang menjadi beberapa baris agar seluruh kode tetap terbaca pada lebar halaman laporan, tanpa mengubah maknanya.

3.6.1  Pustaka, Konstanta, dan Variabel Global

Bagian pertama memuat pemanggilan pustaka, penetapan nomor pin, identitas jaringan, objek web server, serta variabel penanda status buzzer.

Program 3.1  Deklarasi pustaka dan variabel global

#include <WiFi.h>

#include <FS.h>

#include <SD.h>

#include <AsyncTCP.h>

#include <ESPAsyncWebServer.h>

 

#define CS_PIN 4

#define BUZZER_PIN 26

 

const char* ssid = "ESP32-PASSKEY";

const char* password = "12345678";

 

AsyncWebServer server(80);

 

bool buzzerActive = false;

unsigned long buzzerStartTime = 0;


Konstanta CS_PIN bernilai 4 menunjuk pin Chip Select kartu SD, sedangkan BUZZER_PIN bernilai 26 menunjuk pin keluaran buzzer. Objek server dibuat pada porta 80 yang merupakan porta baku layanan HTTP. Variabel buzzerActive dan buzzerStartTime digunakan untuk mengatur lama nyala buzzer tanpa menggunakan delay(), sehingga program tetap mampu menanggapi permintaan lain selama buzzer berbunyi.

3.6.2  Halaman Web Antarmuka Pengguna

Halaman web disimpan sebagai sebuah larik karakter bernama index_html. Kata kunci PROGMEM menempatkan data tersebut pada memori program (flash) sehingga tidak membebani RAM, sedangkan notasi R"rawliteral( ... )rawliteral" memungkinkan penulisan HTML secara apa adanya tanpa perlu karakter pelarian.

Program 3.2  Halaman web formulir login

const char index_html[] PROGMEM = R"rawliteral(

<!DOCTYPE HTML><html>

<head>

  <title>ESP32 Security WebServer</title>

  <meta name="viewport"

        content="width=device-width, initial-scale=1">

  <style>

    body {

      font-family: Arial, sans-serif;

      text-align: center;

      margin-top: 50px;

    }

    .form-container {

      display: inline-block; padding: 20px;

      border: 1px solid #ccc; border-radius: 10px;

      background-color: #f9f9f9;

    }

    input[type=text], input[type=password] {

      padding: 10px; margin: 10px 0;

      border-radius: 5px; border: 1px solid #aaa;

      width: 80%;

    }

    input[type=submit] {

      background-color: #4CAF50; color: white;

      border: none; padding: 10px 20px;

      cursor: pointer; border-radius: 5px;

      font-size: 16px;

    }

    input[type=submit]:hover {

      background-color: #45a049;

    }

  </style>

</head>

<body>

  <h2>ESP32 WebServer - Passkey</h2>

  <div class="form-container">

    <form action="/login" method="GET">

      <label><b>Key:</b></label><br>

      <input type="text" name="key" required><br>

      <label><b>Pass:</b></label><br>

      <input type="password" name="pass" required><br>

      <input type="submit" value="Submit">

    </form>

  </div>

</body>

</html>

)rawliteral";


Formulir pada halaman tersebut mengirimkan data ke alamat /login menggunakan metode GET dengan dua medan masukan, yaitu key bertipe teks dan pass bertipe kata sandi. Atribut required memastikan kedua medan tidak dapat dikirimkan dalam keadaan kosong.



3.6.3  Fungsi checkCredentials()

Fungsi ini merupakan inti proses verifikasi. Fungsi membuka berkas pada kartu SD, membaca isinya baris demi baris, memisahkan setiap baris berdasarkan tanda koma, lalu membandingkan kolom kedua dan ketiga dengan masukan pengguna.

Program 3.3  Fungsi verifikasi kredensial

bool checkCredentials(String inputKey, String inputPass) {

  File file = SD.open("/paskey.csv");

 

  if (!file) {

    Serial.println("Gagal membuka paskey.csv di SD Card!");

    return false;

  }

 

  while (file.available()) {

    String line = file.readStringUntil('\n');

    line.trim();

 

    if (line.length() == 0) continue;

 

    int firstComma = line.indexOf(',');

    int secondComma = line.indexOf(',', firstComma + 1);

 

    if (firstComma > 0 && secondComma > firstComma) {

      String csvKey = line.substring(firstComma + 1, secondComma);

      String csvPass = line.substring(secondComma + 1);

 

      csvKey.trim();

      csvPass.trim();

 

      if (csvKey == inputKey && csvPass == inputPass) {

        file.close();

        return true;

      }

    }

  }

 

  file.close();

  return false;

}


Pemisahan kolom dilakukan dengan mencari posisi koma pertama dan koma kedua melalui metode indexOf(), kemudian memotong teks di antaranya menggunakan substring(). Apabila ditemukan baris yang cocok, berkas langsung ditutup dan fungsi mengembalikan nilai true sehingga pembacaan tidak perlu dilanjutkan sampai baris terakhir. Jika seluruh baris telah diperiksa tanpa menemukan kecocokan, fungsi mengembalikan nilai false.

3.6.4  Fungsi setup()

Fungsi setup() dijalankan satu kali pada saat sistem dinyalakan. Bagian awalnya melakukan inisialisasi komunikasi serial, pin buzzer, kartu SD, dan access point.

Program 3.4  Inisialisasi sistem dan access point

void setup() {

  delay(1000); // Wajib ada agar terminal tidak blank

  Serial.begin(115200);

  Serial.println("\n--- Sistem Menyala ---");

 

  pinMode(BUZZER_PIN, OUTPUT);

  digitalWrite(BUZZER_PIN, LOW);

 

  Serial.println("Menginisialisasi SD card...");

  if (!SD.begin(CS_PIN)) {

    Serial.println("Inisialisasi SD Card GAGAL!");

    return;

  }

  Serial.println("SD Card berhasil diinisialisasi.");

 

  Serial.println("=======================");

  Serial.println("Membuat Access Point...");

 

  WiFi.mode(WIFI_AP);

  WiFi.softAP(ssid, password);

 

  Serial.println("Access Point berhasil dibuat!");

  Serial.print("SSID: ");

  Serial.println(ssid);

  Serial.print("Password: ");

  Serial.println(password);

  Serial.print("IP Address: ");

  Serial.println(WiFi.softAPIP());


Perintah delay(1000) di awal fungsi diperlukan agar terminal serial sempat siap sebelum pesan pertama dikirimkan. Apabila SD.begin() gagal, program menampilkan pesan kesalahan lalu menjalankan return sehingga sisa proses inisialisasi, termasuk pengaktifan web server, tidak dilaksanakan. Setelah kartu SD terbaca, ESP32 diatur ke mode WIFI_AP dan memancarkan jaringan dengan SSID ESP32-PASSKEY. Alamat IP yang diperoleh ditampilkan melalui WiFi.softAPIP() dan secara baku bernilai 192.168.4.1.

Bagian berikutnya mendaftarkan dua alamat layanan serta menjalankan web server.

Program 3.5  Pendaftaran endpoint dan penjalanan web server

  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){

    request->send_P(200, "text/html", index_html);

  });

 

  server.on("/login", HTTP_GET, [](AsyncWebServerRequest *request){

    String inputKey, inputPass;

 

    if (request->hasParam("key") && request->hasParam("pass")) {

      inputKey = request->getParam("key")->value();

      inputPass = request->getParam("pass")->value();

 

      if (checkCredentials(inputKey, inputPass)) {

        buzzerActive = true;

        buzzerStartTime = millis();

 

        request->send(

          200,

          "text/html",

          "<h1>Access Granted!</h1><a href='/'>Kembali</a>"

        );

      } else {

        request->send(

          200,

          "text/html",

          "<h1>Wrong Pass or Key!</h1><a href='/'>Coba Lagi</a>"

        );

      }

    } else {

      request->send(400, "text/plain", "Parameter tidak lengkap");

    }

  });

 

  server.begin();

 

  Serial.println("WebServer berhasil dijalankan!");


Alamat / menyajikan halaman formulir, sedangkan alamat /login menangani proses verifikasi. Program terlebih dahulu memastikan kedua parameter tersedia melalui hasParam(). Jika kredensial dinyatakan valid, variabel buzzerActive diubah menjadi true dan waktu mulai dicatat melalui millis(), kemudian halaman balasan Access Granted dikirimkan. Jika tidak valid, halaman Wrong Pass or Key yang dikirimkan tanpa mengaktifkan buzzer. Apabila parameter tidak lengkap, server membalas dengan kode status HTTP 400.

3.6.5  Fungsi testLogin()

Fungsi testLogin() menyediakan jalur pengujian melalui Serial Monitor sehingga verifikasi dapat dilakukan tanpa membuka peramban. Fungsi ini menampilkan kredensial yang diuji beserta hasilnya dalam format yang mudah dibaca.

Program 3.6  Fungsi pengujian melalui Serial Monitor

void testLogin(String inputKey, String inputPass) {

  Serial.println();

  Serial.println("=== LOGIN REQUEST ===");

 

  Serial.print("Key  : ");

  Serial.println(inputKey);

 

  Serial.print("Pass : ");

  Serial.println(inputPass);

 

  if (checkCredentials(inputKey, inputPass)) {

    buzzerActive = true;

    buzzerStartTime = millis();

 

    Serial.println("Access Granted!");

    Serial.println("Buzzer aktif selama 1 detik.");

  } else {

    Serial.println("Wrong Pass or Key!");

    Serial.println("Buzzer tidak aktif.");

  }

 

  Serial.println("=====================");


3.6.6  Fungsi loop()

Fungsi loop() dijalankan berulang kali dan menangani dua tugas, yaitu pembacaan perintah dari Serial Monitor serta pengaturan lama nyala buzzer.

Program 3.7  Pembacaan perintah serial dan pengendalian buzzer

void loop() {

  if (Serial.available()) {

    String command = Serial.readStringUntil('\n');

    command.trim();

 

    if (command.startsWith("LOGIN ")) {

      command.remove(0, 6);

 

      int separator = command.indexOf(' ');

 

      if (separator > 0) {

        String inputKey = command.substring(0, separator);

        String inputPass = command.substring(separator + 1);

 

        testLogin(inputKey, inputPass);

      } else {

        Serial.println("Format salah!");

        Serial.println("Gunakan: LOGIN key password");

      }

    }

  }

 

  if (buzzerActive) {

    digitalWrite(BUZZER_PIN, HIGH);

    tone(BUZZER_PIN, 1000);

 

    if (millis() - buzzerStartTime >= 1000) {

      digitalWrite(BUZZER_PIN, LOW);

      buzzerActive = false;

      noTone(BUZZER_PIN);

      Serial.println("Buzzer OFF");

    }

  }

}

Perintah yang diterima harus berawalan LOGIN  diikuti key dan password yang dipisahkan satu spasi, misalnya LOGIN YLv2EAI fI5cWX1. Metode remove(0, 6) menghapus awalan perintah, kemudian posisi spasi pembatas dicari untuk memisahkan kedua nilai. Pengaturan buzzer memanfaatkan selisih antara waktu saat ini dan buzzerStartTime. Ketika selisihnya mencapai 1000 milidetik, buzzer dimatikan dan penandanya dikembalikan ke keadaan semula. Pendekatan tanpa delay() ini menjaga agar web server tetap tanggap selama buzzer berbunyi.

3.7  Hasil Pengujian

Pengujian dilakukan pada simulator Wokwi melalui dua jalur masukan, yaitu Serial Monitor dan antarmuka web. Kredensial yang digunakan sebagai contoh uji adalah pasangan key YLv2EAI dengan password fI5cWX1 yang tercatat pada baris ketiga berkas paskey.csv.

3.7.1  Pengujian melalui Serial Monitor

Pada saat simulasi dijalankan, Serial Monitor menampilkan rangkaian pesan inisialisasi yang menandakan kartu SD berhasil dibaca, access point berhasil dibentuk, dan web server berhasil dijalankan. Pengujian login kemudian dilakukan dengan mengirimkan perintah LOGIN beserta kredensialnya.

Gambar 3.4  Keluaran Serial Monitor pada proses inisialisasi dan pengujian login

Hasil pada Gambar 3.4 memperlihatkan bahwa kredensial yang benar menghasilkan pesan Access Granted disertai aktifnya buzzer selama satu detik, sedangkan kredensial dengan password yang keliru menghasilkan pesan Wrong Pass or Key tanpa mengaktifkan buzzer. Pesan Buzzer OFF yang muncul setelahnya membuktikan bahwa mekanisme penghitungan waktu pada fungsi loop() berjalan sebagaimana mestinya.

3.7.2  Pengujian melalui Antarmuka Web

Pengujian berikutnya dilakukan dengan menghubungkan perangkat ke jaringan ESP32-PASSKEY, kemudian membuka alamat 192.168.4.1 pada peramban. Halaman formulir login tampil sesuai rancangan seperti terlihat pada Gambar 3.5.

Gambar 3.5  Tampilan halaman formulir login

Setelah tombol Submit ditekan, peramban mengirimkan permintaan ke alamat /login beserta kedua parameternya. Tanggapan yang diterima untuk kredensial yang valid dan tidak valid ditampilkan pada Gambar 3.6.

Gambar 3.6  Halaman tanggapan untuk kredensial valid (atas) dan tidak valid (bawah)

3.7.3  Rekapitulasi Hasil Pengujian

Rekapitulasi seluruh skenario pengujian beserta hasilnya disajikan pada Tabel 3.4.

Tabel 3.4  Hasil pengujian sistem

No

Skenario Pengujian

Masukan

Hasil yang Diperoleh

Ket.

1

Inisialisasi kartu SD

-

Pesan SD Card berhasil diinisialisasi

Sesuai

2

Pembentukan access point

-

SSID ESP32-PASSKEY aktif, IP 192.168.4.1

Sesuai

3

Akses halaman utama

Alamat /

Halaman formulir login tampil

Sesuai

4

Login dengan kredensial benar

YLv2EAI /

fI5cWX1

Access Granted, buzzer berbunyi 1 detik

Sesuai

5

Login dengan password salah

YLv2EAI /

salah123

Wrong Pass or Key, buzzer mati

Sesuai

6

Login dengan key tidak terdaftar

ABCD123 /

fI5cWX1

Wrong Pass or Key, buzzer mati

Sesuai

7

Parameter tidak lengkap

Alamat

/login?key=X

Kode status 400, pesan Parameter tidak lengkap

Sesuai

8

Login melalui Serial Monitor

LOGIN YLv2EAI fI5cWX1

Access Granted, buzzer berbunyi 1 detik

Sesuai

9

Perintah serial salah format

LOGIN abc

Pesan Format salah! disertai petunjuk penggunaan

Sesuai

10

Durasi nyala buzzer

-

Buzzer mati otomatis, muncul pesan Buzzer OFF

Sesuai


Berdasarkan sepuluh skenario tersebut, seluruh pengujian memberikan hasil yang sesuai dengan rancangan. Sistem mampu membedakan kredensial yang terdaftar dan yang tidak terdaftar, baik melalui antarmuka web maupun melalui Serial Monitor.

3.8  Analisis dan Pembahasan

Hasil pengujian menunjukkan bahwa rancangan sistem telah berfungsi sesuai tujuan. Meskipun demikian, terdapat beberapa catatan teknis yang perlu diperhatikan apabila sistem hendak diterapkan pada kondisi sesungguhnya.

  1. Penyimpanan kata sandi dalam bentuk teks terbuka. Seluruh password pada berkas paskey.csv tersimpan apa adanya, sehingga siapa pun yang dapat mengakses kartu SD secara fisik akan langsung mengetahui semua kredensial. Praktik yang dianjurkan adalah menyimpan nilai ringkas (hash) seperti SHA-256 beserta salt, lalu membandingkan hasil peringkasan masukan pengguna dengan nilai yang tersimpan.

  2. Penggunaan metode HTTP GET. Karena formulir dikirim dengan metode GET, pasangan key dan password ikut tampil pada baris alamat peramban dan tersimpan pada riwayat penjelajahan. Metode POST lebih tepat untuk pengiriman data sensitif, dan idealnya dilengkapi dengan jalur terenkripsi.

  3. Tidak adanya pembatasan percobaan masuk. Sistem menerima percobaan login dalam jumlah tak terbatas sehingga rentan terhadap serangan coba-coba (brute force). Penambahan jeda waktu atau penguncian sementara setelah beberapa kali kegagalan dapat mengurangi risiko tersebut.

  4. Pencarian data secara berurutan. Proses pencocokan membaca berkas dari baris pertama hingga ditemukan kecocokan, sehingga waktu pencarian meningkat seiring bertambahnya jumlah data. Untuk 23 baris data hal ini belum terasa, namun akan menjadi hambatan apabila jumlah penggunanya mencapai ribuan.

  5. Perilaku sistem ketika kartu SD gagal terbaca. Kegagalan inisialisasi menyebabkan fungsi setup() berhenti lebih awal sehingga access point dan web server tidak pernah dijalankan, sementara fungsi loop() tetap berjalan tanpa dapat melakukan verifikasi. Sistem sebaiknya dilengkapi penanda kegagalan, misalnya pola bunyi buzzer tertentu, agar kondisi ini mudah dikenali pengguna.

  6. Pengendalian buzzer yang berulang. Perintah digitalWrite() dan tone() dipanggil pada setiap iterasi loop selama buzzer aktif, padahal cukup dipanggil satu kali saat buzzer mulai dibunyikan. Pemanggilan berulang ini tidak menimbulkan kesalahan, namun kurang efisien dan dapat disederhanakan.

  7. Keterbatasan lingkungan simulasi. Pengujian dilakukan pada simulator sehingga belum memperhitungkan faktor nyata seperti kualitas kartu SD, gangguan sinyal Wi-Fi, maupun kestabilan catu daya. Berkas paskey.csv juga perlu diunggah terlebih dahulu ke kartu SD virtual agar simulasi dapat berjalan.

BAB IV

PENUTUP

4.1  Kesimpulan

Berdasarkan hasil perancangan, implementasi, dan pengujian yang telah dilakukan, dapat ditarik beberapa kesimpulan sebagai berikut.

  1. Sistem keamanan passkey berbasis ESP32 berhasil dirancang dan disimulasikan pada platform Wokwi dengan menggunakan modul MicroSD Card sebagai media penyimpanan data dan buzzer sebagai indikator audio. Modul MicroSD Card terhubung melalui antarmuka SPI pada pin GPIO 4, 18, 19, dan 23, sedangkan buzzer terhubung pada pin GPIO 26.

  2. ESP32 berhasil difungsikan sebagai access point dengan SSID ESP32-PASSKEY sekaligus sebagai web server asinkron pada porta 80. Pengguna dapat mengakses halaman formulir login melalui alamat 192.168.4.1 tanpa memerlukan sambungan internet.

  3. Proses verifikasi berjalan dengan membaca berkas paskey.csv baris demi baris, memisahkan kolom berdasarkan tanda koma, lalu membandingkan kolom key dan password dengan masukan pengguna. Penggunaan metode trim() terbukti mampu mengatasi ketidakseragaman penulisan spasi pada berkas CSV.

  4. Hasil sepuluh skenario pengujian menunjukkan seluruh fungsi berjalan sesuai rancangan. Kredensial yang valid menghasilkan tanggapan Access Granted disertai bunyi buzzer selama satu detik, sedangkan kredensial yang tidak valid menghasilkan tanggapan Wrong Pass or Key tanpa membunyikan buzzer.

  5. Pengendalian durasi buzzer menggunakan fungsi millis() tanpa delay() memungkinkan web server tetap tanggap menerima permintaan baru selama buzzer berbunyi.

4.2  Saran

Beberapa saran yang dapat dipertimbangkan untuk pengembangan sistem pada tahap selanjutnya adalah sebagai berikut.

  1. Kata sandi sebaiknya disimpan dalam bentuk nilai ringkas (hash) beserta salt, bukan dalam bentuk teks terbuka, agar kredensial tetap aman meskipun kartu SD berpindah tangan.

  2. Pengiriman data formulir sebaiknya menggunakan metode HTTP POST agar kredensial tidak tampil pada baris alamat peramban, dan bila memungkinkan dilengkapi dengan jalur komunikasi terenkripsi.

  3. Perlu ditambahkan pembatasan jumlah percobaan masuk beserta jeda waktu untuk mengurangi risiko serangan coba-coba.

  4. Sistem dapat dilengkapi fitur pencatatan log akses pada kartu SD yang memuat waktu, kredensial yang digunakan, dan hasil verifikasinya, sehingga setiap percobaan akses dapat ditelusuri.

  5. Penambahan komponen seperti pembaca kartu RFID, keypad, layar OLED, atau solenoid door lock dapat menjadikan sistem lebih mendekati perangkat kendali akses yang sesungguhnya.

  6. Sistem perlu diwujudkan dalam bentuk perangkat keras nyata agar unjuk kerjanya dapat diukur pada kondisi sebenarnya, termasuk pengujian jangkauan sinyal Wi-Fi dan kestabilan pembacaan kartu SD.

DAFTAR PUSTAKA

Arduino. SD Library Reference. Diakses dari https://docs.arduino.cc/libraries/sd/

Ashton, K. (2009). That 'Internet of Things' Thing. RFID Journal, 22 Juni 2009.

AsyncTCP. Asynchronous TCP Library for ESP32. Repositori GitHub me-no-dev. Diakses dari https://github.com/me-no-dev/AsyncTCP

ESPAsyncWebServer. Asynchronous HTTP and WebSocket Server Library for ESP32. Repositori GitHub me-no-dev. Diakses dari https://github.com/me-no-dev/ESPAsyncWebServer

Espressif Systems. (2023). ESP32 Series Datasheet. Shanghai: Espressif Systems (Shanghai) Co., Ltd.

Espressif Systems. Arduino Core for the ESP32 - Documentation. Diakses dari https://docs.espressif.com/projects/arduino-esp32/

Shafranovich, Y. (2005). RFC 4180: Common Format and MIME Type for Comma-Separated Values (CSV) Files. Internet Engineering Task Force (IETF).

Wokwi. Wokwi Documentation - Simulate IoT Projects in Your Browser. Diakses dari https://docs.wokwi.com


Tautan proyek simulasi: https://wokwi.com/projects/476989389289619457


Tidak ada komentar:

Posting Komentar