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!
EmoticonEmoticon
Note: Only a member of this blog may post a comment.