11 May 2019

PIC12F629とマイクロスイッチで鍵の締め忘れ警報機を製作

鍵の締め忘れをすることが、たまにある。 最近はインバウンドと称した不法民泊が跋扈しているので、鍵の締め忘れで犯罪に巻き込まれる可能性がどんどん上がっている。

で、サムターンの位置を検出して、一定秒数鍵を開けっ放しにすると警報音を出す装置を製作した。

20190511-12f629-circuit.png

サムターンが「鍵解放」の位置に来たら、マイクロスイッチを押しこむように、スイッチの位置の微調整をしたうえでホットボンドで鍵ボックスの表面に固定する。

20190511-12f629-board.jpg
12F629を用いた警報基板

20190511-12f629-microsw.jpg
サムターン位置で押し込まれるようにマイクロスイッチを取り付け

20190511-12f629-install.jpg
鍵ボックスに警報基板を取り付け

ちゃんと作動することを確認した後に、ボックスを(100均のラッカーで)金色に塗装予定。

PIC12F629のプログラム

// CONFIG (MPLAX Xで自動生成 - Window menu - PIC Memory Views menu - Configuration Bits menu)
#pragma config FOSC = INTRCIO   // Oscillator Selection bits (INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON       // Power-Up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF      // GP3/MCLR pin function select (GP3/MCLR pin function is MCLR)
#pragma config BOREN = OFF      // Brown-out Detect Enable bit (BOD disabled)
#pragma config CP = OFF         // Code Protection bit (Program Memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#include 
 
#ifndef _XTAL_FREQ
/* 例:4MHzの場合、4000000 をセットする */
#define _XTAL_FREQ 4000000
#endif 
 
void main(void) {
    TRISIO = 0b00011000; // GP3,GP4をINPUT, その他 GP0, GP1, GP2, GP5はOUTPUT
    CMCON = 0x7;    // コンパレーターOFF
    // ANSEL = 0;   // AN0-AN3全てA/D変換無効 (12F629にはA/Dは実装されていない)
    INTCON = 0;     // 割り込み全てOFF
 
    GPIObits.GP0 = 0;
    GPIObits.GP1 = 0;
    GPIObits.GP2 = 0;
    GPIObits.GP5 = 0;
 
    // 1秒 待つ
    __delay_ms(1000);
 
    // 0.5秒 外部リレー(GP2出力) ON
    GPIObits.GP2 = 1;
    __delay_ms(500);
    GPIObits.GP2 = 0;
     
    // 最初の2分は 20秒に1回 ブザー鳴動(GP1)
    for(int j=0; j<120; j+=20){
        // 0.05秒ブザー鳴動
        GPIObits.GP1 = 1;
        __delay_ms(50);
        GPIObits.GP1 = 0;
        // 20秒待つ
        __delay_ms(20*1000);
    }
 
    // 以降、2分毎に外部リレー(GP2出力)ONと、10秒毎のブザー鳴動
    for(;;){
        // 0.5秒 外部リレー(GP2出力) ON
        GPIObits.GP2 = 1;
        __delay_ms(500);
        GPIObits.GP2 = 0;
        for(int j=0; j<120; j+=5){
            // 0.05秒ブザー鳴動
            GPIObits.GP1 = 1;
            __delay_ms(150);
            GPIObits.GP1 = 0;
            // 10秒待つ
            __delay_ms(5*1000);
        }
    }   
}