#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);
}