{"id":553,"date":"2026-10-13T13:03:07","date_gmt":"2026-10-13T12:03:07","guid":{"rendered":"https:\/\/kuliahelektro.org\/?p=553"},"modified":"2026-10-13T13:03:08","modified_gmt":"2026-10-13T12:03:08","slug":"tutorial-arduino-cara-membuat-sistem-kunci-pintu-digital-digital-door-lock-menggunakan-rotary-encoder-layar-oled-ssd1306-motor-servo-pada-wokwi","status":"publish","type":"post","link":"https:\/\/kuliahelektro.org\/?p=553","title":{"rendered":"Tutorial Arduino: Cara Membuat Sistem Kunci Pintu Digital (Digital Door Lock) Menggunakan Rotary Encoder, Layar OLED SSD1306, &amp; Motor Servo pada WOKWI"},"content":{"rendered":"\n<p>Pada bagian ini akan dibahas pembuatan sistem kunci pintu digital interaktif berbasis mikrokontroler Arduino Uno, modul Rotary Encoder (KY-040), layar OLED 128&#215;64 I2C (SSD1306), motor servo sebagai pengunci pintu, buzzer alarm, serta indikator LED pada software simulasi WOKWI. Skematik rangkaian ditunjukkan pada Gambar 1, program Arduino pada Kode 1, dan video pembuatan pada tautan Video 1. Sistem memungkinkan pengguna untuk memasukkan PIN rahasia (4 digit) dengan memutar tombol Rotary Encoder untuk memilih angka (0-9) dan menekan tombol encoder untuk mengonfirmasi setiap digit. Layar OLED menampilkan progres input PIN secara real-time. Jika PIN benar, motor servo akan membuka kunci (90 derajat) selama 3 detik sebelum menguncinya kembali. Sistem juga dilengkapi fitur keamanan cooldown (blokir sementara) secara bertingkat jika terjadi kesalahan input PIN beruntun.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/youtu.be\/tOyDmVbEyGw?si=0N-fmn9KAdFcFkCY\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"866\" src=\"https:\/\/kuliahelektro.org\/wp-content\/uploads\/2026\/10\/image-21-1024x866.png\" alt=\"\" class=\"wp-image-555\" srcset=\"https:\/\/kuliahelektro.org\/wp-content\/uploads\/2026\/10\/image-21-1024x866.png 1024w, https:\/\/kuliahelektro.org\/wp-content\/uploads\/2026\/10\/image-21-300x254.png 300w, https:\/\/kuliahelektro.org\/wp-content\/uploads\/2026\/10\/image-21-768x649.png 768w, https:\/\/kuliahelektro.org\/wp-content\/uploads\/2026\/10\/image-21.png 1062w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p class=\"has-text-align-center\"><strong>Gambar 1. Skematik rangkaian sistem<\/strong><\/p>\n\n\n\n<p><strong>List Pin:<\/strong><\/p>\n\n\n\n<ul>\n<li>Display OLED 128&#215;64 I2C (SSD1306 &#8211; Alamat: 0x3C)<br>GND =&gt; GND<br>VCC =&gt; 5V<br>SDA =&gt; Analog Pin A4 (SDA)<br>SCL =&gt; Analog Pin A5 (SCL)<\/li>\n\n\n\n<li>Rotary Encoder (KY-040)<br>CLK (Clock) =&gt; Digital Pin 2 (CLK)<br>DT (Data) =&gt; Digital Pin 3 (DT)<br>SW (Switch) =&gt; Digital Pin 4 (SW \/ Tombol Tekan)<\/li>\n\n\n\n<li>\/ VCC =&gt; 5V<br>GND =&gt; GND<\/li>\n\n\n\n<li>Output Buzzer, LED Indikator &amp; Motor Servo<br>Buzzer Audio (Positive Terminal) =&gt; Digital Pin 5 (BUZZER)<br>LED Indikator Status Akses =&gt; Digital Pin 6 (LED_PIN via Resistor 220 Ohm)<br>Motor Servo Pengunci Pintu =&gt; Digital Pin 9 (SERVO_PIN)<\/li>\n<\/ul>\n\n\n\n<p><strong>List Virtual PIN:<\/strong><\/p>\n\n\n\n<ul>\n<li>Proyek ini dirancang sebagai sistem kunci pintu digital mandiri (standalone\/offline) pada platform WOKWI menggunakan Rotary Encoder, Display OLED SSD1306, dan Motor Servo tanpa koneksi internet\/cloud. Oleh karena itu, pemetaan Virtual Pin Blynk tidak diterapkan pada modul proyek ini.<\/li>\n<\/ul>\n\n\n\n<p class=\"has-text-align-center\"><strong>Kode Arduino 1. Kode Program<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ =============================\r\n\/\/ ALFIAN CENTER\r\n\/\/ SUBSCRIBE\r\n\/\/ KUNCI PINTU DIGITAL\r\n\/\/ PROGRAM BAKAL DI SHARE KALO LIKE TEMBUS 50 DAN KOMEN 20\r\n\/\/ ATAU BISA KIRIM EMAIL VIA KOMENTAR\r\n\/\/ =============================\r\n\r\n#include &lt;Wire.h>\r\n#include &lt;Adafruit_GFX.h>\r\n#include &lt;Adafruit_SSD1306.h>\r\n#include &lt;Encoder.h>\r\n#include &lt;Servo.h>\r\n\r\n#define SCREEN_WIDTH 128\r\n#define SCREEN_HEIGHT 64\r\nAdafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &amp;Wire, -1);\r\n\r\n\/\/ Pin\r\n#define CLK 2\r\n#define DT 3\r\n#define SW 4\r\n#define BUZZER 5\r\n#define LED_PIN 6\r\n#define SERVO_PIN 9\r\n\r\n\/\/ Rotary Encoder\r\nEncoder encoder(CLK, DT);\r\n#define ENCODER_STEPS_PER_TICK 4\r\nlong lastRawEncoder = 0;\r\n\r\nint readEncoderStep() {\r\n  long newRaw = encoder.read();\r\n  long delta = newRaw - lastRawEncoder;\r\n  int step = 0;\r\n  if (delta >= ENCODER_STEPS_PER_TICK) {\r\n    step = 1;\r\n    lastRawEncoder += ENCODER_STEPS_PER_TICK;\r\n  } else if (delta &lt;= -ENCODER_STEPS_PER_TICK) {\r\n    step = -1;\r\n    lastRawEncoder -= ENCODER_STEPS_PER_TICK;\r\n  }\r\n  return step;\r\n}\r\n\r\n\/\/ ====== PIN KUNCI ======\r\nconst int PIN_LENGTH = 4;\r\nint correctPIN&#91;PIN_LENGTH] = {1, 2, 3, 4};  \/\/ PIN rahasia\r\nint inputPIN&#91;PIN_LENGTH];\r\nint inputIndex = 0;\r\nint currentDigit = 0;\r\n\r\n\/\/ ====== STATE ======\r\nbool swPressed = false;\r\nint errorCount = 0;\r\nbool inCooldown = false;\r\nunsigned long cooldownStart = 0;\r\nint cooldownTime = 0; \/\/ dalam detik\r\n\r\n\/\/ ====== SERVO ======\r\nServo lockServo;\r\n\r\nvoid setup() {\r\n  pinMode(BUZZER, OUTPUT);\r\n  pinMode(LED_PIN, OUTPUT);\r\n  pinMode(SW, INPUT_PULLUP);\r\n\r\n  lockServo.attach(SERVO_PIN);\r\n  lockServo.write(0); \/\/ posisi terkunci\r\n\r\n  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {\r\n    for (;;);\r\n  }\r\n\r\n  display.clearDisplay();\r\n  display.setTextSize(1);\r\n  display.setTextColor(SSD1306_WHITE);\r\n  display.setCursor(0, 0);\r\n  display.println(\"Digital Lock\");\r\n  display.display();\r\n  delay(1500);\r\n}\r\n\r\nvoid loop() {\r\n  if (inCooldown) {\r\n    handleCooldown();\r\n    return;\r\n  }\r\n\r\n  int step = readEncoderStep();\r\n  if (step != 0) {\r\n    currentDigit = (currentDigit + step + 10) % 10; \/\/ 0-9\r\n  }\r\n\r\n  \/\/ Tombol encoder\r\n  if (digitalRead(SW) == LOW &amp;&amp; !swPressed) {\r\n    swPressed = true;\r\n    inputPIN&#91;inputIndex] = currentDigit;\r\n    inputIndex++;\r\n    tone(BUZZER, 1200, 100);\r\n\r\n    if (inputIndex >= PIN_LENGTH) {\r\n      checkPIN();\r\n    }\r\n  } else if (digitalRead(SW) == HIGH) {\r\n    swPressed = false;\r\n  }\r\n\r\n  drawScreen();\r\n}\r\n\r\n\/\/ ====== CEK PIN ======\r\nvoid checkPIN() {\r\n  bool correct = true;\r\n  for (int i = 0; i &lt; PIN_LENGTH; i++) {\r\n    if (inputPIN&#91;i] != correctPIN&#91;i]) {\r\n      correct = false;\r\n      break;\r\n    }\r\n  }\r\n\r\n  if (correct) {\r\n    tone(BUZZER, 1500, 200);\r\n    digitalWrite(LED_PIN, HIGH);\r\n    display.clearDisplay();\r\n    display.setCursor(0, 0);\r\n    display.println(\"PIN Benar!\");\r\n    display.display();\r\n\r\n    lockServo.write(90); \/\/ buka kunci\r\n    delay(3000);\r\n\r\n    lockServo.write(0); \/\/ tutup lagi\r\n    digitalWrite(LED_PIN, LOW);\r\n    errorCount = 0;\r\n  } else {\r\n    errorCount++;\r\n    tone(BUZZER, 400, 400);\r\n    display.clearDisplay();\r\n    display.setCursor(0, 0);\r\n    display.println(\"PIN Salah!\");\r\n    display.display();\r\n    delay(1500);\r\n\r\n    if (errorCount % 3 == 0) {\r\n      int batch = errorCount \/ 3;\r\n      cooldownTime = batch * 60; \/\/ 1 menit per batch\r\n      cooldownStart = millis();\r\n      inCooldown = true;\r\n    }\r\n  }\r\n\r\n  inputIndex = 0;\r\n  currentDigit = 0;\r\n}\r\n\r\n\/\/ ====== HANDLE COOLDOWN ======\r\nvoid handleCooldown() {\r\n  unsigned long elapsed = (millis() - cooldownStart) \/ 1000;\r\n  int remaining = cooldownTime - elapsed;\r\n\r\n  display.clearDisplay();\r\n  display.setTextSize(1);\r\n  display.setCursor(0, 0);\r\n  display.println(\"Terlalu Banyak Salah!\");\r\n  display.setCursor(0, 16);\r\n  display.print(\"Tunggu: \");\r\n  display.print(remaining);\r\n  display.println(\" dtk\");\r\n  display.display();\r\n\r\n  if (remaining &lt;= 0) {\r\n    inCooldown = false;\r\n  }\r\n}\r\n\r\n\/\/ ====== OLED UI ======\r\nvoid drawScreen() {\r\n  display.clearDisplay();\r\n  display.setTextSize(1);\r\n  display.setCursor(0, 0);\r\n  display.println(\"Masukkan PIN:\");\r\n\r\n  \/\/ tampilkan input progres\r\n  for (int i = 0; i &lt; PIN_LENGTH; i++) {\r\n    display.setCursor(i * 20, 20);\r\n    if (i &lt; inputIndex) {\r\n      display.print(\"*\");\r\n    } else if (i == inputIndex) {\r\n      display.print(currentDigit);\r\n    } else {\r\n      display.print(\"_\");\r\n    }\r\n  }\r\n\r\n  display.display();\r\n}\r<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/youtu.be\/tOyDmVbEyGw?si=0N-fmn9KAdFcFkCY\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"574\" src=\"https:\/\/kuliahelektro.org\/wp-content\/uploads\/2026\/10\/image-20-1024x574.png\" alt=\"\" class=\"wp-image-554\" srcset=\"https:\/\/kuliahelektro.org\/wp-content\/uploads\/2026\/10\/image-20-1024x574.png 1024w, https:\/\/kuliahelektro.org\/wp-content\/uploads\/2026\/10\/image-20-300x168.png 300w, https:\/\/kuliahelektro.org\/wp-content\/uploads\/2026\/10\/image-20-768x431.png 768w, https:\/\/kuliahelektro.org\/wp-content\/uploads\/2026\/10\/image-20-1536x861.png 1536w, https:\/\/kuliahelektro.org\/wp-content\/uploads\/2026\/10\/image-20.png 1919w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p class=\"has-text-align-center\"><strong>Video 1. Video tutorial pembuatan<\/strong><\/p>\n\n\n\n<h1 class=\"wp-block-heading\">TAG:<\/h1>\n\n\n\n<p class=\"has-text-align-left\">kunci pintu digital arduino, digital door lock arduino, rotary encoder arduino, oled 128&#215;64 ssd1306, servo motor door lock, tutorial arduino wokwi, simulasi wokwi encoder, koding kunci pintu digital, library encoder arduino, library adafruit ssd1306, adafruit gfx library, library servo arduino, pinout rotary encoder ky040, gpio arduino door lock, sistem keamanan pintu pintar, program pin digital lock, cooldown salah pin arduino, fungsi readencoderstep, input digit oled display, alarm buzzer salah pin, indikator led akses arduino, proyek iot keamanan rumah, praktikum mikrokontroler arduino, simulasi arduino tanpa hardware, platform simulasi wokwi, wokwi digital lock project, source code kunci pintu arduino, program arduino encoder oled, diy digital door lock, alat pengaman pintu rumah, display oled i2c u8g2, algoritma input pin rahasia, fungsi checkpin arduino, sistem akses pintu otomatis, smart home security arduino, proyek mekatronika elektro, proyek sains arduino, tugas akhir kunci pintu digital, skripsi arduino door lock, ide proyek arduino uno, skematik digital lock encoder, diagram rangkaian oled servo encoder, kodingan arduino kunci pintu, belajar arduino wokwi, panduan wokwi encoder, simulator door lock wokwi, tutorial mikrokontroler indonesia, proyek elektronika populer, kodingan kunci pintu lengkap, sistem pengaman oled ssd1306, otomasi rumah tangga pintar, sistem deteksi salah pin, tampilan progres input oled, cara koding rotary encoder, variabel pin length 4, pengaman pintu otomatis, logika cooldown error count, sistem proteksi akses pintu, otomatisasi perangkat pengaman, proyek mekatronika elektro, simulasi hardware digital lock, sistem kunci pintu encoder, proyek arduino populer, kodingan door lock sederhana, sensor rotary encoder ky040, rangkaian oled dan servo, tutorial mikrokontroler iot, wawasan teknik elektro, proyek arduino uno populer, kodingan kunci pintu simpel, kontrol multi komponen i2c, teknik pembacaan encoder, tutorial lengkap wokwi arduino<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pada bagian ini akan dibahas pembuatan sistem kunci pintu digital interaktif berbasis mikrokontroler Arduino Uno, modul Rotary Encoder (KY-040), layar OLED 128&#215;64 I2C (SSD1306), motor servo sebagai pengunci pintu, buzzer alarm, serta indikator LED pada software simulasi WOKWI. Skematik rangkaian ditunjukkan pada Gambar 1, program Arduino pada Kode 1, dan video pembuatan pada tautan Video 1. Sistem memungkinkan pengguna untuk&#8230;<\/p>\n","protected":false},"author":3,"featured_media":554,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"_links":{"self":[{"href":"https:\/\/kuliahelektro.org\/index.php?rest_route=\/wp\/v2\/posts\/553"}],"collection":[{"href":"https:\/\/kuliahelektro.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kuliahelektro.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kuliahelektro.org\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/kuliahelektro.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=553"}],"version-history":[{"count":1,"href":"https:\/\/kuliahelektro.org\/index.php?rest_route=\/wp\/v2\/posts\/553\/revisions"}],"predecessor-version":[{"id":556,"href":"https:\/\/kuliahelektro.org\/index.php?rest_route=\/wp\/v2\/posts\/553\/revisions\/556"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kuliahelektro.org\/index.php?rest_route=\/wp\/v2\/media\/554"}],"wp:attachment":[{"href":"https:\/\/kuliahelektro.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=553"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/kuliahelektro.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=553"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kuliahelektro.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=553"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}