我家鋁門上面有兩道十字型的鎖
某天回家
開鎖時發現
下面那一道鎖無法轉動
發現鑰匙孔有被破壞的痕跡
好險有兩道鎖
拖延時間
不然晚點回家
就被闖入了
當下就想說這樣不行
人不在一樓
都不知道沒發生什麼事了
當下就決定做個開鎖計時器
就是開完第一道鎖
就會開始計時
要在設定的時間內開完第二道鎖
不然就會啟動警報器

本次開鎖計時器所需零件▲

12V變壓器和閃光警報器▲

8051開鎖計時器電路▲

零件圖▲

空中連接器電路▲

洗電路板過程就看之前的文章囉 > GP DIY Angry Bird 車尾燈▲

基本的8051零件電路焊接完成▲
不過之後還是有作一些小修改(正面)

電路板(背面)▲
看到背面有一顆綠色電容
就是因為RESER按鍵要外接到殼子上
所以將原本要焊接電容的位子給了針腳
而將電容移至背面

電路板(側面)▲

寫程式測試囉▲
程式碼在文章尾巴
PORT設定
P1.0橘燈
P1.1紅燈
P1.2閃光警報器
P2.0第一道鎖
P2.1第二道鎖
左邊兩個黑黑的東西是微動開關
它桿子很長
可以摺成需要的樣子
還不錯
使用微動開關的常開腳位(NO)

殼子上挖洞▲

將按鈕、指示燈和電源座焊上線材並裝好▲
將完成的8051電路裝進殼子內
底部有用六腳銅柱固定
六腳銅柱直接用快乾黏在殼子內(超省事)

我家左邊鋁門每天都會常常開關▲
如果門上有線材
開開關關線材容易斷裂
所以做一個空中連接器

右邊的空中連接器電路板▲
上面裝了兩根探針
探針本身有彈簧會伸縮
又可導電

左邊的空中連接器▲

摺好形狀的微動開關▲

這時都差不多了▲
但還差一樣東西
12V轉5V的變壓器

我超懶得想▲
就想到USB車充(超省事)
因為閃光警報器是吃12V的電
而8051吃5V的電
所以需要轉壓

外殼拆掉▲
接上線材
就完成囉

裝在門上面▲
超懶得鑽洞
直接用3M黏的
線材我想之後要加壓條
不然不太美觀~~

未開鎖▲

開鎖後▲
剛好把微動開關推開

亮燈囉▲

空中連接器▲

如果右邊鋁門要開也可以
拔掉此空中接頭就可以囉
使用說明:
紅色按鈕為開關
第一道鎖打開後,計時5秒確定有開鎖,開啟橘燈,計時60秒,在60秒內開啟第二道鎖,計時3秒確定有開鎖,狀態解除,關閉橘燈。
超過60秒未開啟第二道鎖,開啟紅燈,啟動警報,啟動閃光警報器,響60秒,關閉30秒,共開關3次之後停止,橘燈紅燈腳替0.5秒閃爍,紀錄開鎖失敗,需要按下綠按鈕重新啟動。
程式碼:
#include <AT89X51.H>
#define warning_led P1_0
#define alarm_led P1_1
#define alarm_sound P1_2
#define up_lock P2_0
#define down_lock P2_1
void delayms(unsigned int time);
void init();
void first_scan();
void up_first();
void down_first();
void alarm();
void lock();
int time_0_5s=500;
int time_3s=3000;
int time_5s=5000;
int time_10s=10000;
int time_30s=30000;
int time_1m=60000;
int time=0;
int other_luck_n=120;
main()
{
P2=0;
init();
first_scan();
}
void first_scan()
{
while(1)
{
if(up_lock==0)
{
time=time_5s;
delayms(time);
if(up_lock==0)
{
warning_led=0;
up_first();
}
}
else if(down_lock==0)
{
time=time_5s;
delayms(time);
if(down_lock==0)
{
warning_led=0;
down_first();
}
}
}
}
void up_first()
{
int n=other_luck_n;
while(n>0)
{
if(down_lock==0 && up_lock==0)
{
time=time_3s;
delayms(time);
if(down_lock==0 && up_lock==0)
{
time=time_10s;
delayms(time);
main();
}
}
else if(down_lock==1 && up_lock==1)
{
time=time_3s;
delayms(time);
if(down_lock==1 && up_lock==1)
{
time=time_10s;
delayms(time);
main();
}
}
time=time_0_5s;
delayms(time);
n--;
}
alarm();
}
void down_first()
{
int n=other_luck_n;
while(n>0)
{
if(down_lock==0 && up_lock==0)
{
time=time_3s;
delayms(time);
if(down_lock==0 && up_lock==0)
{
time=time_10s;
delayms(time);
main();
}
}
else if(down_lock==1 && up_lock==1)
{
time=time_3s;
delayms(time);
if(down_lock==1 && up_lock==1)
{
time=time_10s;
delayms(time);
main();
}
}
time=time_0_5s;
delayms(time);
n--;
}
alarm();
}
void alarm()
{
int n=3;
alarm_led=0;
while(n>0)
{
alarm_sound=1;
time=time_1m;
delayms(time);
alarm_sound=0;
time=time_30s;
delayms(time);
n--;
}
lock();
}
void lock()
{
while(1)
{
int time=time_0_5s;
delayms(time);
if(P1_7==0)
{
P1_7=1;
warning_led=0;
alarm_led=1;
}
else
{
P1_7=0;
warning_led=1;
alarm_led=0;
}
}
}
void init()
{
warning_led=1;
alarm_led=1;
alarm_sound=0;
}
void delayms(unsigned int time)
{
unsigned int n;
while(time>0)
{
n=120;
while(n>0)
{
n--;
}
time--;
}
}