Cara Memprogram Rotary Encoder Pada ESP32

Cara Memprogram Rotary Encoder Pada ESP32

Rotary Encoder adalah sebuah perangkat elektronik yang digunakan untuk mengukur perubahan posisi rotasi dari sebuah objek atau poros.Berikut ini adalah cara meprogramnya :

#include <Arduino.h>

#include <ezButton.h>

 
#define CLK_PIN D7
#define DT_PIN D6
#define SW_PIN D5
#define DIRECTION_CW 0
#define DIRECTION_CCW 1 
 
int counter = 0;
int direction = DIRECTION_CW;
int CLK_state;
int prev_CLK_state;
 
ezButton button(SW_PIN); 




void setup()
{
Serial.begin(9600);
pinMode(CLK_PIN, INPUT);
pinMode(DT_PIN, INPUT);
button.setDebounceTime(50); // set debounce time to 50 milliseconds
 
// read the initial state of the rotary encoder's CLK pin
prev_CLK_state = digitalRead(CLK_PIN);

}
void loop(){
button.loop(); // MUST call the loop() function first
 
// read the current state of the rotary encoder's CLK pin
CLK_state = digitalRead(CLK_PIN);
 
// If the state of CLK is changed, then pulse occurred
// React to only the rising edge (from LOW to HIGH) to avoid double count
if (CLK_state != prev_CLK_state && CLK_state == HIGH) {
// if the DT state is HIGH
// The encoder is rotating in counter-clockwise direction => decrease the counter
if (digitalRead(DT_PIN) == HIGH) {
counter--;
direction = DIRECTION_CCW;
} else {
// The encoder is rotating in clockwise direction => increase the counter
counter++;
direction = DIRECTION_CW;
}
 
Serial.print("Rotary Encoder:: direction: ");
if (direction == DIRECTION_CW)
Serial.print("CLOCKWISE");
else
Serial.print("ANTICLOCKWISE");
 
Serial.print(" - count: ");
Serial.println(counter);
}
 
// save last CLK state
prev_CLK_state = CLK_state;
 
if (button.isPressed()) {
Serial.println("The button is pressed");
}


}

Berikut ini adalah penjelasan dari kode di atas :

Library yang Digunakan:

#include <Arduino.h>
#include <ezButton.h>
  • Arduino.h: Library dasar yang disertakan dalam semua sketch Arduino, berisi fungsi-fungsi untuk mengontrol mikrokontroler.
  • ezButton.h: Library ini digunakan untuk mengelola tombol dengan debouncing, yang berarti mencegah pembacaan ganda pada tombol saat ditekan atau dilepas (pada tombol mekanis).

Deklarasi Pin dan Variabel:

#define CLK_PIN D7
#define DT_PIN D6
#define SW_PIN D5
#define DIRECTION_CW 0
#define DIRECTION_CCW 1
  • CLK_PIN: Pin untuk membaca sinyal dari Clock (CLK) pada Rotary Encoder, yang menunjukkan langkah perputaran.
  • DT_PIN: Pin untuk membaca sinyal dari Data (DT) pada Rotary Encoder, yang digunakan untuk menentukan arah rotasi.
  • SW_PIN: Pin untuk membaca status tombol tekan pada encoder.
  • DIRECTION_CW dan DIRECTION_CCW: Konstanta yang digunakan untuk menyimpan nilai arah rotasi. DIRECTION_CW untuk rotasi searah jarum jam (clockwise) dan DIRECTION_CCW untuk rotasi berlawanan arah jarum jam (counter-clockwise).

Variabel untuk Menyimpan Status Encoder dan Button:

int counter = 0;
int direction = DIRECTION_CW;
int CLK_state;
int prev_CLK_state;
  • counter: Variabel untuk menghitung jumlah langkah rotasi dari encoder.
  • direction: Variabel untuk menyimpan arah rotasi (searah atau berlawanan arah jarum jam).
  • CLK_state dan prev_CLK_state: Variabel untuk menyimpan status dari pin CLK pada putaran encoder saat ini dan sebelumnya.

Deklarasi dan Inisialisasi Tombol:

ezButton button(SW_PIN);
  • button: Menggunakan library ezButton untuk mengelola tombol yang terhubung ke pin D5 pada Arduino. Ini akan menangani debouncing tombol secara otomatis.

Fungsi setup():

void setup()
{
  Serial.begin(9600);
  pinMode(CLK_PIN, INPUT);
  pinMode(DT_PIN, INPUT);
  button.setDebounceTime(50); // set debounce time to 50 milliseconds

  // read the initial state of the rotary encoder's CLK pin
  prev_CLK_state = digitalRead(CLK_PIN);
}
  • Serial.begin(9600): Memulai komunikasi serial dengan kecepatan 9600 baud untuk menampilkan data di Serial Monitor.
  • pinMode(CLK_PIN, INPUT) dan pinMode(DT_PIN, INPUT): Mengonfigurasi pin CLK_PIN dan DT_PIN sebagai input, karena pin ini akan membaca sinyal dari rotary encoder.
  • button.setDebounceTime(50): Menetapkan waktu debounce tombol selama 50 milidetik, yang menghindari pembacaan ganda pada tombol saat ditekan atau dilepas.
  • prev_CLK_state = digitalRead(CLK_PIN): Membaca status awal dari pin CLK_PIN dan menyimpannya dalam prev_CLK_state. Ini diperlukan untuk mendeteksi perubahan status pada putaran encoder.

Fungsi loop():

void loop(){
  button.loop(); // MUST call the loop() function first
  • button.loop(): Fungsi ini harus dipanggil untuk memproses status tombol secara otomatis dan menangani debouncing. Fungsi ini harus dipanggil setiap kali dalam loop().

Pembacaan dan Deteksi Perubahan pada Pin CLK:

CLK_state = digitalRead(CLK_PIN);

// If the state of CLK is changed, then pulse occurred
// React to only the rising edge (from LOW to HIGH) to avoid double count
if (CLK_state != prev_CLK_state && CLK_state == HIGH) {
  • CLK_state = digitalRead(CLK_PIN): Membaca status saat ini dari pin CLK_PIN.
  • if (CLK_state != prev_CLK_state && CLK_state == HIGH): Mengecek jika status CLK_PIN berubah dari LOW ke HIGH, yang menandakan bahwa terjadi rising edge (perubahan dari keadaan LOW ke HIGH). Ini penting untuk mencegah pembacaan ganda atau kesalahan pembacaan jika perubahan status terjadi lebih dari satu kali dalam satu putaran.

Menentukan Arah Rotasi dan Menghitung Counter:

if (digitalRead(DT_PIN) == HIGH) {
  counter--;
  direction = DIRECTION_CCW;
} else {
  counter++;
  direction = DIRECTION_CW;
}
  • if (digitalRead(DT_PIN) == HIGH): Memeriksa status DT_PIN untuk menentukan arah rotasi encoder.
    • Jika DT_PIN HIGH, maka encoder berputar counter-clockwise (CCW), dan nilai counter dikurangi.
    • Jika DT_PIN LOW, maka encoder berputar clockwise (CW), dan nilai counter ditambahkan.

Menampilkan Arah Rotasi dan Hitungan Counter:

Serial.print("Rotary Encoder:: direction: ");
if (direction == DIRECTION_CW)
  Serial.print("CLOCKWISE");
else
  Serial.print("ANTICLOCKWISE");

Serial.print(" - count: ");
Serial.println(counter);
  • Serial.print() dan Serial.println() digunakan untuk menampilkan arah rotasi dan hitungan counter ke Serial Monitor. Arah rotasi dicetak sebagai “CLOCKWISE” atau “ANTICLOCKWISE”, dan nilai hitungan counter akan menambah atau mengurangi sesuai dengan arah rotasi.

Menyimpan Status CLK untuk Deteksi Perubahan Berikutnya:

prev_CLK_state = CLK_state;
  • Menyimpan status CLK_state untuk perbandingan pada putaran berikutnya, untuk mendeteksi perubahan pada sinyal.

Membaca Status Tombol:

if (button.isPressed()) {
  Serial.println("The button is pressed");
}
  • button.isPressed(): Mengecek apakah tombol pada encoder telah ditekan. Jika iya, maka pesan “The button is pressed” akan dicetak di Serial Monitor.

Ringkasan Fungsi Kode:

  1. Membaca Putaran Rotary Encoder:
    • Saat encoder diputar, status pin CLK akan berubah. Berdasarkan perubahan ini, sistem menghitung jumlah langkah rotasi dan arah rotasi (searah atau berlawanan arah jarum jam) dari encoder.
  2. Menampilkan Arah dan Hitungan:
    • Arah rotasi dan hitungan langkah ditampilkan di Serial Monitor.
  3. Membaca Tombol Tekan:
    • Jika tombol pada encoder ditekan, pesan yang menyatakan tombol telah ditekan akan ditampilkan.

untuk diskusi bisa kontak dibawah ini :

Sosial media :

Apa itu ESP32?