/*
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// 按鈕腳位
#define BT1 2 // 上
#define BT2 3 // 下
#define BT3 4 // 確認
#define BT4 5 // 返回
const char* menuItems[] = {"Class", "Number", "Name"};
const int menuSize = 3;
int menuIndex = 0;
bool inSubMenu = false;
// 防彈跳處理
const unsigned long debounceDelay = 150;
unsigned long lastPressTime_BT1 = 0;
unsigned long lastPressTime_BT2 = 0;
unsigned long lastPressTime_BT3 = 0;
unsigned long lastPressTime_BT4 = 0;
bool lastBT1 = HIGH;
bool lastBT2 = HIGH;
bool lastBT3 = HIGH;
bool lastBT4 = HIGH;
void setup() {
pinMode(BT1, INPUT_PULLUP);
pinMode(BT2, INPUT_PULLUP);
pinMode(BT3, INPUT_PULLUP);
pinMode(BT4, INPUT_PULLUP);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
for (;;); // 如果初始化失敗,卡住程式
}
displayMenu();
}
void loop() {
unsigned long now = millis();
// 讀取按鈕狀態
bool currentBT1 = digitalRead(BT1);
bool currentBT2 = digitalRead(BT2);
bool currentBT3 = digitalRead(BT3);
bool currentBT4 = digitalRead(BT4);
if (!inSubMenu) {
if (lastBT1 == HIGH && currentBT1 == LOW && (now - lastPressTime_BT1 > debounceDelay)) {
lastPressTime_BT1 = now;
moveCursorUp();
}
if (lastBT2 == HIGH && currentBT2 == LOW && (now - lastPressTime_BT2 > debounceDelay)) {
lastPressTime_BT2 = now;
moveCursorDown();
}
if (lastBT3 == HIGH && currentBT3 == LOW && (now - lastPressTime_BT3 > debounceDelay)) {
lastPressTime_BT3 = now;
displaySubMenu();
}
} else {
if (lastBT4 == HIGH && currentBT4 == LOW && (now - lastPressTime_BT4 > debounceDelay)) {
lastPressTime_BT4 = now;
inSubMenu = false;
displayMenu();
}
}
// 更新按鈕狀態
lastBT1 = currentBT1;
lastBT2 = currentBT2;
lastBT3 = currentBT3;
lastBT4 = currentBT4;
}
void moveCursorUp() {
menuIndex--;
if (menuIndex < 0) menuIndex = menuSize - 1;
displayMenu();
}
void moveCursorDown() {
menuIndex++;
if (menuIndex >= menuSize) menuIndex = 0;
displayMenu();
}
void displayMenu() {
display.clearDisplay();
display.setTextSize(2); // 字體放大
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
for (int i = 0; i < menuSize; i++) {
if (i == menuIndex) {
display.print("> ");
} else {
display.print(" ");
}
display.println(menuItems[i]);
}
display.display();
}
void displaySubMenu() {
display.clearDisplay();
display.setTextSize(2); // 字體放大
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
if (menuIndex == 0) display.println("Class: I2A");
else if (menuIndex == 1) display.println("Number: 48");
else if (menuIndex == 2) display.println("Name: Jackson_Li");
display.display();
inSubMenu = true;
}
*/
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// 按鈕腳位
#define BT1 2 // 上
#define BT2 3 // 下
#define BT3 4 // 確認
#define BT4 5 // 返回
const char* menuItems[] = {"Leader", "Beauty", "Assistant"};
const int menuSize = 3;
int menuIndex = 0;
bool inSubMenu = false;
// 防彈跳處理
const unsigned long debounceDelay = 150;
unsigned long lastPressTime_BT1 = 0;
unsigned long lastPressTime_BT2 = 0;
unsigned long lastPressTime_BT3 = 0;
unsigned long lastPressTime_BT4 = 0;
bool lastBT1 = HIGH;
bool lastBT2 = HIGH;
bool lastBT3 = HIGH;
bool lastBT4 = HIGH;
void setup() {
pinMode(BT1, INPUT_PULLUP);
pinMode(BT2, INPUT_PULLUP);
pinMode(BT3, INPUT_PULLUP);
pinMode(BT4, INPUT_PULLUP);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
for (;;); // 如果初始化失敗,卡住程式
}
displayMenu();
}
void loop() {
unsigned long now = millis();
// 讀取按鈕狀態
bool currentBT1 = digitalRead(BT1);
bool currentBT2 = digitalRead(BT2);
bool currentBT3 = digitalRead(BT3);
bool currentBT4 = digitalRead(BT4);
if (!inSubMenu) {
if (lastBT1 == HIGH && currentBT1 == LOW && (now - lastPressTime_BT1 > debounceDelay)) {
lastPressTime_BT1 = now;
moveCursorUp();
}
if (lastBT2 == HIGH && currentBT2 == LOW && (now - lastPressTime_BT2 > debounceDelay)) {
lastPressTime_BT2 = now;
moveCursorDown();
}
if (lastBT3 == HIGH && currentBT3 == LOW && (now - lastPressTime_BT3 > debounceDelay)) {
lastPressTime_BT3 = now;
displaySubMenu();
}
} else {
if (lastBT4 == HIGH && currentBT4 == LOW && (now - lastPressTime_BT4 > debounceDelay)) {
lastPressTime_BT4 = now;
inSubMenu = false;
displayMenu();
}
}
// 更新按鈕狀態
lastBT1 = currentBT1;
lastBT2 = currentBT2;
lastBT3 = currentBT3;
lastBT4 = currentBT4;
}
void moveCursorUp() {
menuIndex--;
if (menuIndex < 0) menuIndex = menuSize - 1;
displayMenu();
}
void moveCursorDown() {
menuIndex++;
if (menuIndex >= menuSize) menuIndex = 0;
displayMenu();
}
void displayMenu() {
display.clearDisplay();
display.setTextSize(1.5); // 字體放大
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
for (int i = 0; i < menuSize; i++) {
if (i == menuIndex) {
display.print("> ");
} else {
display.print(" ");
}
display.println(menuItems[i]);
}
display.display();
}
void displaySubMenu() {
display.clearDisplay();
display.setTextSize(1.5); // 字體放大
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
if (menuIndex == 0) display.println("11-Jack_Lin");
else if (menuIndex == 1) display.println("31-Penny_Yang");
else if (menuIndex == 2) display.println("44-Hubert_Hu");
display.display();
inSubMenu = true;
}