#include <Wire.h>
#include <GyverOLED.h>
#include <GyverDS3231.h>
GyverDS3231 ds;
//#include <DS3231.h>
GyverOLED<SSD1306_128x64, OLED_NO_BUFFER> oled;
//DS3231 clock;
#define BTN_1 14
#define BTN_2 15
#define BTN_3 16
#define BTN_4 17
#define MENU_MAIN 0
#define MENU_FAN 1
#define MENU_TRAFFIC 2
#define MENU_DS3231 3
#define SUBMENU_COUNT 3
int currentMenu = MENU_MAIN;
int submenuItemIndex = 0;
int previousMenu = MENU_MAIN;
int previousSubmenuItemIndex = 0;
char newkey, oldkey;
int ledState = 0;
int nowtimedis = 0;
void switchkey() {
newkey = ReadKey();
if (newkey != oldkey) {
oled.update();
if (newkey == 1) { submenuItemIndex = (2 + submenuItemIndex) % 3; }
if (newkey == 8) { submenuItemIndex = (1 + submenuItemIndex) % 3; }
if (newkey == 2) {
if (currentMenu == MENU_MAIN) {
previousMenu = currentMenu;
previousSubmenuItemIndex = submenuItemIndex;
if (submenuItemIndex == 0) {
currentMenu = MENU_FAN;
} else if (submenuItemIndex == 1) {
currentMenu = MENU_TRAFFIC;
} else if (submenuItemIndex == 2) {
currentMenu = MENU_DS3231;
}
submenuItemIndex = 0;
} else if (currentMenu == MENU_FAN) {
if (submenuItemIndex == 0) {
// Handle FAN SPEED 1 logic
} else if (submenuItemIndex == 1) {
// Handle FAN SPEED 2 logic
} else if (submenuItemIndex == 2) {
currentMenu = previousMenu;
submenuItemIndex = previousSubmenuItemIndex;
}
} else if (currentMenu == MENU_TRAFFIC) {
if (submenuItemIndex == 0) {
// Handle TRAFFIC MODE 1 logic
} else if (submenuItemIndex == 1) {
// Handle TRAFFIC MODE 2 logic
} else if (submenuItemIndex == 2) {
currentMenu = previousMenu;
submenuItemIndex = previousSubmenuItemIndex;
}
} else if (currentMenu == MENU_DS3231) {
if (submenuItemIndex == 0) {
nowtimedis = 1; // Handle SYSTEM <-TIME logic
oled.clear();
} else if (submenuItemIndex == 1) {
// Handle SYSTEM ->RPM logic
} else if (submenuItemIndex == 2) {
currentMenu = previousMenu;
submenuItemIndex = previousSubmenuItemIndex;
}
}
}
if (newkey == 4) {
nowtimedis = 0;
oled.clear();
if (currentMenu != MENU_MAIN) {
currentMenu = previousMenu;
submenuItemIndex = previousSubmenuItemIndex;
}
}
}
oldkey = newkey;
}
char ReadKey() {
char key = 0;
if (digitalRead(BTN_1) == LOW) key |= 1;
if (digitalRead(BTN_2) == LOW) key |= 2;
if (digitalRead(BTN_3) == LOW) key |= 4;
if (digitalRead(BTN_4) == LOW) key |= 8;
return key;
}
void updateDisplay() {
oled.setScale(2);
oled.invertText(false);
oled.setCursorXY(0, 0);
if (currentMenu == MENU_MAIN) {
oled.print(" MENU ");
displaySubMenuItems("LEDCON1", "LEDCON2", "DS3231 ");
} else if (currentMenu == MENU_FAN) {
oled.print("LEDCON1");
displaySubMenuItems("SPEED 1", "SPEED 2", "RETURN ");
} else if (currentMenu == MENU_TRAFFIC) {
oled.print("LEDCON2");
displaySubMenuItems("MODE 1 ", "MODE 2 ", "RETURN ");
} else if (currentMenu == MENU_DS3231) {
oled.print("DS3231 ");
displaySubMenuItems("NOWTIME", "SETTIME", "RETURN ");
}
oled.update();
}
void displaySubMenuItems(const char *item1, const char *item2, const char *item3) {
char items[3][10];
strcpy(items[0], item1);
strcpy(items[1], item2);
strcpy(items[2], item3);
for (int i = 0; i < 3; i++) {
oled.setCursorXY(0, (i + 1) * 16);
if (submenuItemIndex == i) {
oled.invertText(true);
} else {
oled.invertText(false);
}
oled.print(items[i]);
}
}
void disTimeTemp() {
Datime now(ds);
Serial.println(now.second);
Serial.println(now.minute);
float temperature = ds.getTemp(); // 修正為正確的溫度讀取方法
oled.setScale(2);
oled.setCursorXY(0, 0);
oled.print(now.year);
oled.print("-");
oled.print(now.month);
oled.print("-");
oled.print(now.day);
oled.setCursorXY(0, 16);
oled.print("T:");
if (now.hour < 10) {
oled.print('0');
oled.print(now.hour);
} else {
oled.print(now.hour);
}
oled.print(":");
if (now.minute < 10) {
oled.print('0');
oled.print(now.minute);
} else {
oled.print(now.minute);
}
oled.print(":");
if (now.second < 10) {
oled.print('0');
oled.print(now.second);
} else {
oled.print(now.second);
}
oled.setCursorXY(0, 32);
oled.print("Temp:");
oled.print(temperature);
oled.update();
}
void controlLEDs() {
// 控制LEDs的邏輯在此實現
}
void setup() {
pinMode(BTN_1, INPUT_PULLUP);
pinMode(BTN_2, INPUT_PULLUP);
pinMode(BTN_3, INPUT_PULLUP);
pinMode(BTN_4, INPUT_PULLUP);
Serial.begin(115200);
oled.init();
oled.clear();
oled.update();
Wire.begin();
if (!ds.begin()) ds.setBuildTime();
}
void loop() {
switchkey();
if (nowtimedis == 0) updateDisplay();
else disTimeTemp();
controlLEDs();
if (ds.tick()) {
Serial.println(ds.toString());
float temp = ds.getTemp();
Serial.println(temp);
}
}