PIC12F1822 温度アラーム装置 [電子工作]
ばあちゃんちの台所は、2ハンドル混合水栓を使っていて、水側と湯側のハンドルを個別に回して水温を調整している。しかし台所作業を中断する時、水側のみを止めて、湯側を止め忘れている事が時々ある。 シングルレバーの混合水栓に交換するように勧めているが、配管工事の変更が大変なので、そのままになっている様だ。
100円ショップの警報ブザーが手元にあったので、注意喚起に利用できないかと思い、分解してみた。空間がかなりあるので、何か出来そう。



目的:高温の湯が出たままになっている事を検出して警報を鳴らす。
構造:温度センサーMCP9700で温度を電圧に変換。(Vout=10mV * Tc + 500mV)
PIC12F1822にて水栓の金属部分の温度を判定して、規定温度、温度上昇のいずれかで警報を出す。 PIC12F1822参考ソースは最後に記載。消費電流低減のためクロックは1MHz、2400bpsとした。
シール基板を警報ブザー基板の空きエリアに両面テープで貼り付け、部品をランドに半田付けする。 プログラム用コネクタは、接着剤で補強する。写真には無いが、半田面に於いて、スライドSWから出ているパターンをミニルータでカットしてFETを半田付けする。半田位置のレジストは剥がす。


配線きたないね。



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




基板上のLED光をケース表面に伝えるため、2mmのチューブに透明接着剤を入れて導光管にしたが、気泡が入ってかなり減衰してしまった。一応LED光は見える。
デバックのため、AD変換した測定電圧,規定値、MAX値を2400bpsで出力しているので、FT232RLなどでUSB変換してTeraTermなどで表示できる。


温度変化=18℃/50s=0.36℃/s 、 4サイクルチェック=1.44℃/4s

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

結果:水栓とセンサーとの温度結合が悪いので、規定温度検知するまで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
}
}
100円ショップの警報ブザーが手元にあったので、注意喚起に利用できないかと思い、分解してみた。空間がかなりあるので、何か出来そう。



目的:高温の湯が出たままになっている事を検出して警報を鳴らす。
構造:温度センサーMCP9700で温度を電圧に変換。(Vout=10mV * Tc + 500mV)
PIC12F1822にて水栓の金属部分の温度を判定して、規定温度、温度上昇のいずれかで警報を出す。 PIC12F1822参考ソースは最後に記載。消費電流低減のためクロックは1MHz、2400bpsとした。
シール基板を警報ブザー基板の空きエリアに両面テープで貼り付け、部品をランドに半田付けする。 プログラム用コネクタは、接着剤で補強する。写真には無いが、半田面に於いて、スライドSWから出ているパターンをミニルータでカットしてFETを半田付けする。半田位置のレジストは剥がす。


配線きたないね。



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




基板上のLED光をケース表面に伝えるため、2mmのチューブに透明接着剤を入れて導光管にしたが、気泡が入ってかなり減衰してしまった。一応LED光は見える。
デバックのため、AD変換した測定電圧,規定値、MAX値を2400bpsで出力しているので、FT232RLなどでUSB変換してTeraTermなどで表示できる。


温度変化=18℃/50s=0.36℃/s 、 4サイクルチェック=1.44℃/4s

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

結果:水栓とセンサーとの温度結合が悪いので、規定温度検知するまで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
コメント 0