/* * 夜間 + 超音波50公分雙感應 + 非阻塞控制繼電器開關1分鐘 * + LCD顯示 + 蜂鳴器提示音 * 作者:忠憲老師專用版本 */
#include <LiquidCrystal.h>
// LCD 腳位設定 (RS, E, D4, D5, D6, D7)LiquidCrystal lcd(12, 11, 10, 9, 4, 3);
int a = 0; // 超音波距離變數int b = 0; // 光敏電阻變數bool relayOn = false; // 紀錄繼電器狀態unsigned long relayStart = 0; // 紀錄繼電器啟動時間const unsigned long relayDuration = 60000; // 繼電器開啟時間(1分鐘)
// 🔹 超音波腳位設定const int trigPin = 7;const int echoPin = 8;
// 🔹 光敏電阻腳位const int ldrPin = A0;
// 🔹 繼電器與LEDconst int relayPin = 2;const int ledPin = 13;
// 🔹 蜂鳴器腳位(非PWM也可)const int buzzerPin = 6;
long readUltrasonicDistance(int triggerPin, int echoPin) { pinMode(triggerPin, OUTPUT); digitalWrite(triggerPin, LOW); delayMicroseconds(2); digitalWrite(triggerPin, HIGH); delayMicroseconds(10); digitalWrite(triggerPin, LOW); pinMode(echoPin, INPUT); return pulseIn(echoPin, HIGH);}
void beep(int times, int duration) { for (int i = 0; i < times; i++) { tone(buzzerPin, 1000); // 發出1kHz音 delay(duration); noTone(buzzerPin); delay(100); }}
void setup() { Serial.begin(9600);
// LCD 初始化 lcd.begin(16, 2); lcd.print("夜間雙感應系統");
pinMode(ldrPin, INPUT); pinMode(relayPin, OUTPUT); pinMode(ledPin, OUTPUT); pinMode(buzzerPin, OUTPUT);
delay(1000); lcd.clear();}
void loop() { // --- 感測讀值 --- a = 0.01723 * readUltrasonicDistance(trigPin, echoPin); // cm b = analogRead(ldrPin); // 亮度 0~1023 unsigned long currentTime = millis();
// --- 顯示 --- lcd.setCursor(0, 0); lcd.print("距離:"); lcd.print(a); lcd.print("cm "); lcd.setCursor(0, 1); lcd.print("亮度:"); lcd.print(b); lcd.print(" ");
Serial.print("距離(cm): "); Serial.println(a); Serial.print("亮度值: "); Serial.println(b);
// --- 感測條件:夜間 + 近距離 --- if (b > 500 && a <= 50 && !relayOn) { relayOn = true; relayStart = currentTime; digitalWrite(relayPin, HIGH); digitalWrite(ledPin, HIGH);
Serial.println("⚡ 繼電器啟動"); lcd.clear(); lcd.print("⚡ 繼電器啟動中");
// 🔔 蜂鳴提示(啟動時嗶一聲) beep(1, 200); }
// --- 時間到期自動關閉 --- if (relayOn && (currentTime - relayStart >= relayDuration)) { relayOn = false; digitalWrite(relayPin, LOW); digitalWrite(ledPin, LOW);
Serial.println("🔚 繼電器關閉"); lcd.clear(); lcd.print("🔚 繼電器關閉");
// 🔔 蜂鳴提示(關閉時嗶嗶兩聲) beep(2, 150); delay(1000); // 顯示提示1秒 }
delay(300); // 每0.3秒更新一次}