====== 温度データロガーV2 ======
===== 概要 =====
以前に製作した、温度データロガーは、PIC12F683と高精度温度センサー「S8100B (SEIKO)」を使用したもので、測定結果は、RS232Cでパソコンに送信するものでした。
今回は、PIC12F683と高精度温度センサー「LM60」を使用し、測定結果は、EEPROM「24LC1025」に記録しました。
記録したデータは、前回製作した、EEPROM/reader&writer(SDカード)を使って、SDカードにファイルとして抜き出します。
そして、パソコン上のExcelを使って、グラフ表示しました。
<仕様>
* 温度測定範囲は、-25℃~+99℃とする。\\ ※LM60の測定範囲は、-25℃~+125℃、1℃当たり6.25mV
* 測定周期は、1秒とする。
* 記録は、最大16384件とする。(約4.5時間分:131072バイト÷8バイト÷3600秒)
* A/D変換の、基準電圧は、2.495Vとする。(最小分解能2.4mV)
* 測定精度は、約0.4℃(2.4mV÷6.25mV)とする。
===== 動作原理 =====
- 内臓モジュールを初期化する。
- スイッチが押されるのを待つ。
- 温度を100回測定し、その平均を求める。
- 結果をEEPROMに書き込む。\\ ※格納フォーマットは、1データ8バイト構成で、次のようになります。\\ "29.8"+CR+LF\\ "-12.4"+CR+LF
- 測定周期が、約1秒になるようにスリープ(遅延:delay)する。
- スイッチが押されると測定を停止する。
- 1.に戻る。
===== ソースコード =====
//**********************************************************************
/*
『温度データロガー(ThermoLoggerV2)』
■概要
約4.5時間の温度データを記録します。
131072バイト÷8バイト
格納フォーマットは、1データ8バイト構成で、次のようになります。
”△△29.8”+CR+LF
”△-12.4”+CR+LF
*/
//**********************************************************************
#define SW GPIO.F3
#define LED GPIO.F2
#define ON 1
#define OFF 0
#define CR 0x0D
#define LF 0x0A
//**********************************************************************
void EEPROM_24LC1025_Page_Write(unsigned long addr, unsigned short *buf, unsigned short len)
{
unsigned short cnt;
//
Soft_I2C_Start();
if ((addr & 0x10000) == 0)
Soft_I2C_Write(0xA0);
else
Soft_I2C_Write(0xA8);
Soft_I2C_Write((addr >> 8) & 0xFF);
Soft_I2C_Write(addr & 0xFF);
for (cnt = 0; cnt < len; cnt++) {
Soft_I2C_Write(buf[cnt]);
}
Soft_I2C_Stop();
}
//**********************************************************************
void main()
{
static unsigned char buf[10], cnt;
static unsigned double ad;
static unsigned long addr;
//
CMCON0 = 0b00000111;
ANSEL.ANS0 = 1;
ANSEL.ANS1 = 0;
ANSEL.ANS2 = 0;
ANSEL.ANS3 = 0;
ADCON0.VCFG = 1;
TRISIO = 0b00001011;
OSCCON = 0b01110000;
//
for (cnt = 0; cnt < 10; cnt++) {
LED = ON;
Delay_ms(50);
LED = OFF;
Delay_ms(50);
}
//
Soft_I2C_Config(&GPIO, 4, 5);
//
while (1) {
//スイッチが押されるのを待つ。
while (SW == 1)
Delay_ms(10);
//
addr = 0;
while (1) {
LED = ~LED;
//温度を100回測定し、その平均を求める。
ad = 0;
for (cnt = 0; cnt < 100; cnt++) {
ad += Adc_Read(0);
Delay_ms(1);
}
ad = ad / 100.0;
ad = ((((ad * 2.4365234375) - 268.0) / 6.25) - 25.0) * 10.0;
//結果をEEPROMに書き込む。
IntToStr(ad, buf);
buf[6] = buf[5];
buf[5] = '.';
buf[7] = CR;
buf[8] = LF;
EEPROM_24LC1025_Page_Write(addr, &buf[1], 8);
addr += 8;
if (addr >=0x20000)
break;
//約850msecの遅延(遅延内でスイッチが押されると停止する)
for (cnt = 0; cnt < 17; cnt++) {
Delay_ms(50);
//
if (SW == 0) {
break;
}
}
if (cnt != 17)
break;
}
//
for (cnt = 0; cnt < 10; cnt++) {
LED = ON;
Delay_ms(50);
LED = OFF;
Delay_ms(50);
}
}
}
//**********************************************************************
===== 動作確認 =====
{{:imgpaste:202004:htmikan-20200429-102619.png?500}}
左側から、LED、LM60、TL431、PIC12F683、24LC1025、スイッチの順です。
{{:imgpaste:202004:htmikan-20200429-102642.png?500}}
夜中の23時から約4.5時間測定してみました。
その時の記録データです。(最初の部分)
{{:imgpaste:202004:htmikan-20200429-102704.png}}
その時の記録データ(16384件)です。(最後の部分)
{{:imgpaste:202004:htmikan-20200429-102724.png}}
測定データを、Excelでグラフ表示させて見ました。
23時~3時30分にかけて、徐々(1時間に1℃の割合で)に温度が下がっています。
{{:imgpaste:202004:htmikan-20200429-102742.png?500}}
このページは稲崎様の閉鎖したHPのコピーで、著作権は稲崎様にあります。[[elechobby:picdic:picdic|詳細]]
This page is a copy of Mr. Inasaki's closed website, and the copyright is held by him.[[elechobby:picdic:picdic|Details]]