Pada tutorial ini, kita akan membuat sistem kunci pintu pintar berbasis PIN (kode angka rahasia) menggunakan Arduino UNO, keypad 4×4 sebagai alat memasukkan PIN, dan motor servo sebagai penggerak kunci pintu. Semua percobaan dilakukan secara simulasi di Wokwi, jadi kamu bisa mencobanya tanpa perlu komponen fisik.
Alur singkat sistem ini: Keypad membaca tombol → Arduino mengecek PIN → jika benar, servo membuka 90 derajat → setelah beberapa detik, servo mengunci kembali secara otomatis.
Proyek ini mensimulasikan kunci pintu digital berbasis password. Pengguna menekan empat tombol pada keypad. Arduino membaca urutan tombol yang ditekan, membandingkannya dengan PIN yang sudah ditentukan sebelumnya di dalam program, lalu menggerakkan servo sebagai kunci pintu jika PIN-nya benar.
Serial Monitor adalah jendela khusus di Wokwi (atau di aplikasi Arduino IDE) yang menampilkan pesan-pesan teks dari program yang sedang berjalan di Arduino — semacam “layar chat” antara program dan kita. Ini sangat berguna untuk debugging (mencari kesalahan) atau sekadar melihat status alat, terutama kalau alatnya belum punya layar sendiri seperti LCD.
| No | Komponen | Fungsi |
|---|---|---|
| 1 | Arduino UNO | Papan mikrokontroler utama, otak dari sistem ini. |
| 2 | Membrane Keypad 4×4 | Papan tombol untuk memasukkan PIN. |
| 3 | Micro Servo | Aktuator (penggerak) untuk membuka dan menutup kunci. |
| 4 | Kabel jumper virtual | Menghubungkan jalur VCC, GND, PWM, baris keypad, dan kolom keypad. |
Berbeda dari proyek sensor suhu sebelumnya, rangkaian kunci pintu ini bisa langsung disambungkan ke Arduino tanpa breadboard, karena jumlah komponennya sedikit (cuma keypad dan servo) dan jalur dayanya bisa langsung menuju pin 5V dan GND Arduino tanpa perlu dibagi ke banyak komponen lain.
| Nama Library | Fungsi |
|---|---|
Keypad |
Membaca tombol pada keypad matrix dan mengubahnya menjadi karakter, seperti 1, 2, A, atau #. |
Servo |
Mengatur sudut putaran motor servo melalui sinyal PWM dari Arduino. |
Buka tab Library Manager di Wokwi, lalu pastikan kedua library di atas sudah muncul di daftar Installed Libraries.
PWM (Pulse Width Modulation) adalah cara Arduino “berbicara” dengan motor servo untuk memberi tahu sudut berapa derajat motor harus berputar. Sinyal ini berbentuk nyala-mati listrik yang sangat cepat dengan pola tertentu — servo akan membaca pola ini dan memutar porosnya sesuai sudut yang diminta. Untungnya, library Servo sudah mengurus semua detail teknis ini untuk kita, jadi kita cukup memanggil perintah seperti write(90) tanpa perlu memahami sinyal PWM secara mendalam.
Catatan Praktik: di Wokwi, library biasanya otomatis terbaca dari baris #include di kode program. Jika muncul compile error (program gagal diproses), pastikan nama library di Library Manager sudah sesuai dengan yang dipanggil di kode.

| Pin Servo | Tersambung ke |
|---|---|
| GND | GND Arduino |
| V+ | 5V Arduino |
| PWM | Pin 10 Arduino |
| Pin Keypad | Tersambung ke |
|---|---|
| R1 | Pin digital 9 |
| R2 | Pin digital 8 |
| R3 | Pin digital 7 |
| R4 | Pin digital 6 |
| C1 | Pin digital 5 |
| C2 | Pin digital 4 |
| C3 | Pin digital 3 |
| C4 | Pin digital 2 |
Keypad 4×4 tidak membaca setiap tombol dengan satu kabel sendiri-sendiri (yang akan butuh 16 kabel untuk 16 tombol!). Sebagai gantinya, keypad memakai sistem baris (R = Row) dan kolom (C = Column). Arduino “memindai” kombinasi baris dan kolom yang aktif secara bergantian untuk mengetahui tombol mana yang sedang ditekan — mirip seperti sistem koordinat pada peta (baris + kolom = satu titik tombol tertentu). Dengan cara ini, 16 tombol cukup dibaca dengan hanya 4 kabel baris + 4 kabel kolom = 8 kabel saja.
Penting: urutan kabel keypad harus sesuai dengan pengaturan pinBaris dan pinKolom di dalam kode program. Jika kabelnya tertukar, tombol yang terbaca oleh Arduino juga bisa ikut tertukar (misalnya menekan angka 5 tapi yang terbaca malah angka 8).
Catatan posisi awal servo: pada awal simulasi, servo berada di posisi 0 derajat (posisi terkunci). Saat PIN yang dimasukkan benar, servo akan bergerak ke 90 derajat (posisi terbuka) selama beberapa detik, lalu otomatis kembali ke 0 derajat (terkunci lagi).
Buka file sketch.ino di Wokwi, lalu salin kode berikut:
#include <Keypad.h>
#include <Servo.h>
Servo kunciPintu;
// --- GANTI PASSWORD DI SINI ---
String passwordRahasia = "1234";
String inputPassword = "";
// Mengatur susunan tombol Keypad 4x4
const byte baris = 4;
const byte kolom = 4;
char keys[baris][kolom] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
// Mengatur colokan kabel Keypad sesuai yang kita pasang tadi
byte pinBaris[baris] = {9, 8, 7, 6};
byte pinKolom[kolom] = {5, 4, 3, 2};
Keypad keypadSaya = Keypad(makeKeymap(keys), pinBaris, pinKolom, baris, kolom);
void setup() {
Serial.begin(9600);
kunciPintu.attach(10); // Servo dicolok ke angka 10
kunciPintu.write(0); // Posisi awal: Pintu Terkunci (0 derajat)
Serial.println("=== SISTEM KEAMANAN AKTIF ===");
Serial.println("Pintu TERKUNCI. Silakan ketik PIN (4 digit):");
}
void loop() {
// Membaca tombol apa yang dipencet
char tombolDitekan = keypadSaya.getKey();
if (tombolDitekan) {
Serial.print("*"); // Munculkan bintang biar PIN rahasia (gak kelihatan)
inputPassword += tombolDitekan; // Simpan angka yang dipencet
// Jika sudah memasukkan 4 angka
if (inputPassword.length() == 4) {
Serial.println(); // Pindah baris di layar
// Cek apakah PIN-nya benar?
if (inputPassword == passwordRahasia) {
Serial.println(">>> PIN BENAR! Pintu Terbuka.");
kunciPintu.write(90); // Servo bergerak membuka kunci (90 derajat)
delay(3000); // Biarkan pintu terbuka selama 3 detik
Serial.println(">>> Waktu habis. Pintu TERKUNCI kembali.");
kunciPintu.write(0); // Servo kembali mengunci (0 derajat)
} else {
Serial.println(">>> PIN SALAH! Alarm Berbunyi! Akses Ditolak.");
}
// Reset inputan untuk percobaan selanjutnya
inputPassword = "";
Serial.println("-----------------------------------");
Serial.println("Pintu TERKUNCI. Silakan ketik PIN (4 digit):");
}
}
}
Klik masing-masing bagian di bawah ini untuk memahami fungsinya satu per satu:
#include <Keypad.h> — memanggil library untuk membaca keypad matrix.#include <Servo.h> — memanggil library untuk mengontrol motor servo.Servo kunciPintu; — membuat sebuah objek (perwakilan) bernama kunciPintu yang mewakili motor servo kita di dalam program, supaya nanti bisa diperintah untuk bergerak.String passwordRahasia = "1234"; — membuat sebuah variabel (wadah penyimpan data) bertipe String (teks), diberi nama passwordRahasia, dan diisi dengan PIN yang dianggap benar, yaitu "1234". Kalau kamu ingin PIN yang berbeda, cukup ganti angka di dalam tanda kutip ini.String inputPassword = ""; — membuat variabel inputPassword yang awalnya kosong (tanda kutip tanpa isi). Variabel ini nantinya dipakai untuk menampung tombol-tombol yang ditekan pengguna, satu per satu, sampai terkumpul 4 karakter.const byte baris = 4; dan const byte kolom = 4; — memberi tahu program bahwa keypad ini punya 4 baris dan 4 kolom tombol (total 16 tombol).char keys[baris][kolom] = { ... }; — sebuah array 2 dimensi (tabel berisi data, seperti tabel di Excel) yang mendaftar karakter apa yang ada di setiap posisi baris-kolom keypad. Susunannya persis meniru tombol fisik keypad: baris pertama berisi 1 2 3 A, baris kedua 4 5 6 B, dan seterusnya.byte pinBaris[baris] = {9, 8, 7, 6}; — memberi tahu program bahwa baris R1, R2, R3, R4 pada keypad terhubung ke pin digital 9, 8, 7, dan 6 secara berurutan.byte pinKolom[kolom] = {5, 4, 3, 2}; — sama seperti di atas, tapi untuk kolom C1, C2, C3, C4 yang terhubung ke pin 5, 4, 3, dan 2.Keypad keypadSaya = Keypad(makeKeymap(keys), pinBaris, pinKolom, baris, kolom); — baris ini “merakit” semua informasi di atas (susunan tombol, pin baris, pin kolom) menjadi satu objek bernama keypadSaya yang siap dipakai untuk membaca tombol yang ditekan.Serial.begin(9600); — mengaktifkan komunikasi Serial Monitor dengan kecepatan 9600 (satuan baud), supaya kita bisa melihat pesan-pesan teks dari program.kunciPintu.attach(10); — memberi tahu program bahwa servo kunciPintu terpasang di pin 10 Arduino.kunciPintu.write(0); — memutar servo ke posisi 0 derajat sebagai posisi awal (terkunci) saat program baru menyala.Serial.println("...") — menampilkan pesan teks ke Serial Monitor, memberi tahu pengguna bahwa sistem sudah aktif dan pintu dalam kondisi terkunci.char tombolDitekan = keypadSaya.getKey(); — mengecek apakah ada tombol keypad yang sedang ditekan. Jika ada, karakternya (misal '5') disimpan ke variabel tombolDitekan; jika tidak ada tombol yang ditekan, nilainya kosong.if (tombolDitekan) { ... } — blok kode ini hanya dijalankan jika ada tombol yang benar-benar ditekan (nilainya tidak kosong).Serial.print("*"); — menampilkan tanda bintang di Serial Monitor setiap tombol ditekan, sebagai pengganti angka asli — supaya PIN yang diketik tidak langsung terlihat jelas (mirip titik-titik saat mengetik password di HP).inputPassword += tombolDitekan; — tanda += berarti “tambahkan ke akhir”. Baris ini menambahkan karakter yang baru ditekan ke akhir teks yang sudah tersimpan di inputPassword. Misalnya jika sebelumnya isinya "12" dan pengguna menekan 3, maka isinya menjadi "123".if (inputPassword.length() == 4) { ... } — .length() menghitung berapa banyak karakter di dalam inputPassword. Kondisi ini bernilai benar hanya ketika sudah terkumpul tepat 4 karakter — artinya pengguna sudah selesai memasukkan PIN 4 digit.if (inputPassword == passwordRahasia) { ... } else { ... } — membandingkan PIN yang dimasukkan pengguna dengan PIN yang benar. Jika sama persis, jalankan kode di dalam if (buka pintu); jika berbeda, jalankan kode di dalam else (tolak akses).kunciPintu.write(90); — memutar servo ke 90 derajat, membuka kunci.delay(3000); — menunda program selama 3000 milidetik (3 detik), supaya pintu tetap terbuka sejenak sebelum terkunci lagi.kunciPintu.write(0); — memutar servo kembali ke 0 derajat, mengunci pintu lagi.inputPassword = ""; — mengosongkan kembali variabel inputPassword, supaya siap menampung percobaan PIN berikutnya dari awal.sketch.ino.| Skenario | Yang Dilakukan | Hasil yang Diharapkan |
|---|---|---|
| Uji PIN Salah | Masukkan 4 angka yang berbeda dari PIN asli (misalnya 9999). |
Servo tetap di posisi terkunci, Serial Monitor menampilkan pesan “PIN SALAH! Akses Ditolak.” |
| Uji PIN Benar | Masukkan PIN yang benar (1234). |
Servo bergerak membuka (90 derajat), menunggu 3 detik, lalu kembali ke posisi terkunci (0 derajat). |
| Uji Reset Input | Coba masukkan PIN beberapa kali berturut-turut. | Setiap selesai 4 karakter, inputPassword otomatis dikosongkan, sehingga percobaan berikutnya selalu dimulai dari nol. |
| Uji Serial Monitor | Perhatikan Serial Monitor saat menekan tombol. | Tanda bintang (*) muncul setiap tombol ditekan, lalu status berubah sesuai hasil pengecekan PIN. |
| Masalah | Kemungkinan Penyebab dan Solusi |
|---|---|
| Servo tidak bergerak | Cek kabel V+, GND, dan PWM servo. Pastikan kabel PWM masuk ke pin 10 sesuai kode program. |
| Tombol keypad tidak terbaca | Cek urutan kabel R1 sampai C4. Urutan kabel harus cocok persis dengan pinBaris dan pinKolom di kode. |
| Tombol yang terbaca salah (misal tekan 5 tapi kebaca 8) | Kemungkinan pin baris atau kolom tertukar posisinya. Cocokkan lagi dengan tabel pemetaan pin pada Langkah 3. |
| Compile error terkait Keypad atau Servo | Buka Library Manager dan pastikan kedua library sudah terpasang dengan benar. |
| Status tidak terlihat sama sekali | Pastikan kamu sudah membuka Serial Monitor sebelum mulai menekan tombol PIN. |
| Servo langsung kembali terkunci tanpa jeda | Cek bagian delay(3000) pada kode — ini yang mengatur berapa lama pintu tetap terbuka sebelum otomatis terkunci lagi. |
Simulasi ini cocok untuk memahami logika dasar sistem kunci pintu digital. Untuk membuat pintu asli (fisik), sistemnya perlu rangkaian penggerak yang lebih kuat, casing pelindung, sumber daya yang memadai, dan mekanisme kunci mekanis yang lebih kokoh dibanding servo mainan/mikro. Selain itu, pada perangkat nyata, gunakan catu daya servo yang sesuai (terpisah dari Arduino jika perlu) agar Arduino tidak kelebihan beban listrik saat servo bergerak.
String dipakai untuk menyimpan dan membandingkan teks/angka PIN, menggunakan operator += (tambah ke akhir teks) dan == (bandingkan apakah sama persis).write(derajat) — 0 untuk terkunci, 90 untuk terbuka pada proyek ini.🔒 Simulasi ini dikunci. Minta passcode ke gurumu untuk membuka.