シリアル接続温度計 (PIC 12F675)

PIC 12F675にLM35DZを接続して、シリアル経由でデータを出力する最も単純な温度計ユニット。

電流や気圧など電圧で測定値を取り出すタイプのセンサーと交換して、一般的な測定デバイスとして用いることも可能な汎用的な測定ユニットとして使える。

この記事を含め3種類のシリアル接続タイプの測定ユニットの設計を公開している。

機能記事名
シリアル出力シリアル接続温度計 (PIC 12F675) この記事
シリアル出力,パラレル接続LCD最低・最高温度記憶機能つきLCD表示温度計 (PIC 16F690)
シリアル出力,I2C接続LCD,EEPROM記録ログデータ保存機能つきLCD表示温度計 (PIC 12F1822)

 

主な機能

 

回路図・部品表

回路図

BSch3V用回路図ファイルをダウンロードする

温度センサ(LM35DZ)は、0℃で0mVを、以後 10mV/℃ の電圧を出力する。オペアンプ(LM358)で10倍に増幅し、12F675のA/D変換器(AN3ピン)に入力している。

部品表

名称 型番・スペック 参考価格
PIC マイコン 12F675 1個(200円)
温度センサIC LM35DZ 1個(250円)
汎用オペアンプ LM358 1個(40円)
RS-232CドライバIC ADM232(同等品 Sipex SP232ACP) 1個(250円)
積層セラミック・コンデンサ 0.1uF 5個(ICとセット品)
炭素皮膜抵抗 27K, 1/4W 1個(5円)
炭素皮膜抵抗 3K, 1/4W 1個(5円)
炭素皮膜抵抗 470, 1/4W 1個(5円)
LED 2V, 20mA 1個(20円)
アルミ電解コンデンサ 470uF, 16V 1個(30円)
積層セラミック・コンデンサ 0.1uF, 50V 1個(20円)

完成写真とシリアル出力例

完成写真 完成写真

完成した基板の表面、裏面のようす
動作中写真

温度センサー回路の動作中 (USB-RS232Cコンバータのポートに接続中)

シリアル出力例

16.3
16.3
16.2
16.2
16.3

 

受信専用ソフト

Windows版 PIC Meter

シリアル接続でデータを受信しグラフを表示する。また同時にデータをファイルに記録することも可能。

リポジトリ内のpic-meterディレクトリ内に収められている。

pic-meter-main.jpg

pic-meter-dialog.jpg

アセンブラ版のファームウエアを用いる場合は、通信速度を「2400bps」 フォーマット設定を「16進数」 データ位置を「3カラム目」 変換式を「Y = 0.0488 X + 0」 入力データXの範囲を「0 〜 1023」とすること。

Linux版 受信データ保存スクリプト

Linuxでデータ受信を行う場合は、つぎのようなPerlスクリプトを用いてデータをデコード(温度に変換)すればよい。(この例は、アセンブラ版のファームウエアを使う場合の変換式が入っている)

pictemp.pl (データ受信スクリプト)
#!/usr/bin/perl

use strict;
use warnings;

my $str_input;

while(<>){
chomp();
if(length() != 12){ next; }
my @arr = split(/ /, $_);
print sprintf("%.2f", hex($arr[2])*50.0/1024.0)."\n";
}

コンソールでの操作例

$ sudo stty -F /dev/ttyUSB0 2400 cs8
$ cat /dev/ttyUSB0 | perl pictemp.pl
28.52
28.22
28.47
28.61
28.76
28.22
28.56
28.71

 

ソースコード

XC8 C言語ソースコード、ビルド済みHEXファイルのダウンロード

リポジトリ内の12f675-serial/xc8ディレクトリ内に収められている。12f675-serial/asmディレクトリには旧版のアセンブラ版が収められている。

動作確認済み開発環境

メイン関数部分の抜粋

main.c
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>

#include "serial-lib.h"
#include "common-lib.h"

#pragma config BOREN = OFF // Brown-out Detect Enable bit
#pragma config CPD = OFF // Data Code Protection bit
#pragma config FOSC = INTRCIO // Oscillator Selection bits
#pragma config MCLRE = OFF // GP3/MCLR pin function select
#pragma config WDTE = OFF // Watchdog Timer Enable bit
#pragma config CP = OFF // Code Protection bit
#pragma config PWRTE = ON // Power-Up Timer Enable bit

#ifndef _XTAL_FREQ
/* 例:4MHzの場合、4000000 をセットする */
#define _XTAL_FREQ 4000000
#endif

// RS232Cに数値を文字列化して出力(送信)する
void print_uint(unsigned int n, unsigned char digit){
unsigned char buf[3];

// 2ケタの10進数(表示データがない倍は空白文字表示する)
if(digit == 2){
rs232c_puts(uint_to_dec2(n, buf));
}
// 1桁の10進数(表示データがない倍はゼロ表示する)
else{
rs232c_puts(uint_to_dec1_0(n, buf));
}
}

int main(int argc, char** argv) {
TRISIO = 0b00011000; // GP3,GP4をINPUT, その他はOUTPUT
CMCON = 0x7; // コンパレーターOFF
ANSEL = 0b00011000; // Fosc/8, AN3
INTCON = 0; // 割り込み全てOFF
GPIO = 0;
GPIObits.GP1 = 1; // RS232C TX=1(未送信時はプルアップしておく)

__delay_ms(500);

for(;;){
// AN3入力をA/D変換
ADCON0 = 0b10001101; // 右詰め, AN3, A/D機能ON
__delay_us(20); // A/D変換器チャージ時間待つ
ADCON0bits.GO_DONE = 1; // A/D変換開始
while(ADCON0bits.GO_nDONE){} // A/D変換完了を待つ
unsigned int ad_value = ADRESH << 8 | ADRESL;
ADCON0 = 0; // A/D機能OFF

// A/D変換値を、LM35で測定した気温に換算する
GPIObits.GP0 = 1; // LED点灯
ad_value = (unsigned int)((unsigned long int)ad_value * 500L / 0x3ffL);

// 気温データをシリアルポートに出力する
print_uint(ad_value/10, 2);
rs232c_putch('.');
print_uint(ad_value%10, 1);
rs232c_puts("\r\n");
GPIObits.GP0 = 0; // LED消灯

__delay_ms(1000);
}

// return (EXIT_SUCCESS);
}

 

温度センサーLM35

LM35DZ

LM35DZ

摂氏直読温度センサー

電源電圧 +35V ~ -0.2V ... 今回は +5V
で利用。
出力電圧 +6V ~ -1.0V ... 今回は 12F675 の A/D
変換を利用するため +5V ~ 0V の範囲を利用。
出力電流 10mA
動作範囲 0℃ ~ 100℃ ... 今回は 12F675 の A/D
変換を利用するため 0℃~ 50℃ の範囲を利用。
誤差 +25℃で±0.6℃

データシート http://www.national.com/pf/LM/LM35.html

特性曲線

オペアンプLM358

LM358N

LM358N

汎用オペアンプ

電源電圧 +3V ~ 32V ... 今回は +5V で利用。
典型的な回路での増幅計算は、次の通り

増幅計算

今回は、R1=3k, R2=27k で Gain = 1 + 27/3 = 10 の 10倍増幅を利用している。
LM358の仕様書では、最大増幅は電源電圧より低い値となるので、5Vまでの増幅は出来ないものと思われる。

データシート http://www.national.com/pf/LM/LM358.html

RS232Cドライバ ADM232

ADM232

(MAXIM) ADM232

RS-232インターフェース・デバイス

電源電圧 +3.0V ~ 5.5V ... 今回は +5V で利用。

データシート http://www.maxim-ic.com/alternatives.cfm/part/ADM232/pk/287

参考リンク 

LM35(実験)
温度計 (西本氏)  (← 16bitHEXのBCD変換のソースが載ってます)
PICと温度計モジュールを利用した、 温度計測装置の作成 (朝日大学)
PIC版3分タイマー付き室温計 (奈良県経営者協会青年部例会)

関連記事