Arduino - Menggunakan Rotary Encoder KY-040

 

Rotary encoder KY-040 adalah sebuah komponen input elektronik yang dapat mendeteksi arah dan jumlah rotasi (putaran), serta dilengkapi dengan tombol tekan di tengahnya. Komponen ini sering digunakan dalam berbagai aplikasi seperti menu navigasi, pengaturan volume, dan antarmuka pengguna di perangkat embedded.


Rotary encoder KY-040 adalah alat input yang banyak digunakan untuk:

  • Navigasi menu
  • Pengaturan volume atau parameter
  • Pemrograman antarmuka interaktif

Encoder ini menghasilkan pulsa saat diputar, dan memiliki tombol push (tekanan).

Tutorial ini akan membahas:

  • Wiring ke Arduino
  • Membaca arah putaran
  • Menggunakan tombol tekan
  • Kode dasar dan pengembangan

 

Alat dan Bahan

  • Arduino Uno (atau sejenis)
  • Rotary Encoder KY-040
  • Kabel jumper
  • Breadboard

 

Cara Kerja Singkat:

  • Saat knob diputar, pin CLK dan DT menghasilkan sinyal pulsa.
  • Urutan perubahan antara CLK dan DT digunakan untuk menentukan arah putaran:
  • Jika CLK berubah lebih dulu → searah jarum jam (CW).
  • Jika DT berubah lebih dulu → berlawanan arah jarum jam (CCW).
  • Setiap “klik” menghasilkan satu langkah rotasi.
  • Pin SW aktif ketika knob ditekan (LOW saat ditekan).

 

Wiring KY-040 ke Arduino

  • CLK → Pin 2
  • DT → Pin 3
  • SW → Pin 4
  • VCC→ 5V
  • GND → GND

Library

https://github.com/johnrickman/LiquidCrystal_I2C

 

Kode Dasar Arduino


#include "Wire.h"  // Library untuk komunikasi I2C
#include "LiquidCrystal_I2C.h"  // Library untuk mengontrol LCD I2C

// Inisialisasi objek LCD dengan alamat I2C 0x27, 16 kolom, 2 baris
LiquidCrystal_I2C lcd(0x27, 16, 2); // Ganti 0x3F jika alamat berbeda

// Definisi pin untuk rotary encoder
#define CLK 2  // Pin CLK dari encoder
#define DT 4   // Pin DT dari encoder
#define SW 3   // Pin SW (tombol tekan) dari encoder

int counter = 0;  // Variabel penghitung nilai putaran encoder
int currentStateCLK;  // Status saat ini dari pin CLK
int lastStateCLK;     // Status sebelumnya dari pin CLK
String currentDir = "";  // Arah putaran encoder: "CW" (searah) atau "CCW" (berlawanan)
unsigned long lastButtonPress = 0;  // Waktu terakhir tombol ditekan, untuk debouncing

void setup() {
  // Konfigurasi pin-pin sebagai input
  pinMode(CLK, INPUT);
  pinMode(DT, INPUT);
  pinMode(SW, INPUT_PULLUP);  // SW pakai pull-up internal

  Serial.begin(9600);  // Memulai komunikasi serial pada 9600 baud

  lastStateCLK = digitalRead(CLK);  // Simpan status awal CLK

  lcd.init();           // Inisialisasi LCD
  lcd.backlight();      // Nyalakan backlight
  lcd.print("KY-040 DENGAN");  // Tampilkan pesan awal
  lcd.setCursor(0, 1);
  lcd.print("LCD 16x02");
}

void loop() {
  currentStateCLK = digitalRead(CLK);  // Baca status CLK saat ini

  // Deteksi perubahan status CLK (hanya saat naik)
  if (currentStateCLK != lastStateCLK && currentStateCLK == 1) {
    if (digitalRead(DT) != currentStateCLK) {
      // Putaran searah jarum jam (CW)
      counter++;
      currentDir = "CW";
    } else {
      // Putaran berlawanan arah jarum jam (CCW)
      counter--;
      currentDir = "CCW";
    }

    // Tampilkan arah dan nilai di LCD
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("ARAH: ");
    lcd.print(currentDir);
    lcd.setCursor(0, 1);
    lcd.print("NILAI: ");
    lcd.print(counter);

    // Tampilkan juga di Serial Monitor
    Serial.print("ARAH: ");
    Serial.print(currentDir);
    Serial.print(" | NILAI: ");
    Serial.println(counter);
  }

  lastStateCLK = currentStateCLK;  // Simpan status CLK terakhir

  int btnState = digitalRead(SW);  // Baca status tombol

  if (btnState == LOW) {  // Jika tombol ditekan
    if (millis() - lastButtonPress > 50) {
      // Jika lebih dari 50ms sejak terakhir ditekan (debounce)
      counter = 0;  // Reset nilai counter

      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("TOMBOL DITEKAN");
      lcd.setCursor(0, 1);
      lcd.print("Nilai: ");
      lcd.print(counter);

      Serial.println("TOMBOL DITEKAN");
      Serial.print("NILAI: ");
      Serial.println(counter);
    }
    lastButtonPress = millis();  // Update waktu terakhir tombol ditekan
  }

  delay(1);  // Delay kecil untuk menghindari bouncing encoder
}

Penjelasan Kode

  • CLK dan DT membaca arah putaran
  • SW membaca tombol
  • counter menampung nilai putaran
  • Tombol SW dibaca sebagai logika LOW saat ditekan

 

Tampilan Layar


 

 

Tampilan Serial Monitor

 

Wokwi link


Selamat mencoba!

Selanjutnya
« Post Selanjutnya
Sebelumnya
Post Sebelumnya »

EmoticonEmoticon

Note: Only a member of this blog may post a comment.