#include <ezButton.h> // the library to use for SW pin
#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h> // library requires for IIC communication
//## ENCODER FUNCTIONS ###
#define CLK_PIN 25 // ESP32 pin GPIO25 connected to the rotary encoder's CLK pin
#define DT_PIN 26 // ESP32 pin GPIO26 connected to the rotary encoder's DT pin
#define SW_PIN 27 // ESP32 pin GPIO27 connected to the rotary encoder's SW pin
#define DIRECTION_CW 0 // clockwise direction
#define DIRECTION_CCW 1 // counter-clockwise direction
int counter = 0;
int direction = DIRECTION_CW;
int CLK_state;
int prev_CLK_state;
int button_active = 0;
int screen_state = 1; // 1: volume, 2: PS, 3 AI
int icon_number = 3; // number of total icons
ezButton button(SW_PIN); // create ezButton object that attach to pin 7;
//### OLED SCREEN FUNCTIONS
//OLED Setup
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); // initialization for the used OLED display
// Icons for OLED
void setup() {
Serial.begin(9600);
//## ENCODER FUNCTIONS ###
// configure encoder pins as inputs
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);
//### OLED SCREEN FUNCTIONS
// start the u8g2library for the screen
u8g2.begin();
}
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;
// Check if the button is active
if (button_active == 0){ // if the button is not active
if (screen_state == 1){ // check if first
screen_state = icon_number; //return back to last
}
else{
screen_state--; // scroll back
}
}
}
else {
// the encoder is rotating in clockwise direction => increase the counter
counter++;
direction = DIRECTION_CW;
// Check if the button is active
if (button_active == 0){ // if the button is not active
if (screen_state == icon_number){ // check if last icon
screen_state = 1; //return back to beginning
}
else{
screen_state++; // scroll to next
}
}
}
Serial.print("Rotary Encoder:: direction: ");
if (direction == DIRECTION_CW)
Serial.print("Clockwise");
else
Serial.print("Counter-clockwise");
Serial.print(" - count: ");
Serial.println(counter);
Serial.print(" - screen_state: ");
Serial.println(screen_state);
// Show different things on display depending on the state
if (button_active == 0 && screen_state == 1){ //Volume Active
Serial.println("VolumeS Active");
}
else if (button_active == 0 && screen_state == 2){ //PS Active
Serial.println("PS Active");
}
else if (button_active == 0 && screen_state == 3){ //AI Active
Serial.println("AI Active");
}
}
// save last CLK state
prev_CLK_state = CLK_state;
if (button.isPressed()) {
// Toggle button_active state
button_active = !button_active;
Serial.print("Button Active: ");
Serial.println(button_active);
}
//Serial.print("Button Active: ");
//Serial.println(button_active);
//Serial.print(" - screen_state: ");
//Serial.println(screen_state);
/*
//### SCREEN DISPLAY ###
// Show different things on display depending on the state
if (button_active == 1 && screen_state == 1){ //Volume Active
Serial.println("VolumeS Active");
}
else if (button_active == 1 && screen_state == 2){ //PS Active
Serial.println("PS Active");
}
else if (button_active == 1 && screen_state == 3){ //AI Active
Serial.println("AI Active");
}
*/
}