Pt100温度測定モジュール

白金測温抵抗体(Pt100)の温度を表示・出力するモジュールです。2線式、3線式、4線式の結線方式に対応しています。
通信インターフェイスはUSB、RS-485(Modbus RTU、コマンド-レスポンス方式)、Grove(I2C)に対応しています。
電源はUSBバスパワー、Grove(3.3V、5V)、外部入力(DC9~27V)に対応しています。
現在温度だけでなく、平均温度、最大温度、最小温度も取得できます。
DINレール取付けとネジ取付けの両方に対応しています。

K型熱電対用の温度測定モジュールもございます。

使用例

各部の名称

※ジャンパーピンの色は画像と異なる場合があります。

内容物

販売

販売ページ(スイッチサイエンス)
※販売ページに表示されている在庫数のほかにも、追加の在庫を保有している場合がございます。大量注文や在庫に関する問い合わせはこちらまでご連絡ください。

使い方

  1. Pt100を接続する
    Pt100を以下の画像のように接続してください。
    また、「Pt100結線方式選択ジャンパ」をPt100の結線方式に合わせて以下のように設定してください。

    結線方式ごとのPt100の接続方法とジャンパ設定
    2線式 3線式 4線式
  2. 電源に接続する
    以下のいずれかの方法で給電して下さい。

    • USB給電(5V)
    • Grove互換コネクタ(3.3V or 5V)
    • 電源入力用端子台(DC9~27V)

    ※複数系統から電源を供給しても問題ありません。

  3. 設定する
    基板上のボタンもしくはI2Cコマンドでセンシングと通信の設定を行ってください。
    ※接続しているPt100の結線方式と設定上の結線方式を一致させる必要があります。

  4. データを取得する
    USB / RS-485 / I2Cで温度データを取得してください。
    ※USB接続の場合、こちらのページからブラウザ上で温度データのロギングを行うこともできます。

通信仕様

仕様

画面遷移図

設定項目の説明

* 工場出荷時の設定

取付方法

DINレール取付け

DINレールアダプタ(Phoenix Contact社 1201578)を画像のようにネジ止めしてください。
※DINレールアダプタ・ねじ等は付属しません。

ねじ取付け

スペーサ等を用いて所望の板等に固定してください。
※スペーサ・ねじ等は付属しません。

ファームウェアのアップデート

詳細を見る

必要なもの

  • 製品本体
  • USBケーブル
  • PC

必要なソフトウェア

本製品に搭載しているSTMicroelectronics社のマイコンへの書込み用ソフト"STM32CubeProg"が必要です。 下記のサイトからソフトウェアをダウンロードしインストールしてください。
https://www.st.com/ja/development-tools/stm32cubeprog.html
※本ソフトウェアをダウンロードするためにはmySTへの登録(無料)が必要です。

ファームウェアの書き換え手順

  1. こちらから最新版のファームウェアをダウンロードします。
  2. 製品にエンコーダやGroveケーブル等が接続されている場合、全て抜いてください。
  3. ブートローダーモードに移行します。CANCELボタンを押したまま、製品にUSBケーブルを挿して電源を供給してください。ディスプレイに何も表示されなければ成功です。ディスプレイに文字などが表示された場合、再度操作を行ってください。
  4. STM32CubeProgからファームウェアを書き込みます。こちらのページの手順に従いファームウェアを書き込んでください。
  5. REBOOTボタンを押してください。

資料

回路図

外形寸法

DXFファイル:dimensional_dxf.zip

3D CADデータ

STEPファイル:pt100-thermometer_step.zip

プログラム例

M5stackのI2Cを用いたカウント値取得のプログラム例

配線図・サンプルコードを見る

#include <M5Core2.h>

#define I2C_DEV_ADDR	    0x16

#define NOWTEMP_REG_ADDR		0x01	// 0x01 - 0x04
#define AVETEMP_REG_ADDR		0x05	// 0x05 - 0x08
#define MAXTEMP_REG_ADDR		0x09	// 0x09 - 0x0C
#define MINTEMP_REG_ADDR		0x0D	// 0x0D - 0x10
#define STAT_REG_ADDR			0x11
#define VRST_REG_ADDR			0x12
#define AVRST_REG_ADDR			0x13
#define SCONF_REG_ADDR			0x14
#define CCONF_REG_ADDR			0x15
#define MODADDR_REG_ADDR		0x16
#define OFFSET_REG_ADDR			0x17	// 0x17 - 0x18
#define VMAJOR_REG_ADDR			0xFA
#define VMINOR_REG_ADDR			0xFB
#define VPATCH_REG_ADDR			0xFC
#define SYSRBT_REG_ADDR			0xFD
#define I2CADDR_REG_ADDR		0xFE
#define INIT_REG_ADDR			0xFF

void setup() {
  M5.begin(true, true, true, true);
  M5.Lcd.setTextSize(3);

  byte error;
  // Set sensing config
  // SCONF: Filter=60Hz, Unit=Celsius, Wiring=3-wire
  uint8_t sconf = 0x11;
  Wire.beginTransmission(I2C_DEV_ADDR);
  Wire.write(SCONF_REG_ADDR);
  Wire.write(sconf);
  error = Wire.endTransmission();
  if (error){
    Serial.print("error=");Serial.println(error);
  }
  delay(2000);  // Wait until the config is written and the device reboots

  // Set Communication config
  // CCONF: RS485 baudrate=9600, RS485=Modbus, USB Auto Tx=10sec, USB Auto Tx=Disable
  uint8_t cconf = 0x02;
  Wire.beginTransmission(I2C_DEV_ADDR);
  Wire.write(CCONF_REG_ADDR);
  Wire.write(cconf);
  error = Wire.endTransmission();
  if (error){
    Serial.print("error=");Serial.println(error);
  }
  delay(2000);
}

void loop() {
  union _32bit_u
  {
    uint8_t uint8_data[4];
    int32_t int32_data;
  } temp_values[4];
  float temperatures[4];
  const char *str_prefix[4] = {"Now: ", "Ave: ", "Max: ", "Min: "};

  M5.Lcd.setCursor(0, 0);

  Wire.beginTransmission(I2C_DEV_ADDR);
  Wire.write(NOWTEMP_REG_ADDR);
  Wire.endTransmission(false);
  Wire.requestFrom(I2C_DEV_ADDR, 4 * 4);
  for(int i = 0; i < 4; i++) {
    for(int j = 0; j < 4; j++) {
      temp_values[i].uint8_data[j] = Wire.read();
    }
    temperatures[i] = (float)(temp_values[i].int32_data) * 0.01f;

    char strBuf[12];
    sprintf(strBuf, "%s%6.2f", str_prefix[i], temperatures[i]);
    M5.Lcd.println(strBuf);
  }
  delay(2000);
}

USB接続で温度をロギングするプログラム例

配線図・サンプルコードを見る

こちらのページからブラウザ上で温度データのロギングを行うこともできます。



ダウンロード

サンプルコード(.NET 6.0)

using System;
using System.IO.Ports;  // https://www.nuget.org/packages/System.IO.Ports

public class pt100_usb_logger
{
    static SerialPort? _serialPort;
    static bool _continue;
    static string _portName = "";

    public static int Main(string[] args)
    {
        StringComparer stringComparer = StringComparer.OrdinalIgnoreCase;
        Console.WriteLine("Obtain temperatures from Pt100 Thermometer via USB and save them to CSV.\n(The USB auto tx mode must be enabled.)\n");
        Console.WriteLine("Available ports:");
        foreach (string s in SerialPort.GetPortNames())
            Console.WriteLine("\t{0}", s);
        _portName = InputPortName();
        _serialPort = new SerialPort(_portName, 921600, Parity.None, 8, StopBits.One);
        if(_serialPort.IsOpen) {
            Console.WriteLine("Error: {0} is already open.", _portName);
            return 1;
        }
        _serialPort.ReadTimeout = _serialPort.WriteTimeout = 300;
        _serialPort.Open();

        Thread loggingThread = new Thread(LoggingThread);
        _continue = true;
        loggingThread.Start();
        Console.WriteLine("\nStart logging. Type QUIT to exit.");
        while (_continue)
        {
            string message = Console.ReadLine()!;
            if (stringComparer.Equals("quit", message)) {
                _continue = false;
            }
        }
        loggingThread.Join();
        _serialPort.Close();
        return 0;
    }

    public static void LoggingThread()
    {
        while (_continue)
        {
            try
            {
                string message = _serialPort!.ReadLine();
                string text = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + "," + message;
                Console.WriteLine(text);
                File.AppendAllText("./temperature_log_" + _portName + ".csv", text + '\n');
            }
            catch (TimeoutException) { }
        }
    }

    public static string InputPortName()
    {
        string portName;
        string[] ports = SerialPort.GetPortNames();
        string defaultPortName = ports.Length >= 1 ? ports[0] : "COM1";
        Console.Write("Enter COM port value (Default: {0}): ", defaultPortName);
        portName = Console.ReadLine()!;
        if (portName == "" || !(portName.ToLower()).StartsWith("com")) {
            portName = defaultPortName;
        }
        return portName;
    }
}

FAQ

詳細を見る

STATレジスタの値と考えられる原因

結線方式ごとのSTATレジスタのビット番号と考えられる原因
ビット番号 2線式の場合 3線式の場合 4線式の場合
Bit [7] - Pt100が接続されていない - Pt100が接続されていない
- RTD+がHighに短絡し、Pt100が接続されていない
- F+がHighに短絡し、Pt100に接続されている
Bit [6] - Pt100が短絡している
- RTD+がLowに短絡している
- RTD+RTD-が短絡している
- RTD+がLowに短絡し、Pt100が接続されていない
- F+がLowに短絡している
- RTD+RTD-が短絡している
- RTD+がLowに短絡し、Pt100が接続されていない
- RTD-がHighに短絡し、Pt100が接続されていない
- F+がLowに短絡している
Bit [5] - Pt100が接続されていない
- RTD+がHighに短絡している
- RTD-がHighに短絡している
- Pt100が接続されていない
- F+がHighに短絡し、Pt100に接続されている
- F+が接続されていない
- F+がHighに短絡し、Pt100に接続されていない
- RTD-がHighに短絡している
- Pt100が接続されていない
- F+がHighに短絡し、Pt100に接続されている
- F-が接続されていない
- F+が接続されていない
- F+がHighに短絡し、Pt100に接続されていない
- F-がHighに短絡し、Pt100に接続されていない
- F-がHighに短絡し、Pt100に接続されてる
- F-がLowに短絡し、Pt100に接続されていない
Bit [4] - RTD-がLowに短絡している - F-がLowに短絡し、Pt100に接続されている
- RTD-がLowに短絡し、Pt100に接続されている
Bit [3] - RTD-がLowに短絡している
- RTD+がLowに短絡している
- F+がLowに短絡している
- RTD+がLowに短絡し、Pt100に接続されている
- RTD-がLowに短絡している
- F+がLowに短絡している
- RTD+がLowに短絡し、Pt100に接続されている
- RTD-がLowに短絡し、Pt100に接続されている
- RTD-がLowに短絡し、Pt100に接続されていない
- F-がLowに短絡している
Bit [2] - 電源電圧の異常

  1. 市販のPt100で主に使用されるM3、M4の圧着端子に対応しています。 ↩︎

  2. 使用しているPt100の使用可能温度範囲に制限されます。 ↩︎

  3. Pt100自体の精度は含みません。 ↩︎

  4. 値がリセットされるとディスプレイ上の該当数値部分が点滅します。 ↩︎

  5. 基板上の「RS-485終端抵抗有効化ジャンパ」によって終端抵抗を使用するかどうか選択できます。 ↩︎

  6. 基本的にPCとUSBで接続すると自動的にUSBドライバがインストールされますが、自動的にUSBドライバがインストールされない場合はこちらのページ下部のCH341SER.EXEをインストールして下さい。 ↩︎