- UID
- 373967
- 帖子
- 8867
- 主題
- 2609
- 精華
- 0
- 積分
- 1000
- 楓幣
- 15
- 威望
- 977
- 存款
- 34822
- 贊助金額
- 0
- 推廣
- 0
- GP
- 1205
- 閱讀權限
- 70
- 在線時間
- 455 小時
- 註冊時間
- 2023-1-12
- 最後登入
- 2024-11-22
|
使用單片機ATtiny85製作延時關閉開關
程式碼:
int switchPin = 2; // 開關輸入引腳
int relayPin = 3; // 繼電器控制引腳
int switchState = 0; // 開關狀態(0為關閉,1為開啟)
unsigned long lastSwitchTime = 0; // 開關最後一次改變時間
unsigned long delayTime = 10 * 60 * 1000; // 延時時間,10分鐘
void setup() {
pinMode(switchPin, INPUT_PULLUP);
pinMode(relayPin, OUTPUT);
}
void loop() {
// 讀取開關狀態
int newSwitchState = digitalRead(switchPin);
if (newSwitchState != switchState) {
switchState = newSwitchState;
lastSwitchTime = millis();
}
// 檢查是否需要延時關閉
if (switchState == HIGH && (millis() - lastSwitchTime >= delayTime)) {
digitalWrite(relayPin, HIGH); // 關閉燈具
}
}
在這個程式碼中,我們使用了單片機ATtiny85的GPIO輸入腳位來檢測開關狀態,以及GPIO輸出腳位控制繼電器的開關。
在setup()函數中,我們設置了GPIO輸入和輸出腳位的模式,並初始化了開關狀態和最後一次開關改變的時間。
在loop()函數中,我們先讀取開關狀態,如果開關狀態改變了,我們就更新最後一次開關改變的時間。接下來,我們檢查開關狀態是否為開啟狀態且是否已經過了延時時間,如果是,我們就關閉燈具。
需要注意的是,在此程式碼中,我們使用了內置的millis()函數來計算時間。
該函數返回自開機以來的毫秒數,可以用來實現延時和定時操作。
另外,我們也使用了INPUT_PULLUP模式來設置開關腳位,這可以讓我們省去了外部上拉電阻的使用。
製作開關時,需要將GPIO輸出腳位連接到繼電器的控制引腳,將GPIO輸入腳位連接到開關的輸入引腳。
此外,還需要將繼電器的通路和燈具的電源線分別連接到網路開關和燈具上。當延時時間到達後,單片機將會切斷繼電器的控制信號,使得燈具斷電關閉。
需要注意的是,如果需要對此程式進行修改,可能需要根據自己的硬體配置調整GPIO腳位、繼電器控制引腳和延時時間等變數的值。 |
|