pic 2点温度計付きデジタル時計

投稿日 2011/06/30

以前購入して使用していない秋月の大型LED時計(今はバージョンが変わっています)を有効活用するため、温度表示もできる時計に変身させることにしました。

 

まずは試作ということで、マイクロテクニカのPICD-500EX3にPIC 16F877を装着し、RTCはブレッドボードに装着しました。大型LED基板は、秋月のものをそのまま使用しました。装着されているPIC 16F57を外し、28ピンソケットを通じてPICD-500EX3と接続しました。

termo_clock_lcd.jpg

マイクロテクニカ PICD-500EX3上のPIC 16F877 時刻と温度をLCDに表示 中央の赤いDIP SWの下がDS1820


 

温度センサーはデジタル温度センサーのDS1820を2個使用し、2点(2箇所)の温度を表示できるようにしました。DS1820はデジタルなのでノイズに強く、本体から離れた場所の温度が測れます。

 

DS1820は3本の線で並列に接続し、One Wireバスで使用します。このため複数個のDS1820を見分けるために、個々のDS1820の内部ROMに埋め込まれているIDコードを知る必要があります。

 

下記のようなプログラムで64bit(8byte)のROMを読み、LCDに表示して記録しておきます。

 

私のDS1820のIDは、

 

108993640108003D
10129264010800B9

 

でした。2文字で1byteの16進です。先頭の10がヘッダ、最後の3DやB9がCRCで、それに挟まれた6byteがIDコードです。

 

温度の計測はこのIDコード(8byteすべて使う)を指定して行うことになります。

 

DS1820のROMを表示するプログラム(MikroC)
void Read_ROM(){
int nn;
char dat[9];
char dat_arr[17];

 

Lcd_Out(1,1,"Reading ROM Code" );
Ow_Reset(&PORTA, 5);
Ow_Write(&PORTA, 5, 0x33);
for (nn = 0; nn < 8; nn++){

dat[nn] = Ow_Read(&PORTA, 5);

}
dat_arr[0] = ((dat[7] >> 4) & 0x0F) + 0x30;
dat_arr[1] = (dat[7] & 0x0F) + 0x30;
dat_arr[2] = ((dat[6] >> 4) & 0x0F) + 0x30;
dat_arr[3] = (dat[6] & 0x0F) + 0x30;
dat_arr[4] = ((dat[5] >> 4) & 0x0F) + 0x30;
dat_arr[5] = (dat[5] & 0x0F) + 0x30;
dat_arr[6] = ((dat[4] >> 4) & 0x0F) + 0x30;
dat_arr[7] = (dat[4] & 0x0F) + 0x30;
dat_arr[8] = ((dat[3] >> 4) & 0x0F) + 0x30;
dat_arr[9] = (dat[3] & 0x0F) + 0x30;
dat_arr[10] = ((dat[2] >> 4) & 0x0F) + 0x30;
dat_arr[11] = (dat[2] & 0x0F) + 0x30;
dat_arr[12] = ((dat[1] >> 4) & 0x0F) + 0x30;
dat_arr[13] = (dat[1] & 0x0F) + 0x30;
dat_arr[14] = ((dat[0] >> 4) & 0x0F) + 0x30;
dat_arr[15] = (dat[0] & 0x0F) + 0x30;
dat_arr[16] = 0;
Lcd_out(2,1,dat_arr);

Delay_ms(10000);
}//mRead_ROM

termo_clock_kairo.jpg

写真2. 基板裏面の様子 サブ基板にPICを組み込んだ

 

時刻と温度を約3秒おきに交互に表示します。

 

時刻の調整はSETボタンを押して時刻表示に固定したあと、MINボタンで分を、HOURボタンで時間を変更することができます。また、毎時30分を境に、JUSTボタンを押すとXX:00にセットすることができます。18:29までにJUSTボタンを押すと18:00に、18:30から18:59までにJUSTボタンを押すと19:00にセットします。

termo_clock_time.jpg

大型LEDに時刻(17時01分)を表示 左にRTC 8564、右に2個目のDS1820

 

大型LEDはダイナミック点灯させています。50ms間隔なので、敏感な人はちらつくかも知れませんので調整が必要です。


 

SETボタンを押すと時刻表示で止まります。この状態でHOURボタンを押して時を、MNTSボタンを押して分を調整することができます。再びSETボタンを押すと、時刻と温度の交互表示に戻ります。

 

SETの状態でJUSTボタンを押すと毎時00分にセットできます。

termo_clock_ondo.jpg

大型LEDに2点の温度を表示 28度 28度


 

当初PIC 16F887を使用してましたが、どうも不安定ですので、16F877にしました。

 

試作なのでPICD-500EX3のLCDに時刻と温度を表示していますが、本番は外します。

 

また、温度をロギングできるようにPICをUSBサポートの18F4550などに変更して、USBメモリに記録できるようにする予定です。

 

ソースコード(MikroC)





 

(JF1VRR)