• 082226375801
  • alfianmaarif@ee.uad.ac.id
  • Yogyakarta
Materi
Tutorial Arduino: Cara Membuat Sistem Kunci Pintu Digital (Digital Door Lock) Menggunakan Rotary Encoder, Layar OLED SSD1306, & Motor Servo pada WOKWI

Tutorial Arduino: Cara Membuat Sistem Kunci Pintu Digital (Digital Door Lock) Menggunakan Rotary Encoder, Layar OLED SSD1306, & Motor Servo pada WOKWI

Pada bagian ini akan dibahas pembuatan sistem kunci pintu digital interaktif berbasis mikrokontroler Arduino Uno, modul Rotary Encoder (KY-040), layar OLED 128×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.

Gambar 1. Skematik rangkaian sistem

List Pin:

  • Display OLED 128×64 I2C (SSD1306 – Alamat: 0x3C)
    GND => GND
    VCC => 5V
    SDA => Analog Pin A4 (SDA)
    SCL => Analog Pin A5 (SCL)
  • Rotary Encoder (KY-040)
    CLK (Clock) => Digital Pin 2 (CLK)
    DT (Data) => Digital Pin 3 (DT)
    SW (Switch) => Digital Pin 4 (SW / Tombol Tekan)
  • / VCC => 5V
    GND => GND
  • Output Buzzer, LED Indikator & Motor Servo
    Buzzer Audio (Positive Terminal) => Digital Pin 5 (BUZZER)
    LED Indikator Status Akses => Digital Pin 6 (LED_PIN via Resistor 220 Ohm)
    Motor Servo Pengunci Pintu => Digital Pin 9 (SERVO_PIN)

List Virtual PIN:

  • 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.

Kode Arduino 1. Kode Program

// =============================
// ALFIAN CENTER
// SUBSCRIBE
// KUNCI PINTU DIGITAL
// PROGRAM BAKAL DI SHARE KALO LIKE TEMBUS 50 DAN KOMEN 20
// ATAU BISA KIRIM EMAIL VIA KOMENTAR
// =============================

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Encoder.h>
#include <Servo.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

// Pin
#define CLK 2
#define DT 3
#define SW 4
#define BUZZER 5
#define LED_PIN 6
#define SERVO_PIN 9

// Rotary Encoder
Encoder encoder(CLK, DT);
#define ENCODER_STEPS_PER_TICK 4
long lastRawEncoder = 0;

int readEncoderStep() {
  long newRaw = encoder.read();
  long delta = newRaw - lastRawEncoder;
  int step = 0;
  if (delta >= ENCODER_STEPS_PER_TICK) {
    step = 1;
    lastRawEncoder += ENCODER_STEPS_PER_TICK;
  } else if (delta <= -ENCODER_STEPS_PER_TICK) {
    step = -1;
    lastRawEncoder -= ENCODER_STEPS_PER_TICK;
  }
  return step;
}

// ====== PIN KUNCI ======
const int PIN_LENGTH = 4;
int correctPIN[PIN_LENGTH] = {1, 2, 3, 4};  // PIN rahasia
int inputPIN[PIN_LENGTH];
int inputIndex = 0;
int currentDigit = 0;

// ====== STATE ======
bool swPressed = false;
int errorCount = 0;
bool inCooldown = false;
unsigned long cooldownStart = 0;
int cooldownTime = 0; // dalam detik

// ====== SERVO ======
Servo lockServo;

void setup() {
  pinMode(BUZZER, OUTPUT);
  pinMode(LED_PIN, OUTPUT);
  pinMode(SW, INPUT_PULLUP);

  lockServo.attach(SERVO_PIN);
  lockServo.write(0); // posisi terkunci

  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    for (;;);
  }

  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.println("Digital Lock");
  display.display();
  delay(1500);
}

void loop() {
  if (inCooldown) {
    handleCooldown();
    return;
  }

  int step = readEncoderStep();
  if (step != 0) {
    currentDigit = (currentDigit + step + 10) % 10; // 0-9
  }

  // Tombol encoder
  if (digitalRead(SW) == LOW && !swPressed) {
    swPressed = true;
    inputPIN[inputIndex] = currentDigit;
    inputIndex++;
    tone(BUZZER, 1200, 100);

    if (inputIndex >= PIN_LENGTH) {
      checkPIN();
    }
  } else if (digitalRead(SW) == HIGH) {
    swPressed = false;
  }

  drawScreen();
}

// ====== CEK PIN ======
void checkPIN() {
  bool correct = true;
  for (int i = 0; i < PIN_LENGTH; i++) {
    if (inputPIN[i] != correctPIN[i]) {
      correct = false;
      break;
    }
  }

  if (correct) {
    tone(BUZZER, 1500, 200);
    digitalWrite(LED_PIN, HIGH);
    display.clearDisplay();
    display.setCursor(0, 0);
    display.println("PIN Benar!");
    display.display();

    lockServo.write(90); // buka kunci
    delay(3000);

    lockServo.write(0); // tutup lagi
    digitalWrite(LED_PIN, LOW);
    errorCount = 0;
  } else {
    errorCount++;
    tone(BUZZER, 400, 400);
    display.clearDisplay();
    display.setCursor(0, 0);
    display.println("PIN Salah!");
    display.display();
    delay(1500);

    if (errorCount % 3 == 0) {
      int batch = errorCount / 3;
      cooldownTime = batch * 60; // 1 menit per batch
      cooldownStart = millis();
      inCooldown = true;
    }
  }

  inputIndex = 0;
  currentDigit = 0;
}

// ====== HANDLE COOLDOWN ======
void handleCooldown() {
  unsigned long elapsed = (millis() - cooldownStart) / 1000;
  int remaining = cooldownTime - elapsed;

  display.clearDisplay();
  display.setTextSize(1);
  display.setCursor(0, 0);
  display.println("Terlalu Banyak Salah!");
  display.setCursor(0, 16);
  display.print("Tunggu: ");
  display.print(remaining);
  display.println(" dtk");
  display.display();

  if (remaining <= 0) {
    inCooldown = false;
  }
}

// ====== OLED UI ======
void drawScreen() {
  display.clearDisplay();
  display.setTextSize(1);
  display.setCursor(0, 0);
  display.println("Masukkan PIN:");

  // tampilkan input progres
  for (int i = 0; i < PIN_LENGTH; i++) {
    display.setCursor(i * 20, 20);
    if (i < inputIndex) {
      display.print("*");
    } else if (i == inputIndex) {
      display.print(currentDigit);
    } else {
      display.print("_");
    }
  }

  display.display();
}

Video 1. Video tutorial pembuatan

TAG:

kunci pintu digital arduino, digital door lock arduino, rotary encoder arduino, oled 128×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

Leave a Reply

Your email address will not be published. Required fields are marked *