/* * 夜間 + 超音波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;
// 🔹 繼電器控制腳位const int relayPin = 2;
// 🔹 狀態LED(可選)const int ledPin = 13;
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 setup() { Serial.begin(9600);
// LCD 初始化 lcd.begin(16, 2); lcd.print("夜間雙感應系統");
pinMode(ldrPin, INPUT); pinMode(relayPin, OUTPUT); pinMode(ledPin, OUTPUT);
delay(1000); lcd.clear();}
void loop() { // --- 感測讀值 --- a = 0.01723 * readUltrasonicDistance(trigPin, echoPin); // 距離 cm b = analogRead(ldrPin); // 光敏電阻值 (0~1023) unsigned long currentTime = millis();
// --- 顯示在 LCD --- 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("⚡ 繼電器啟動中"); }
// --- 控制時間到期後自動關閉 --- if (relayOn && (currentTime - relayStart >= relayDuration)) { relayOn = false; digitalWrite(relayPin, LOW); digitalWrite(ledPin, LOW);
Serial.println("🔚 繼電器關閉"); lcd.clear(); lcd.print("🔚 繼電器關閉"); delay(1000); // 顯示1秒提示 }
delay(300); // 每0.3秒更新感測}