/*
#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 (;;);
}
displayBootScreen(); // 開機動畫
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 displayBootScreen() {
for (int i = 0; i < 6; i++) { // 閃爍 6 次
display.clearDisplay();
if (i % 2 == 0) {
display.setTextSize(3);
display.setTextColor(SSD1306_WHITE);
int16_t x, y;
uint16_t w, h;
display.getTextBounds("CTAS", 0, 0, &x, &y, &w, &h);
int centerX = (SCREEN_WIDTH - w) / 2;
int centerY = (SCREEN_HEIGHT - h) / 2;
display.setCursor(centerX, centerY);
display.print("CTAS");
}
display.display();
delay(500);
}
}
void moveCursorUp() {
menuIndex--;
if (menuIndex < 0) menuIndex = menuSize - 1;
displayMenu();
}
void moveCursorDown() {
menuIndex++;
if (menuIndex >= menuSize) menuIndex = 0;
displayMenu();
}
void displayMenu() {
display.clearDisplay();
// 標題 Menu(置中)
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
int16_t x, y;
uint16_t w, h;
display.getTextBounds("Menu", 0, 0, &x, &y, &w, &h);
int centerX = (SCREEN_WIDTH - w) / 2;
display.setCursor(centerX, 0);
display.println("Menu");
display.drawLine(0, 10, SCREEN_WIDTH, 10, SSD1306_WHITE); // 標題下劃線
// 顯示選單(反白選項)
for (int i = 0; i < menuSize; i++) {
int itemY = 12 + i * 10;
if (i == menuIndex) {
// 黑底白字反白選項
display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.fillRect(0, itemY, SCREEN_WIDTH, 10, SSD1306_WHITE);
} else {
// 正常白字
display.setTextColor(SSD1306_WHITE, SSD1306_BLACK);
}
display.setCursor(0, itemY);
display.print(menuItems[i]);
}
display.display();
}
void displaySubMenu() {
display.clearDisplay();
display.setTextSize(1);
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[] = {"Black tea","Green tea","Milk tea","Pearl milk tea","Winter melon lemon"};
const int menuSize = 5;
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 (;;);
}
displayBootScreen(); // 開機動畫
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 displayBootScreen() {
for (int i = 0; i < 6; i++) { // 閃爍 6 次
display.clearDisplay();
if (i % 2 == 0) {
display.setTextSize(3);
display.setTextColor(SSD1306_WHITE);
int16_t x, y;
uint16_t w, h;
display.getTextBounds("E2B", 0, 0, &x, &y, &w, &h);
int centerX = (SCREEN_WIDTH - w) / 2;
int centerY = (SCREEN_HEIGHT - h) / 2;
display.setCursor(centerX, centerY);
display.println("E2B");
}
display.display();
delay(500);
}
}
void moveCursorUp() {
menuIndex--;
if (menuIndex < 0) menuIndex = menuSize - 1;
displayMenu();
}
void moveCursorDown() {
menuIndex++;
if (menuIndex >= menuSize) menuIndex = 0;
displayMenu();
}
void displayMenu() {
display.clearDisplay();
// 標題 Menu(置中)
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
int16_t x, y;
uint16_t w, h;
display.getTextBounds("Tea Drink", 0, 0, &x, &y, &w, &h);
int centerX = (SCREEN_WIDTH - w) / 2;
display.setCursor(centerX, 0);
display.println("Tea Drink");
display.drawLine(0, 10, SCREEN_WIDTH, 10, SSD1306_WHITE); // 標題下劃線
// 顯示選單(反白選項)
for (int i = 0; i < menuSize; i++) {
int itemY = 12 + i * 10;
if (i == menuIndex) {
// 黑底白字反白選項
display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.fillRect(0, itemY, SCREEN_WIDTH, 10, SSD1306_WHITE);
} else {
// 正常白字
display.setTextColor(SSD1306_WHITE, SSD1306_BLACK);
}
display.setCursor(0, itemY);
display.print(menuItems[i]);
}
display.display();
}
void displaySubMenu() {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
if (menuIndex == 0) display.println("Black tea-$30");
else if (menuIndex == 1) display.println("Green tea-30");
else if (menuIndex == 2) display.println("Milk tea-40");
else if (menuIndex == 3) display.println("Pearl milk tea-50");
else if (menuIndex == 4) display.println("Winter melon lemon-55");
display.display();
inSubMenu = true;
}