#include <Arduino.h>
#include <LiquidCrystal_I2C.h>
#define BUZZER_PIN 23 // 蜂鳴器連接的GPIO針腳
#define GRNBUTTON_PIN 14 // 綠按鈕連接的GPIO針腳
#define REDBUTTON_PIN 13 // EMS按鈕連接的GPIO針腳
#define POT_PIN 34 // 可變電阻連接的ADC針腳
#define relay 26 // 繼電器連接的GPIO針腳(請使用常開)
LiquidCrystal_I2C lcd(0x27, 16, 2); // 初始化 1602 I2C
int countdownSeconds = 60; // 預設倒數時間(秒)
int potValue = 0; // 可變電阻的讀值
unsigned long startTime;
bool countdownActive = false; // 預設倒數計時關閉
void setup() {
Serial.begin(115200);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(GRNBUTTON_PIN, INPUT_PULLUP);
pinMode(REDBUTTON_PIN, INPUT_PULLUP);
pinMode(relay, OUTPUT);
lcd.init(); // 初始化LCD
lcd.backlight(); // 開啟LCD背光
digitalWrite(BUZZER_PIN, LOW); // 初始化蜂鳴器
digitalWrite(relay, LOW); // 初始化繼電器
startTime = millis(); // 設定計時時間
}
void loop() {
potValue = analogRead(POT_PIN); // 讀取可變電阻數值
// 將可變電阻值顯示到倒數計時時間及設定最大/最小時間(目前是0~20分鐘)
countdownSeconds = map(potValue, 0, 4095, 1, 1200);
if (digitalRead(GRNBUTTON_PIN) == LOW) { // 如果按下開始按鈕
lcd.clear(); // 清空LCD畫面
lcd.setCursor(0, 0);
lcd.println("Start "); // LCD顯示"Start"
Serial.println("Start");
startTime = millis(); // 重製時間
countdownActive = true; // 倒數計時開始
digitalWrite(relay, HIGH); // 繼電器接合
delay(1000); // 去除按鈕抖動
}
if (digitalRead(REDBUTTON_PIN) == LOW){ // 如果按下EMS
lcd.clear(); // 清空LCD畫面
lcd.setCursor(0, 0);
lcd.println("Stop ALL "); // LCD顯示"Stop ALL"
Serial.println("Stop ALL");
startTime = millis(); // 重製時間
countdownActive = false; // 倒數計時結束
digitalWrite(relay, LOW); // 繼電器停止接合
delay(1000); // 去除按鈕抖動
}
if (countdownActive) {
// 計算已經過的時間
unsigned long elapsedTime = (millis() - startTime) / 1000;
// 因為Start那佔了1s,所以這裡減1s
int remainingTime = countdownSeconds - elapsedTime;
if (remainingTime <= 0) {
countdownActive = false; // 停止倒數計時
digitalWrite(BUZZER_PIN, HIGH); // 蜂鳴器開啟
lcd.clear(); // 清空LCD畫面
lcd.setCursor(0, 0);
lcd.println("Time's up! "); // LCD顯示"Time's up!"
Serial.println("Time's up!");
digitalWrite(relay, LOW); // 繼電器停止接合
delay(1000); // 蜂鳴器響一秒
digitalWrite(BUZZER_PIN, LOW); // 關閉蜂鳴器
}
// 顯示目前倒數計時時間到LCD
lcd.setCursor(0,0);
lcd.println("Remaining Time:"); // LCD顯示"Remaining Time:"
Serial.println("Remaining Time:");
lcd.setCursor(0,1);
lcd.println(remainingTime); // 顯示剩餘時間
Serial.println(remainingTime);
lcd.println(" s");
}else{
// 設定倒數時間
lcd.setCursor(0, 0);
lcd.println("Set Time: "); // LCD顯示"Set Time:"
Serial.println("Set Time:");
lcd.setCursor(0, 1);
lcd.println(countdownSeconds); // 顯示設定時間
Serial.println(countdownSeconds);
lcd.println(" s");
}
delay(100); // 防止一直重複計時
}