概要
前の電子工作24で製作した煙検知機に温度検知の機能を加えて、簡易型火災報知器を作ってみた。具体的には、温度検知のためのセンサとしてサーミスタを取付け、煙の濃度か温度のいずれかが設定以上に達するとブザーが鳴る。
回路と装置の外観
下に回路図と、完成した装置の写真を示す。装置の大きさは約10 X 10 X 4 cm である。煙センサ(細長い木片)の他に、温度を検知するために、マッチ棒先端部位の大きさの10Kのサーミスタをボード上に組込み、PICのGP1(Pin 6)につないである。煙センサ用のVR(Smokeと表示)の下に、白く小さい点状に見える物体がそれである。PICに入力する煙センサと温度センサからの電圧をチェックするためのテスト端子が設けてあり、入力の選択はスイッチで切り替えられる。装置のメンテナンスや経時変化のチェックに役立つ。PICの下にブザーも見える。+5Vの電源は7805を使ってつくり出していて、外付けのACアダプタが要る。電源ONで赤い点滅式のLEDが点灯する。この装置全体で約15mAの電流を消費する。2つのセンサからの入力電圧が、いずれも約1.0V以上でブザーが鳴るようにプログラムを組んであるので、ノイズや外光によって誤ってブザーが鳴らないように、温度センサは約0.9V前後(体温よりちょっと高め、約40°Cに相当)に、煙センサは約0.75Vに設定した。
プログラム
今回は、電圧値を2つのセンサから別々のポートを通じて読込むので、途中でADCのポートを、AN0からAN1に変える必要があった。つまり、ADCON0の値を131から135に変えた。プログラムは、2つの入力電圧値を連続的にチェックし続け、いずれかが1.0Vを越えると、ブザーを約150秒間鳴らし続け、再び、入力電圧値のスキャンルーチンに戻る。短く、すっきりしたプログラムと思っている。
'************ プログラミング備忘録 *************
'FAL675c.bas 2007.9.7 Temperature sensor (thermistor) added Succeeded!
'************** Pin connection *****************
'Pin 1: Vdd (+3-5V)
'Pin 8: Vss
'Pin 7: GPIO.0: input - connected to +5V via 20K VR and 300K resistor
'Pin 6: GPIO.1: input - connected to +5V via 10K VR and 10K thermistor
'Pin 5: GPIO.2: NC
'Pin 4: GPIO.3: input - MCLR/Reset
'Pin 3: GPIO.4: NC
'Pin 2: GPIO.5: output - connected to buzzer
'*************** プログラム本体 ******************
ANSEL=%00010011
TRISIO=%001011
CMCON=7 'turns off comparator function
Define ADC_BITS 10 '10-bit ADC used
Define ADC_CLOCK 3 'Internal clock used
Define ADC_SAMPLEUS 50 'Sample timing
Vin0 var word 'Vin0 - smoke voltage input storage
Vin1 var word 'Vin1 - temp. voltage input storage
t var word
ADCloop: ‘2つのセンサからの入力電圧検知ルーチン
'Smoke sensing 煙の検知ルーチン
ADCON0=%10000011 ‘=131 (decimal) Select GP0/AN0 Pin
Pause 20
GPIO.5=0 'turns off Buzzer
Vin0=0
Pause 20
ADCIN 0, Vin0 'reads ADC ch-0 and save in Vin0
'(range 0-1024)
Pause 50 'allows time for ADC conversion
If Vin0>200 then '200 equal to about 1.0V analog input V
Goto Buzzer '(V=5.0 x 200/1024=0.98V)
Endif
'Temperature sensing 温度検知ルーチン
ADCON0=%10000111 '=135(decimal) Select GP1/AN1 Pin
Pause 20
GPIO.5=0 'turns off Buzzer
Vin1=0
Pause 20
ADCIN 1, Vin1 'reads ADC ch-1 and save in Vin1
'(range 0-1024)
Pause 50 'allows time for ADC conversion
If Vin1>200 then '200 equal to about 1.0V analog input V
Goto Buzzer '(V=5.0 x 200/1024=0.98V)
Endif
Goto ADCloop
Buzzer: 'turns on Buzzer for about 150 sec ブザーを鳴らすルーチン
For t=0 to 500 't has to be defined as WORD instead of BYTE
High GPIO.5
Pause 200
Low GPIO.5
Pause 100
Next
Goto ADCloop
'********** プログラムの終わり ***************
'Note:
'AKI Programmer's configurations:
'FOSC- INTOSC (GP4:I/O); WDTE - Enable; PWRTE - Enable
'MCLR -MCLRPin; BODEN - Enable; CD - Disable; CDP - Disable
余談
煙センサのホトトランジスタがなかなかデリケートで、最初、光漏れの影響のためか回りの明るさが変化すると出力電圧値がかなりドリフトした。そこで、その部分を黒いビニールテープで覆ったところ、問題ない程度に安定した。煙の通過する垂直孔から多少外光が入るが許容できる程度である。輝度調整を含め2個のVRで、出力電圧値を約0.75V前後に設定すると、誤動作も起こさず、線香の煙にもよく反応した。温度センサは安定していて、外気温に対応して動き、特に問題はない。とにかく、電源を入れ、しばらく動作を観察してみよう。かかった費用〆て¥1500程。既製品を買った方が安いくて良い? はい、シコシコ作るのがジジイのたのすみなのっしゃ((楽しみなのです)!!
ブザーのほかに電球の点滅も加えた改良型の製作(2008.2.26)
製作した装置を3ー4ヶ月にわたって動かしているうち動作が安定し突然ブザーが鳴り出すことが殆どなくなった。深夜就寝中にブザーが鳴り出したら、咳払いも聞こえるほどの薄壁一枚で隔てられている長屋の隣人に迷惑がかかる。就寝前には誤動作を恐れて電源を切るという状況に陥ってしまった。そこで深夜の就寝中に煙りや設定以上の高温を検知したら、100W位の白熱電球をベッドの頭上で点滅させて刺激し起床を促すようにしたら良いのではと考え回路を改造した。
2個のスイッチを設けて、ブザーと電球点滅の両方、ブザーだけ、あるいは電球点滅だけを選択できるようにした。AC100Vの電球はリレーで点滅される。
回路図に新たに追加したスライドスイッチSW1とSW2、それにトランジスタで駆動されるリレーが見える。プログラムは同じものを使っている。
ブザーを鳴らさない電球点滅だけのモードに設定しても、200 ms 毎にON/OFFを繰り返す時にリレーから出るパシャパシャというかなり高い作動音と電球の点滅光(100W電球を就寝者の顔から1メートル位に設置する)とで目的を達成できそうである。