#include <U8g2lib.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#define ENCODER_CLK 2 // CLK pin van de rotary encoder
#define ENCODER_DT 3 // DT pin van de rotary encoder
#define BUTTON_SW 4 // SW (push button) pin van de rotary encoder
#define ldr A7
#define ALIGN_CENTER(t) ((76 - u8g2.getUTF8Width(t) )/ 2)
#define ALIGN_LEFT 0
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
volatile int encoderPos = 0;
int lastEncoderPos = 0;
unsigned long lastInterruptTime = 0;
unsigned long debounceDelay = 20; // Vertraging tegen debouncing
int item_selected = 0; // which item in the menu is selected
int currentPage = 0; // เพจปัจจุบัน
const char* speedTestMenu[] = {"START","EXIT"};
bool speedTeststatus = false;
bool breakInrun = false;
bool pauseState = false;
void setup() {
u8g2.begin();
Serial.begin(9600);
u8g2.setPowerSave(0);
u8g2.setDrawColor(1);
u8g2.setBitmapMode(0);
u8g2.setFont(u8g2_font_helvR08_tr);
pinMode(ENCODER_CLK, INPUT_PULLUP);
pinMode(ENCODER_DT, INPUT_PULLUP);
pinMode(BUTTON_SW, INPUT_PULLUP);
pinMode(ldr, INPUT);
attachInterrupt(digitalPinToInterrupt(ENCODER_CLK), handleEncoder, CHANGE);
}
void handleEncoder() {
unsigned long currentMillis = millis();
if (currentMillis - lastInterruptTime > debounceDelay) {
int CLKstate = digitalRead(ENCODER_CLK);
int DTstate = digitalRead(ENCODER_DT);
if (CLKstate == DTstate) {
item_selected--;
} else {
item_selected++;
}
lastInterruptTime = currentMillis;
}
}
void buttonClicked() {
int buttonState = digitalRead(BUTTON_SW);
if (buttonState == LOW) {
switch (currentPage) {
case 0:
if (item_selected == 0) {
if (speedTeststatus == false) {
Serial.println("Speed Test Run");
speedTeststatus = true;
} else {
Serial.println("Speed Test Stop");
speedTeststatus = false;
}
}/*
if (item_selected == 1) {
Serial.println("Button 2 Push!");
} else {}*/
break;
case 1:
break;
}
delay(5);
}
}
void loop() {
u8g2.clearBuffer(); // required for page drawing mode for u8g2 library
u8g2.setDrawColor(1);
u8g2.setBitmapMode(0);
u8g2.setFont(u8g2_font_courB08_tr);
buttonClicked();
u8g2.firstPage();
do {
switch (currentPage) {
case 0: //Speed Test UI
speedTestUI();
speedTestButton();
break;
}
u8g2.sendBuffer(); // send buffer from RAM to display controller
} while ( u8g2.nextPage() );
}
void speedTestUI() {
unsigned int RPM_data = analogRead(ldr);
int RPM_out = RPM_data * 10 ;
String RPM_s = String(RPM_out);
u8g2.drawLine(78, 1, 78, 64);
u8g2.setFont(u8g2_font_courB08_tr);
u8g2.drawButtonUTF8(37, 8, U8G2_BTN_HCENTER|U8G2_BTN_BW0, 74, 3, 1, "SPEED TEST" );
u8g2.drawBox(0,10,77,28);
u8g2.setFont(u8g2_font_crox4hb_tr);
u8g2.setCursor(ALIGN_CENTER(String(RPM_out).c_str()), 30 );
u8g2.setDrawColor(0);
u8g2.print(RPM_out);
u8g2.setDrawColor(1);
u8g2.setFont(u8g2_font_courB08_tr);
u8g2.drawButtonUTF8(37, 44, U8G2_BTN_HCENTER|U8G2_BTN_INV|U8G2_BTN_BW0, 74, 3, 0, "RPM" );
u8g2.setFont(u8g2_font_7x14B_tf);
u8g2.drawButtonUTF8(12, 59, U8G2_BTN_HCENTER|U8G2_BTN_BW1, 20, 1, 1, "3V" );
u8g2.drawButtonUTF8(51, 59, U8G2_BTN_HCENTER|U8G2_BTN_BW1, 47, 1, 1, "00:10" );
// Serial.print(RPM_out);
// Serial.println(" RPM");
}
void speedTestButton() {
if (speedTeststatus == false) {speedTestMenu[0] = "START";}
else {speedTestMenu[0] = "STOP";}
int menuCount = sizeof(speedTestMenu) / sizeof(speedTestMenu[0]);
if (item_selected > menuCount - 1) {
item_selected = 0;
}
else if (item_selected < 0) {
item_selected = menuCount - 1;
}
int buttonWidth = 36;
int buttonHeight = 16;
int buttonSpacing = 3;
int xPos = 103;
int yPos = 14;
u8g2.setFont(u8g2_font_courB08_tr);
for (int i = 0; i < menuCount; i++) {
if (item_selected == i) {
u8g2.drawButtonUTF8(xPos, yPos, U8G2_BTN_HCENTER|U8G2_BTN_BW0|U8G2_BTN_XFRAME , buttonWidth, buttonSpacing, buttonSpacing, speedTestMenu[i] );
}
else {
u8g2.drawButtonUTF8(xPos, yPos, U8G2_BTN_HCENTER|U8G2_BTN_BW0 , buttonWidth, buttonSpacing, buttonSpacing, speedTestMenu[i] );
}
// Move to next button position
yPos += buttonHeight + buttonSpacing;
}
}