Rotary Encoder KY-040 adalah modul perangkat input putar (seperti kenop) yang memungkinkan Anda mendeteksi seberapa banyak kenop telah diputar dan ke arah mana kenop diputar (searah jarum jam atau berlawanan arah jarum jam).Berikut ini adalah code untuk memprogramnya :
#include <Arduino.h>
const int CLKPin_rotary = A0;
const int DTNPin_rotary = A1;
int CLKState_rotary;
int lastCLKState_rotary = LOW;
int baca_rotary() {
CLKState_rotary = digitalRead(CLKPin_rotary);
int nilai = 0;
if (CLKState_rotary != lastCLKState_rotary) {
if (digitalRead(DTNPin_rotary) != CLKState_rotary) {
nilai = -1;
} else {
nilai = 1;
}
}
lastCLKState_rotary = CLKState_rotary;
return nilai;
}
void setup()
{
Serial.begin(9600);
pinMode(CLKPin_rotary, INPUT);
pinMode(DTNPin_rotary, INPUT);
}
void loop(){
int nilai = baca_rotary();
if (nilai != 0) {
Serial.print("Perubahan nilai: ");
Serial.println(nilai);
}
}Berikut ini adalah penjelasan dari kode di atas :
1. Inklusi Library dan Deklarasi Variabel Global
C++
#<strong>include</strong> <Arduino.h>
const int CLKPin_rotary = A0;
const int DTNPin_rotary = A1;
int CLKState_rotary;
int lastCLKState_rotary = LOW;
#include <Arduino.h>: Ini adalah library standar yang penting untuk semua program Arduino, menyediakan fungsi-fungsi dasar yang akan kita gunakan.const int CLKPin_rotary = A0;: Mendeklarasikan sebuah konstanta integer bernamaCLKPin_rotarydan menetapkannya ke pin analog A0. Pin ini akan terhubung ke pin CLK (Clock atau Channel A) dari rotary encoder.const int DTNPin_rotary = A1;: Mendeklarasikan konstanta integerDTNPin_rotarydan menetapkannya ke pin analog A1. Pin ini akan terhubung ke pin DT (Data atau Channel B) dari rotary encoder.int CLKState_rotary;: Mendeklarasikan variabel integerCLKState_rotary. Ini akan menyimpan status (HIGH atau LOW) saat ini dari pin CLK.int lastCLKState_rotary = LOW;: Mendeklarasikan variabel integerlastCLKState_rotarydan menginisialisasikannya denganLOW. Ini akan menyimpan status sebelumnya dari pin CLK. Variabel ini sangat penting untuk mendeteksi perubahan status dan menentukan arah putaran.
2. Fungsi baca_rotary()
C++
int baca_rotary() {
CLKState_rotary = digitalRead(CLKPin_rotary);
int nilai = 0;
if (CLKState_rotary != lastCLKState_rotary) {
if (digitalRead(DTNPin_rotary) != CLKState_rotary) {
nilai = -1;
} else {
nilai = 1;
}
}
lastCLKState_rotary = CLKState_rotary;
return nilai;
}
Fungsi baca_rotary() ini adalah inti dari kode. Ia bertanggung jawab untuk membaca status kedua pin encoder dan menentukan arah putaran.
CLKState_rotary = digitalRead(CLKPin_rotary);: Membaca status digital (HIGH atau LOW) dari pin CLK (A0) dan menyimpannya diCLKState_rotary.int nilai = 0;: Menginisialisasi variabelnilaidengan 0. Variabel ini akan menyimpan hasil putaran:0: Tidak ada putaran terdeteksi.1: Putaran searah jarum jam.-1: Putaran berlawanan arah jarum jam.
if (CLKState_rotary != lastCLKState_rotary): Ini adalah kondisi utama untuk mendeteksi putaran. Jika status pin CLK saat ini (CLKState_rotary) berbeda dari status sebelumnya (lastCLKState_rotary), berarti ada perubahan pada pin CLK, yang menandakan potensi adanya putaran.if (digitalRead(DTNPin_rotary) != CLKState_rotary): Jika CLK berubah status, kita perlu memeriksa pin DT (A1) untuk menentukan arah putaran.- Logika Rotary Encoder (Quadrature Encoding): Ketika encoder diputar, sinyal pada pin CLK dan DT akan bergeser fase. Jika putaran searah jarum jam, satu pin akan berubah status mendahului pin lainnya. Jika berlawanan arah jarum jam, urutannya akan terbalik.
- Kondisi
digitalRead(DTNPin_rotary) != CLKState_rotaryberarti jika status pin DT tidak sama dengan status pin CLK yang baru. Ini biasanya mengindikasikan putaran ke satu arah (misalnya, berlawanan arah jarum jam). Jika kondisi ini benar,nilaidiatur ke-1. else { nilai = 1; }: Jika kondisi di atas tidak terpenuhi (yaitu, status pin DT sama dengan status pin CLK yang baru), itu mengindikasikan putaran ke arah lain (misalnya, searah jarum jam). Jika ini terjadi,nilaidiatur ke1.
lastCLKState_rotary = CLKState_rotary;: Setelah selesai memproses putaran, status CLK saat ini disimpan kelastCLKState_rotary. Ini diperlukan untuk perbandingan pada iterasiloopberikutnya.return nilai;: Fungsi mengembalikan nilai0,1, atau-1sesuai dengan deteksi putaran.
3. Fungsi setup()
C++
void setup()
{
Serial.begin(9600);
pinMode(CLKPin_rotary, INPUT);
pinMode(DTNPin_rotary, INPUT);
}
Serial.begin(9600);: Menginisialisasi komunikasi serial pada baud rate 9600. Ini memungkinkan kita untuk melihat output dari Arduino di Serial Monitor.pinMode(CLKPin_rotary, INPUT);: Mengkonfigurasi pin CLK (A0) sebagai INPUT. Arduino akan membaca sinyal dari pin ini.pinMode(DTNPin_rotary, INPUT);: Mengkonfigurasi pin DT (A1) sebagai INPUT. Arduino juga akan membaca sinyal dari pin ini.
4. Fungsi loop()
C++
void loop(){
int nilai = baca_rotary();
if (nilai != 0) {
Serial.print("Perubahan nilai: ");
Serial.println(nilai);
}
}
int nilai = baca_rotary();: Memanggil fungsibaca_rotary()untuk mendapatkan status putaran encoder saat ini dan menyimpannya dalam variabelnilai.if (nilai != 0): Ini adalah kondisi untuk mencetak output hanya jika ada putaran terdeteksi. Jikanilaibukan 0 (yaitu, 1 atau -1), berarti encoder diputar.Serial.print("Perubahan nilai: ");: Mencetak teks “Perubahan nilai: ” ke Serial Monitor.Serial.println(nilai);: Mencetak nilai perubahan (1atau-1) ke Serial Monitor, diikuti dengan baris baru.
Cara Kerja Keseluruhan
Secara keseluruhan, kode ini akan terus-menerus memantau dua pin dari rotary encoder. Setiap kali Anda memutar kenop encoder, kode akan mendeteksi perubahan sinyal pada pin CLK dan DT, kemudian menggunakan urutan perubahan ini untuk menentukan apakah putaran itu searah jarum jam (1) atau berlawanan arah jarum jam (-1). Hasilnya kemudian dicetak ke Serial Monitor. Jika tidak ada putaran, tidak ada yang dicetak.
untuk diskusi bisa kontak dibawah ini :

Sosial media :





