/* * 夜間 + 超音波50公分雙感應 + 非阻塞控制繼電器開關1分鐘 * 作者:忠憲老師專用版本 */
int a = 0; // 超音波距離變數int b = 0; // 光敏電阻變數bool relayOn = false; // 紀錄繼電器狀態unsigned long relayStart = 0; // 紀錄繼電器啟動時間const unsigned long relayDuration = 60000; // 繼電器開啟時間(毫秒)= 1分鐘
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); pinMode(A0, INPUT); // 光敏電阻 pinMode(2, OUTPUT); // 繼電器控制腳 pinMode(13, OUTPUT); // 狀態指示LED(可選)}
void loop() { // --- 感測讀值 --- a = 0.01723 * readUltrasonicDistance(7, 8); // 建議分開腳位 b = analogRead(A0);
Serial.print("距離(cm): "); Serial.println(a); Serial.print("亮度值: "); Serial.println(b);
unsigned long currentTime = millis();
// --- 感測條件:夜間 + 近距離 --- if (b > 500 && a <= 50 && !relayOn) { relayOn = true; relayStart = currentTime; digitalWrite(2, HIGH); // 啟動繼電器 digitalWrite(13, HIGH); // 指示LED亮 Serial.println("⚡ 繼電器啟動"); }
// --- 控制時間到期後自動關閉 --- if (relayOn && (currentTime - relayStart >= relayDuration)) { relayOn = false; digitalWrite(2, LOW); digitalWrite(13, LOW); Serial.println("🔚 繼電器關閉"); }
delay(200); // 每0.2秒更新一次感測(可依需要調整)}