シリアル接続温度計 (PIC 12F675)
PIC 12F675にLM35DZを接続して、シリアル経由でデータを出力する最も単純な温度計ユニット。
電流や気圧など電圧で測定値を取り出すタイプのセンサーと交換して、一般的な測定デバイスとして用いることも可能な汎用的な測定ユニットとして使える。
この記事を含め3種類のシリアル接続タイプの測定ユニットの設計を公開している。
機能 | 記事名 |
---|---|
シリアル出力 | シリアル接続温度計 (PIC 12F675) この記事 |
シリアル出力,パラレル接続LCD | 最低・最高温度記憶機能つきLCD表示温度計 (PIC 16F690) |
シリアル出力,I2C接続LCD,EEPROM記録 | ログデータ保存機能つきLCD表示温度計 (PIC 12F1822) |
主な機能
- 温度測定範囲 0℃ ~ 50℃ (有効桁:小数点以下1桁)
- シリアル接続(RS232C接続, 9600bps)によるPCへのデータ転送
回路図・部品表
温度センサ(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.2
16.2
16.3
受信専用ソフト
Windows版 PIC Meter
シリアル接続でデータを受信しグラフを表示する。また同時にデータをファイルに記録することも可能。
リポジトリ内のpic-meter
ディレクトリ内に収められている。
アセンブラ版のファームウエアを用いる場合は、通信速度を「2400bps」 フォーマット設定を「16進数」 データ位置を「3カラム目」 変換式を「Y = 0.0488 X + 0」 入力データXの範囲を「0 〜 1023」とすること。
Linux版 受信データ保存スクリプト
Linuxでデータ受信を行う場合は、つぎのような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";
}
コンソールでの操作例
$ 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
ディレクトリには旧版のアセンブラ版が収められている。
動作確認済み開発環境
- Microchip MPLAB X IDE ver 1.60
- Microchip MPLAB XC8 ver 1.12
メイン関数部分の抜粋
#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
摂氏直読温度センサー
電源電圧 +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
汎用オペアンプ
電源電圧 +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

(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分タイマー付き室温計 (奈良県経営者協会青年部例会)
関連記事