#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // Lebar layar OLED, dalam piksel
#define SCREEN_HEIGHT 64 // Tinggi layar OLED, dalam piksel
#define OLED_RESET -1 // Pin reset # (atau -1 jika menggunakan pin reset Arduino)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define ROTARY1_A_PIN 25 // Pin A dari Rotary Encoder 1
#define ROTARY1_B_PIN 26 // Pin B dari Rotary Encoder 1
#define ROTARY2_A_PIN 18 // Pin A dari Rotary Encoder 2
#define ROTARY2_B_PIN 19 // Pin B dari Rotary Encoder 2
volatile int rotary1Pos = 0; // Nilai posisi Rotary Encoder 1
volatile int rotary2Pos = 0; // Nilai posisi Rotary Encoder 2
void IRAM_ATTR rotary1Encoder() {
if (digitalRead(ROTARY1_A_PIN) == digitalRead(ROTARY1_B_PIN)) {
rotary1Pos++;
} else {
rotary1Pos--;
}
}
void IRAM_ATTR rotary2Encoder() {
if (digitalRead(ROTARY2_A_PIN) == digitalRead(ROTARY2_B_PIN)) {
rotary2Pos++;
} else {
rotary2Pos--;
}
}
void printTwoDigit(int num) {
if (num < 10) {
display.print("0");
} else if (num > 99) {
num /= 10;
}
display.print(num);
}
// Define the image data for the pause logo (6x6 pixels)
const unsigned char PROGMEM pause_logo[] = {
0b111111,
0b111111,
0b111111,
0b111111,
0b111111,
0b111111
};
// Define the image data for the play logo (6x6 pixels)
const unsigned char PROGMEM play_logo[] = {
0b000000,
0b100000,
0b110000,
0b111000,
0b111100,
0b111111
};
void setup() {
pinMode(ROTARY1_A_PIN, INPUT_PULLUP);
pinMode(ROTARY1_B_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(ROTARY1_A_PIN), rotary1Encoder, CHANGE);
pinMode(ROTARY2_A_PIN, INPUT_PULLUP);
pinMode(ROTARY2_B_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(ROTARY2_A_PIN), rotary2Encoder, CHANGE);
// Inisialisasi layar OLED
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Alamat 0x3C untuk 128x64
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
display.display();
delay(2000); // Delay 2 detik untuk menampilkan pesan selamat datang
display.clearDisplay();
}
void loop() {
// Tampilkan nilai Rotary Encoder pada layar OLED
display.clearDisplay();
display.setTextSize(1); // Ukuran font untuk nama
display.setTextColor(SSD1306_WHITE);
display.setCursor(12, 7);
display.println("RANGE");
display.setCursor(8, 24);
display.setTextSize(3); // Ukuran font untuk angka
printTwoDigit(rotary1Pos);
if (rotary1Pos < 100) {
display.setTextSize(1);
display.println("mm");
} else if (rotary1Pos > 99){
int lastDigit = rotary1Pos % 10;
display.setCursor(43, 28);
display.setTextSize(1);
display.print(".");
display.println(lastDigit);
display.setCursor(45, 38);
display.setTextSize(1);
display.println("cm");
}
//display.drawBitmap(58, 0, play_logo, 6, 6, WHITE); // Assuming the pause logo is 32x32 pixels
display.setCursor(80, 7);
display.setTextSize(1); // Kembali ke ukuran font untuk nama
display.println("SPEED");
display.setCursor(74, 24);
display.setTextSize(3); // Ukuran font untuk angka
if (rotary2Pos < 10) {
display.print("0");
} else if (rotary2Pos > 99){
display.setTextSize(2);
display.setCursor(74, 30);
}
display.print(rotary2Pos);
display.setTextSize(2);
display.setCursor(110, 30);
display.println("%");
display.display();
delay(100);
}