SSブログ

PIC12F1822 温度アラーム装置 [電子工作]

ばあちゃんちの台所は、2ハンドル混合水栓を使っていて、水側と湯側のハンドルを個別に回して水温を調整している。しかし台所作業を中断する時、水側のみを止めて、湯側を止め忘れている事が時々ある。 シングルレバーの混合水栓に交換するように勧めているが、配管工事の変更が大変なので、そのままになっている様だ。

100円ショップの警報ブザーが手元にあったので、注意喚起に利用できないかと思い、分解してみた。空間がかなりあるので、何か出来そう。
11警報0641.jpg31警報44.jpg41警報3646.jpg

目的:高温の湯が出たままになっている事を検出して警報を鳴らす。
構造:温度センサーMCP9700で温度を電圧に変換。(Vout=10mV * Tc + 500mV)

PIC12F1822にて水栓の金属部分の温度を判定して、規定温度、温度上昇のいずれかで警報を出す。 PIC12F1822参考ソースは最後に記載。消費電流低減のためクロックは1MHz、2400bpsとした。
シール基板を警報ブザー基板の空きエリアに両面テープで貼り付け、部品をランドに半田付けする。 プログラム用コネクタは、接着剤で補強する。写真には無いが、半田面に於いて、スライドSWから出ているパターンをミニルータでカットしてFETを半田付けする。半田位置のレジストは剥がす。
56pcb30595.jpg55sch1822.jpg
配線きたないね。
61P1030607.jpg71P1030615.jpg82P1030612.jpg

監視中であることが目視で分かるように、約8秒毎にLEDを点灯。  温度センサーの熱伝導を良くするためにMCP9700の周りを0.2mmの銅板を巻いたが、効果は未評価で不明。防水の為、温度センサーをチューブに入れて防水シール(バスコーク)を充填した。 加工した温度センサーを防水シールで水栓の金属部分に貼り付けた。センサー交換時は、無理やり剥がすことになる。センサーと並列に接続されたダイオードは、MCP9700逆接続保護用。100円ショップのイヤホン延長コードをカットして、プラグ側にセンサー、ジャック側を本体に接続した。センサーは、複数作って温度誤差を確認し良さそうなのを採用。あまり違いは無かったが。
91to92087.jpg92sense94.jpg93バスコーク920640.jpg94sens39bc.jpg

 基板上のLED光をケース表面に伝えるため、2mmのチューブに透明接着剤を入れて導光管にしたが、気泡が入ってかなり減衰してしまった。一応LED光は見える。
デバックのため、AD変換した測定電圧,規定値、MAX値を2400bpsで出力しているので、FT232RLなどでUSB変換してTeraTermなどで表示できる。
82P1030612.jpg98log123u.jpg
温度変化=18℃/50s=0.36℃/s 、 4サイクルチェック=1.44℃/4s
99xlsWS000138.jpg

温度検出結果により警報ブザーの電源をPMOSでON/OFFしたが、警報ブザーにリードSWがあるので、これを使った方が制御電流が少ないので良いかも。 本体ケースをファスナーテープで、水に濡れない所に貼り付けた。
96P1030636.jpg

結果:水栓とセンサーとの温度結合が悪いので、規定温度検知するまで20秒程必要だった。逆に温度が下がるまでも時間がかかり、湯を止めても暫く鳴動したままになるが、対象者の動作もゆっくりなので当初の目的は達成。 消費電流を減らす為に、鳴動音は断続にした。季節要因による温度変化は考慮していないので、夏季に再調整必要かもしれない。

   消費電流:0.7mA、鳴動時60mA。

PICコンパイル環境
* MPLAB X IDE 3.26
* XC8 Ver1.36
* Writer:PICerFT15-10-6.8

PICerFTにて書き込み中、ブザー鳴動によるVdd変動で、書込みエラーになる事がある。書込みエラーする時は6ピン(RA1)-FETを一時的にカットする。

MPLAB X XC8 コンパイル時、警告が一杯出るが、conversionに関するものなのでとりあえず無視。
温度設定は以下の定義文を変更して行う。

#define LMT 440 //440:38℃ 470:44℃ 480:46℃ 490:48℃ 500:50℃
      //Vout=10mV*Tc + 500mV step:2mV
#define DIF 5  //difference 5x2mV=10mV 1.0℃ up

PICソース&HEX


参考サイト  
http://sky.geocities.jp/home_iwamoto/page/P14K50/P14_A17.htm
http://micom.hamazo.tv/e3140018.html
 http://www.geocities.jp/zattouka/GarageHouse/


/*********************************************************************
* PIC 12F1822 CLOCK:1MHz (internal)
* MCP9700 temperature sensor Vout=10mV*Tc+500mV
* ADconvert Vref: FVRx2 2.048V
*
* MPLAB X IDE 3.26
* XC8 Ver1.36
* Writer:PICerFT15-10-6.8
*
* Author:nakjack
* date:2016.03.20
* 2016.03.27 DIF:5
*
* PIC 12F1822
* 1 VDD 8 VSS
* Rx 2 RA5 7 RA0 LED
* Tx 3 RA4 6 RA1 ALARM
* Vpp 4 RA3 5 RA2 AN2 <--- MCP9700
*
* *******************************************************************/

#define _XTAL_FREQ 1000000 //1MHz

#include #include "pic.h" //******************* config **************************** #pragma config FOSC = INTOSC, WDTE = OFF, PWRTE = ON, MCLRE = OFF, CP = OFF #pragma config CPD = OFF, BOREN = ON, CLKOUTEN = OFF, IESO = OFF, FCMEN = OFF #pragma config WRT = OFF, PLLEN = OFF, STVREN = ON, BORV = LO, LVP = OFF // #define BYTE unsigned char #define LED1 RA0 #define ALARM RA1 #define LMT 440 //440:38℃ 470:44℃ 480:46℃ 490:48℃ 500:50℃ //Vout=10mV*Tc + 500mV step:2mV #define DIF 5 //difference 5x2mV= 10mV 1.0℃ up #define TRG 3 //retrigger count // ================= ////////////////////////////////////////////////////// void usart_write(unsigned char ch) { while(TRMT==0 || TXIF==0){ ;} //wait empty TXREG = ch; } ////////////////////////////////////////// ////////////////////////////////////////// unsigned char get_serial(void) { BYTE sdt; while(!RCIF) //wait ready continue; sdt=RCREG; usart_write(sdt); return sdt; } ////////////////////////////////////////// void usart_str(unsigned char *str) { while(*str != 0x00){ // 文字列の終わり判定 usart_write(*str); // 文字列1文字出力 str++; // ポインタ+1 } } ////////////////////////////////////////// void crlf(void) { usart_write('\r'); usart_write('\n'); } /////////////////////////////////////////// void adinit(void){ FVRCON = 0b10000010; //FVR:2.048V // | | ---- //10:2.048V // |----------- //Enable __delay_ms(1); //1822 ADCON1 = 0b11110011; // 右詰め出力, clock:FRC VFR ADCON0 = 0b00001001; // ADinput AN2(RA2),ADC ON // ----- } //////////////////////////////////////////////// unsigned int adconv(unsigned int adch){ unsigned int temp,j; double add; add=0; ADCON0 = (ADCON0 & 0b10000001) |(( adch <<2) & 0b01111100);//AD ch for(j=0;j<4;j++){ __delay_us(20); ADIF =0; GO_nDONE =1; //convert start! while(GO_nDONE);//progress AD convert temp =ADRESH; temp =( temp<<8 )| ADRESL; add +=temp; } add = add/4; //4回平均 temp=(unsigned int)add; return temp; } ////////////////////////////////////////// void i2digits(unsigned int value,unsigned char* pDigit,unsigned char dp) { BYTE digit; unsigned int i,siz,dpc; siz=5; dpc=dp&0x03; if(dp==0)siz=4; for(i=0;iDIF)&& !((num-tmp[ix])&0x8000))&&fgCHK)||((limit-num) & 0x8000)){fgALM=TRG;} //else{fgALM=0;} // if((num-limit) & 0x8000){fgALM=0;}else{fgALM=1;} if((max - num) & 0x8000)max=num; tmp[ix]=num; // 1024:2.048V // 512:1.024v // Vout=10mV*Tc + 500mV // crlf(); i2digits(num<<1,&buf[0],0); //Temp usart_str(buf); usart_write(','); i2digits(limit<<1,&buf[0],0); //limit usart_str(buf); usart_write(','); usart_write(0x30+fgALM); //FLG usart_write(','); i2digits(max<<1,&buf[0],0); //max usart_str(buf); fgALM=fgALM & 0x07; if(fgALM)alarmx(2); __delay_ms(200); fgALM--;if(fgALM & 0x80)fgALM=0; // 3->2->1->0 ->0 if((lct&0x07)==0)LED1=1; __delay_ms(100); // 8回に1回点灯 lct++; if(lct & 0x04)fgCHK=1; //check enabe 0 x x x x AD4回の後から差分をチェックする // 4 A A A A } }
nice!(1)  コメント(0)  トラックバック(0) 
共通テーマ:趣味・カルチャー

nice! 1

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。