#include <TM1637Display.h>
#include <U8glib.h>
// TM1637 7-segment 디스플레이 설정 (CLK -> D3, DIO -> D4)
const int CLK = 3;
const int DIO = 4;
TM1637Display tmDisplay(CLK, DIO);
// OLED 디스플레이 객체 (I2C 인터페이스, SSD1306 128x64)
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);
// 조이스틱 핀 설정
const int JOY_X = A1;
const int JOY_Y = A2;
int joyXValue = 0;  // 조이스틱 X축 값
int joyYValue = 0;  // 조이스틱 Y축 값
int totalValue = 0; // 조이스틱의 총합
void setup() {
    Serial.begin(9600);
    // TM1637 7-segment 초기화 (최대 밝기)
    tmDisplay.setBrightness(0x0f);
    // 조이스틱 핀 모드 설정
    pinMode(JOY_X, INPUT);
    pinMode(JOY_Y, INPUT);
}
void loop() {
    readAnalogValues(); // 조이스틱 X, Y값 읽기
    calculatePlusXY();  // 조이스틱 + 방향 값 계산
    calculateMinusXY(); // 조이스틱 - 방향 값 계산
    printOLED();        // OLED에 totalValue 값 표시
    print7Seg();        // 7-segment에 totalValue 값 표시
    printSerial();      // 시리얼 모니터에 totalValue 값 출력
    delay(5);         // 화면 갱신을 위한 딜레이 (100ms)
}
void readAnalogValues() {
    joyXValue = analogRead(JOY_X);
    joyYValue = analogRead(JOY_Y);
}
void calculatePlusXY() {
    // X축 오른쪽 이동이면 + 값 계산
    if (joyXValue > 600) {
        totalValue++;
    }
    // Y축 위쪽 이동이면 + 값 계산
    if (joyYValue > 600) {
        totalValue++;
    }
}
void calculateMinusXY() {
    // X축 왼쪽 이동이면 - 값 계산
    if (joyXValue < 400) {
        totalValue--;
    }
    // Y축 아래쪽 이동이면 - 값 계산
    if (joyYValue < 400) {
        totalValue--;
    }
}
void printOLED() {
    // OLED 초기화 및 출력
    u8g.firstPage();
    do {
        // 폰트를 기존 대비 2배 크기로 변경 (예: u8g_font_fub20r)
        u8g.setFont(u8g_font_fub20r);
        char buf[20];
        // 4자리 숫자로 표시 (공백 채움, 0채움은 "%04d")
        sprintf(buf, "%4d", totalValue);
        // 문자열 가로 폭을 계산해 중앙 정렬 (디스플레이 폭: 128)
        int x = (128 - u8g.getStrWidth(buf)) / 2;
        // 폰트 높이를 20으로 가정하여 세로 중앙 (디스플레이 높이: 64)
        int y = (64 + 20) / 2;
        u8g.drawStr(x, y, buf);
    } while (u8g.nextPage());
}
void print7Seg() {
    // TM1637 7-segment 에 totalValue 값 4자리로 표시 (true: 공백 대신 0 채움)
    tmDisplay.showNumberDec(totalValue, true, 4, 0);
}
void printSerial() {
    Serial.print("Total Value: ");
    Serial.println(totalValue);
}