elechobby:picdic:pic12f683:17

温度データロガー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)とする。
  1. 内臓モジュールを初期化する。
  2. スイッチが押されるのを待つ。
  3. 温度を100回測定し、その平均を求める。
  4. 結果をEEPROMに書き込む。
    ※格納フォーマットは、1データ8バイト構成で、次のようになります。
    “29.8”+CR+LF
    “-12.4”+CR+LF
  5. 測定周期が、約1秒になるようにスリープ(遅延:delay)する。
  6. スイッチが押されると測定を停止する。
  7. 1.に戻る。
ThermoLogger.c
//********************************************************************** 
/*
 『温度データロガー(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);
		}
	}
}
 
//**********************************************************************

左側から、LED、LM60、TL431、PIC12F683、24LC1025、スイッチの順です。

夜中の23時から約4.5時間測定してみました。
その時の記録データです。(最初の部分)

その時の記録データ(16384件)です。(最後の部分)

測定データを、Excelでグラフ表示させて見ました。
23時~3時30分にかけて、徐々(1時間に1℃の割合で)に温度が下がっています。

著作権表示 copyright notice

このページは稲崎様の閉鎖したHPのコピーで、著作権は稲崎様にあります。詳細
This page is a copy of Mr. Inasaki's closed website, and the copyright is held by him.Details
  • elechobby/picdic/pic12f683/17.txt
  • 最終更新: 2025/10/17 14:29
  • by 127.0.0.1