今から始める電子工作 Step4 ③ 温度センサ 白金測温抵抗体 MAX31865

 ここでは、Arduino UNO R4 WiFi で温度センサに白金測温体を利用します。測定できる温度範囲などは熱電対に近いです。

環境

  • Arduino IDE;2.3.5
  • Windows11;24H2
  • Arduino UNO R4 WiFi 

MAX31865の主な特徴

  • 抵抗値 PT100(100Ω)〜PT1000(1kΩ)
  • 接続  2、3、4線式のいずれにも対応
  • インターフェース SPI(ChipSelect、SCK、MISO、MOSI。Mode1/3)
  • 基準抵抗は430Ω

 ブレークアウト・ボードとPT100のセンサはアマゾンで入手しました。ボードはAdafruit製とよく似ています。

  HiLetgo PT100 MAX31865 Arduino用RTD温度熱電対センサーアンプモジュール

 センサは3線式をアマゾンで購入しました。

  uxcell PT100 RTD温度センサープローブ 3線ケーブル熱電対 ステンレス鋼 200cm(6.56ft)、2Bグレード

<参考>

  Adafruit MAX31865 RTD PT100 or PT1000 Amplifier

接続

  • ねじ留めをする2ピンのターミナルを連結して、ボードに挿し込んではんだ付けする
  • 8ピンのピンヘッダをはんだ付けする
  • シルク印刷「2/3Wire」のショート部分をはんだを盛ってショートする
  • シルク印刷「2 4 3」 ショート部分のはんだ吸い取り線ではんだを取り去る。2-4間がプリント版の銅配線でショートされているので、ナイフで削り取る。4と3をはんだを盛ってショートする
  • F+とRTD+にPT100の赤色のケーブルをそれぞれ接続する
  • F-にPT100の赤色でないケーブルを接続する
  • ピンヘッダVinをArduino UNOの5Vにつなぐ、
  • GND同士をつなぐ
  • ピンヘッダCLKをArduino UNOのSCK(13)につなぐ
  • ピンヘッダSDOをArduino UNOのMISO(12)につなぐ
  • ピンヘッダSDIをArduino UNOのMOSI(11)につなぐ
  • ピンヘッダCSをArduino UNOの(7)につなぐ

最近の表記
  • MISO;マスター・イン・スレーブ・アウト-> CIPOコントローラー・イン・ペリフェラル・アウト
  • MOSI;マスター・アウト・スレーブ・イン-> COPIコントローラー・アウト・ペリフェラル・イン
  • SS;スレーブ・セレクト <- CS -> SSLA0
  • SCK; -> RSPCKA

MAX31865のレジスタ

  データシート

Configuration;アドレス 読み出し時0x00、書き込み時0x80

D7 D6 D5 D4 D3 D2 D1 D0
VBIAS
1 = ON
0 = OFF
Conversion
mode
1 = Auto
0 = Normally off
1-shot
1 = 1-shot
(auto-clear)
3-wire
1 = 3-wire RTD
0 = 2-wire or
4-wire
Fault Detection
Cycle Control
Fault Status
Clear
1 = Clear
(auto-clear)
50/60Hz filter
select
1 = 50Hz
0 = 60Hz

RTDの読み出し上位1バイト;アドレス 読み出し時0x01

RTDの読み出し下位1バイト;アドレス 読み出し時0x02

レジスタ RTDの読み出し上位1バイト RTDの読み出し下位1バイト
ビット D7 D6 D5 D4 D3 D2 D1 D0 D7 D6 D5 D4 D3 D1 D0 D0
データ MSB                           LSB Fault

 アラート関係は省略。

スケッチ

 SPIライブラリを使います。settingsしていないと最近はデフォルトのままでは動きません。モードは1です。多くのデバイスでは0が使われます。チップ・セレクトSSは7番ピンを使います。後述のグラフィック・ディスプレイが10番を使っています。

#include <SPI.h> 
#define SS 7

SPISettings settings(100000,MSBFIRST,SPI_MODE1);
 
 Configurationの書き込みアドレスは0x80です。書き込む内容は0b11010011 ですが、関西の人は0b11010010です。AC100Vの誘導ノイズを軽減します。
 マニュアルにはrefResistor を400Ωと書かれていますが、基板上には430Ωがありました。
 抵抗値は、RTD_Resistance_MSBの上位バイトから2バイト読み出します。
 
#define Configuration_REGISTER_W  0x80
#define Configuration 0b11010011 // 3wire autoconvertion 50Hzfilter
#define setConfig 0x00
const float TDnominal = 100.0;
const float refResistor = 430.0;
#define RTD_Resistance_MSB  0x01
 
 setup() 内です。
 チップ・セレクト信号SS(7ピン)は出力に設定し、負論理なので、デフォルトのHIGHにします。
 
 チップ・セレクト信号の制御は、ハードでは行ってくれないので、通信を始めるときにHIGHからLOWにし、通信が終わるとHIGHに戻します
 ここでは、Configurationレジスタに設定内容を書き込んでいます。
 
  SPI.begin();
    SPI.beginTransaction(settings);
        digitalWrite(SS, LOW);
            SPI.transfer(Configuration_REGISTER_W);
            SPI.transfer(Configuration); 
        digitalWrite(SS, HIGH);
    SPI.endTransaction();
 
 抵抗値を読み取って温度を返すread_tempdata() 関数です。抵抗値の入った上位バイト0x01を指定し、ダミーの0x55を2回送って、その代わりに上位バイトhighByte と下位バイトlowByte を読み込みます。
 
double read_tempdata() {
    SPI.beginTransaction(settings);
        digitalWrite(SS, LOW);
            SPI.transfer(RTD_Resistance_MSB); // 
            uint16_t highByte = SPI.transfer(0x55); // dummy
            uint8_t  lowByte = SPI.transfer(0x55);  // dummy
        digitalWrite(SS, HIGH);
    SPI.endTransaction();
 
 
 読み取った2バイトのデータを15ビットのデータに直します。LSBはFaultビットなので、右に1シフトして消します。データシートに書かれている計算式で抵抗値rを求めます。rから温度Tを求める説明は下記で行います。
 
    uint16_t dataT = ((highByte << 8) | lowByte) >> 1;
    double r = dataT * refResistor / 32768.0;

#include  <SPI.h>   
#define SS 7

SPISettings settings(100000,MSBFIRST,SPI_MODE1);

#define Configuration_REGISTER_W  0x80
#define Configuration 0b11010011 // 3wire autoconvertion 50Hzfilter
#define setConfig 0x00
const float TDnominal = 100.0;
const float refResistor = 430.0;
#define RTD_Resistance_MSB  0x01

int16_t sensorValue;
float analogSensorData;

void setup() {
  Serial.begin(9600);
  delay(2000);;
  Serial.println("\nMAX31865 test");
  pinMode(SS, OUTPUT);
  digitalWrite(SS, HIGH);
  SPI.begin();
    SPI.beginTransaction(settings);
        digitalWrite(SS, LOW);
            SPI.transfer(Configuration_REGISTER_W);
            SPI.transfer(Configuration); 
        digitalWrite(SS, HIGH);
    SPI.endTransaction();

}

double r;
void loop() {
  Serial.println("====");
  float temp = read_tempRdata();
  Serial.print(" Resistor = "); Serial.println(temp,4);

  delay(3000);
}

double read_tempRdata() {
    SPI.beginTransaction(settings);
        digitalWrite(SS, LOW);
            SPI.transfer(RTD_Resistance_MSB); // 
            uint16_t highByte = SPI.transfer(0x55); // dummy
            uint8_t  lowByte = SPI.transfer(0x55);  // dummy
        digitalWrite(SS, HIGH);
    SPI.endTransaction();
    // Serial.print(highByte); Serial.print(" , ");Serial.println(lowByte);
    uint16_t dataT = ((highByte << 8) | lowByte) >> 1;
    r = dataT * refResistor / 32768.0;

    //Serial.println(r);
    return r;
}

 実行している様子です。109Ωはだいたい24℃です。

抵抗値から温度を得る

  AN-709 APPLICATION NOTE

には、補正方法が三つ紹介されています。

  初めてのArduino ⑧ UNOボードで温度を測る(その3 白金測温抵抗体 MAX31865)

上記の記事では、エクセルを使って、近似曲線から温度を得る演算式を導いて利用しました。

 EIAの抵抗値表やJISから測温体の抵抗値と温度の対応表が入手できます。今回はその1℃ごとに抵抗値が書かれた表を利用します。1℃の間は、直線で補完します。

 -100~0℃と、0~600℃の配列を作って計算しました。

 ダミーで、零下側と、高温側の抵抗値のデータを用意します。

float readpt100(){
  pt100R0 = 139.4;
  pt100R0minus = 97.0;
}

 スケッチです。

float pt100R0, pt100R0minus;

float pt100under0[] = {    // -100'C to 0'C
/* 0   */ 100.00, 99.61, 99.22, 98.83, 98.44, 98.04, 97.65, 97.26, 96.87, 96.48,
/* -10 */ 96.09, 95.69, 95.30, 94.91, 94.52, 94.12, 93.73, 93.34, 92.95, 92.55,
/* -20 */ 92.16, 91.77, 91.37, 90.98, 90.59, 90.19, 89.80, 89.40, 89.01, 88.62, 
/* -30 */ 88.22, 87.83, 87.43, 87.04, 86.64, 86.25, 85.85, 85.46, 85.06, 84.67, 
/* -40 */ 84.27, 83.87, 83.48, 83.08, 82.69, 82.29, 81.89, 81.50, 81.10, 80.70, 
/* -50 */ 80.31, 79.91, 79.51, 79.11, 78.72, 78.32, 77.92, 77.52, 77.12, 76.73, 
/* -60 */ 76.33, 75.93, 75.53, 75.13, 74.73, 74.33, 73.93, 73.53, 73.13, 72.73, 
/* -70 */ 72.33, 71.93, 71.53, 71.13, 70.73, 70.33, 69.93, 69.53, 69.13, 68.73,
/* -80 */ 68.33, 67.92, 67.52, 67.12, 66.72, 66.31, 65.91, 65.51, 65.11, 64.70, 
/* -90 */ 64.30, 63.90, 63.49, 63.09, 62.68, 62.28, 61.88, 61.47, 61.07, 60.66, 
/* -100 */ 60.26, 59.85, 59.44, 59.04, 58.63, 58.23, 57.82, 57.41, 57.01, 56.60
};

float pt100over0[] = {    // 0'C to 600'C ;; 
/* 0   */ 100.00, 100.39, 100.78, 101.17, 101.56, 101.95, 102.34, 102.73, 103.12, 103.51, 
/* 10 */ 103.90, 104.29, 104.68, 105.07, 105.46, 105.85, 106.24, 106.63, 107.02, 107.40,
/* 20 */ 107.79, 108.18, 108.57, 108.96, 109.35, 109.73, 110.12, 110.51, 110.90, 111.29,
/* 30 */ 111.67, 112.06, 112.45, 112.83, 113.22, 113.61, 114.00, 114.38, 114.77, 115.15,
/* 40 */ 115.54, 115.93, 116.31, 116.70, 117.08, 117.47, 117.86, 118.24, 118.63, 119.01,
/* 50 */ 119.40, 119.78, 120.17, 120.55, 120.94, 121.32, 121.71, 122.09, 122.47, 122.86,
/* 60 */ 123.24, 123.63, 124.01, 124.39, 124.78, 125.16, 125.54, 125.93, 126.31, 126.69,
/* 70 */ 127.08, 127.46, 127.84, 128.22, 128.61, 128.99, 129.37, 129.75, 130.13, 130.52,
/* 80 */ 130.90, 131.28, 131.66, 132.04, 132.42, 132.80, 133.18, 133.57, 133.95, 134.33,
/* 90 */ 134.71, 135.09, 135.47, 135.85, 136.23, 136.61, 136.99, 137.37, 137.75, 138.13,
/* 100 */ 138.51, 138.88, 139.26, 139.64, 140.02, 140.40, 140.78, 141.16, 141.54, 141.91,
/* 110 */ 142.29, 142.67, 143.05, 143.43, 143.80, 144.18, 144.56, 144.94, 145.31, 145.69,
/* 120 */ 146.07, 146.44, 146.82, 147.20, 147.57, 147.95, 148.33, 148.70, 149.08, 149.46,
/* 130 */ 149.83, 150.21, 150.58, 150.96, 151.33, 151.71, 152.08, 152.46, 152.83, 153.21,
/* 140 */ 153.58, 153.96, 154.33, 154.71, 155.08, 155.46, 155.83, 156.20, 156.58, 156.95,
/* 150 */ 157.33, 157.70, 158.07, 158.45, 158.82, 159.19, 159.56, 159.94, 160.31, 160.68,
/* 160 */ 161.05, 161.43, 161.80, 162.17, 162.54, 162.91, 163.29, 163.66, 164.03, 164.40,
/* 170 */ 164.77, 165.14, 165.51, 165.89, 166.26, 166.63, 167.00, 167.37, 167.74, 168.11,
/* 180 */ 168.48, 168.85, 169.22, 169.59, 169.96, 170.33, 170.70, 171.07, 171.43, 171.80,
/* 190 */ 172.17, 172.54, 172.91, 173.28, 173.65, 174.02, 174.38, 174.75, 175.12, 175.49,
/* 200 */ 175.86, 176.22, 176.59, 176.96, 177.33, 177.69, 178.06, 178.43, 178.79, 179.16,
/* 210 */ 179.53, 179.89, 180.26, 180.63, 180.99, 181.36, 181.72, 182.09, 182.46, 182.82,
/* 220 */ 183.19, 183.55, 183.92, 184.28, 184.65, 185.01, 185.38, 185.74, 186.11, 186.47,
/* 230 */ 186.84, 187.20, 187.56, 187.93, 188.29, 188.66, 189.02, 189.38, 189.75, 190.11,
/* 240 */ 190.47, 190.84, 191.20, 191.56, 191.92, 192.29, 192.65, 193.01, 193.37, 193.74,
/* 250 */ 194.10, 194.46, 194.82, 195.18, 195.55, 195.91, 196.27, 196.63, 196.99, 197.35,
/* 260 */ 197.71, 198.07, 198.43, 198.79, 199.15, 199.51, 199.87, 200.23, 200.59, 200.95,
/* 270 */ 201.31, 201.67, 202.03, 202.39, 202.75, 203.11, 203.47, 203.83, 204.19, 204.55,
/* 280 */ 204.90, 205.26, 205.62, 205.98, 206.34, 206.70, 207.05, 207.41, 207.77, 208.13, 
/* 290 */ 208.48, 208.84, 209.20, 209.56, 209.91, 210.27, 210.63, 210.98, 211.34, 211.70,
/* 300 */ 212.05, 212.41, 212.76, 213.12, 213.48, 213.83, 214.19, 214.54, 214.90, 215.25,
/* 310 */ 215.61, 215.96, 216.32, 216.67, 217.03, 217.38, 217.74, 218.09, 218.44, 218.80,
/* 320 */ 219.15, 219.51, 219.86, 220.21, 220.57, 220.92, 221.27, 221.63, 221.98, 222.33,
/* 330 */ 222.68, 223.04, 223.39, 223.74, 224.09, 224.45, 224.80, 225.15, 225.50, 225.85,
/* 340 */ 226.21, 226.56, 226.91, 227.26, 227.61, 227.96, 228.31, 228.66, 229.02, 229.37,
/* 350 */ 229.72, 230.07, 230.42, 230.77, 231.12, 231.47, 231.82, 232.17, 232.52, 232.87,
/* 360 */ 233.21, 233.56, 233.91, 234.26, 234.61, 234.96, 235.31, 235.66, 236.00, 236.35,
/* 370 */ 236.70, 237.05, 237.40, 237.74, 238.09, 238.44, 238.79, 239.13, 239.48, 239.83,
/* 380 */ 240.18, 240.52, 240.87, 241.22, 241.56, 241.91, 242.26, 242.60, 242.95, 243.29,
/* 390 */ 243.64, 243.99, 244.33, 244.68, 245.02, 245.37, 245.71, 246.06, 246.40, 246.75,
/* 400 */ 247.09, 247.44, 247.78, 248.13, 248.47, 248.81, 249.16, 249.50, 249.85, 250.19,
/* 410 */ 250.53, 250.88, 251.22, 251.56, 251.91, 252.25, 252.59, 252.93, 253.28, 253.62,
/* 420 */ 253.96, 254.30, 254.65, 254.99, 255.33, 255.67, 256.01, 256.35, 256.70, 257.04,
/* 430 */ 257.38, 257.72, 258.06, 258.40, 258.74, 259.08, 259.42, 259.76, 260.10, 260.44,
/* 440 */ 260.78, 261.12, 261.46, 261.80, 262.14, 262.48, 262.82, 263.16, 263.50, 263.84,
/* 450 */ 264.18, 264.52, 264.86, 265.20, 265.53, 265.87, 266.21, 266.55, 266.89, 267.22,
/* 460 */ 267.56, 267.90, 268.24, 268.57, 268.91, 269.25, 269.59, 269.92, 270.26, 270.60,
/* 470 */ 270.93, 271.27, 271.61, 271.94, 272.28, 272.61, 272.95, 273.29, 273.62, 273.96,
/* 480 */ 274.29, 274.63, 274.96, 275.30, 275.63, 275.97, 276.30, 276.64, 276.97, 277.31,
/* 490 */ 277.64, 277.98, 278.31, 278.64, 278.98, 279.31, 279.64, 279.98, 280.31, 280.64,
/* 500 */ 280.98, 281.31, 281.64, 281.98, 282.31, 282.64, 282.97, 283.31, 283.64, 283.97,
/* 510 */ 284.30, 284.63, 284.97, 285.30, 285.63, 285.96, 286.29, 286.62, 286.95, 287.29,
/* 520 */ 287.62, 287.95, 288.28, 288.61, 288.94, 289.27, 289.60, 289.93, 290.26, 290.59,
/* 530 */ 290.92, 291.25, 291.58, 291.91, 292.24, 292.56, 292.89, 293.22, 293.55, 293.88,
/* 540 */ 294.21, 294.54, 294.86, 295.19, 295.52, 295.85, 296.18, 296.50, 296.83, 297.16,
/* 550 */ 297.49, 297.81, 298.14, 298.47, 298.80, 299.12, 299.45, 299.78, 300.10, 300.43, 
/* 560 */ 300.75, 301.08, 301.41, 301.73, 302.06, 302.38, 302.71, 303.03, 303.36, 303.69,
/* 570 */ 304.01, 304.34, 304.66, 304.98, 305.31, 305.63, 305.96, 306.28, 306.61, 306.93,
/* 580 */ 307.25, 307.58, 307.90, 308.23, 308.55, 308.87, 309.20, 309.52, 309.84, 310.16,
/* 590 */ 310.49, 310.81, 311.13, 311.45, 311.78, 312.10, 312.42, 312.74, 313.06, 313.39,
/* 600 */ 313.71, 314.03, 314.35, 314.67, 314.99, 315.31, 315.64, 315.96, 316.28, 316.60,
/* 610 */ 316.92, 317.24, 317.56, 317.88, 318.20, 318.52, 318.84, 319.16, 319.48, 319.80
};

void setup() {
    Serial.begin(9600);
    delay(1000);
    Serial.println("\npt100 MAX31865 tset start");
}
int t;
float temp, derutaR;
void loop() {
  Serial.println("------- ");
  readpt100();
  Serial.print("read pt100 registance ");Serial.println(pt100R0);
  
    for ( t = 0; pt100over0[t] < pt100R0; ++t){
      Serial.print(". ");
    }
      Serial.print("\nt= ");Serial.println(t);
      Serial.print("read pt100 registance \t");Serial.println(pt100R0);
      Serial.print("pt100 registance= Table_H\t");Serial.println(pt100over0[t]);
      Serial.print("pt100 registance= Table_L\t");Serial.println(pt100over0[t-1]);
      derutaR = ((pt100R0 - pt100over0[t-1]) /  (pt100over0[t] - pt100over0[t-1]));
      temp = (t-1) + derutaR;
      Serial.print("temp = \t");Serial.println(temp,4)  ;

    for ( t = 100; pt100under0[t] < pt100R0minus; --t){
      Serial.print(". ");
    }
      Serial.print("\nt= ");Serial.println(t);
      Serial.print("read pt100 registance \t");Serial.println(pt100R0minus);
      Serial.print("pt100 registance= Table_H\t");Serial.println(pt100under0[t]);
      Serial.print("pt100 registance= Table_L\t");Serial.println(pt100under0[t+1]);
      derutaR = ((pt100R0minus - pt100under0[t+1]) /  (pt100under0[t] - pt100under0[t+1]));
      // Serial.print("derutaR = \t");Serial.println(derutaR,4)  ;
      temp = (t+1) - derutaR;
      Serial.print("temp = \t");Serial.println(-1.0 * temp,4)  ;

  delay(100000);
}

float readpt100(){
  pt100R0 = 139.4;
  pt100R0minus = 97.0;
}

 実行している様子です。

実際の測定

 上記の二つのスケッチを合わせて、実際の温度を測ります。上記のスケッチとは変数名などを変更しました。

#include  <SPI.h> 
#define SS 7

SPISettings settings(100000,MSBFIRST,SPI_MODE1);

#define Configuration_REGISTER_W  0x80
#define Configuration 0b11010011 // 3wire autoconvertion 50Hzfilter
#define setConfig 0x00
const float TDnominal = 100.0;
const float refResistor = 430.0;
#define RTD_Resistance_MSB  0x01

int16_t sensorValue;
float analogSensorData;
float r, pt100Resistor, pt100temperature, derutaR ;
int t;

float pt100under0[] = {    // -100'C to 0'C
/* 0   */ 100.00, 99.61, 99.22, 98.83, 98.44, 98.04, 97.65, 97.26, 96.87, 96.48,
/* -10 */ 96.09, 95.69, 95.30, 94.91, 94.52, 94.12, 93.73, 93.34, 92.95, 92.55,
/* -20 */ 92.16, 91.77, 91.37, 90.98, 90.59, 90.19, 89.80, 89.40, 89.01, 88.62, 
/* -30 */ 88.22, 87.83, 87.43, 87.04, 86.64, 86.25, 85.85, 85.46, 85.06, 84.67, 
/* -40 */ 84.27, 83.87, 83.48, 83.08, 82.69, 82.29, 81.89, 81.50, 81.10, 80.70, 
/* -50 */ 80.31, 79.91, 79.51, 79.11, 78.72, 78.32, 77.92, 77.52, 77.12, 76.73, 
/* -60 */ 76.33, 75.93, 75.53, 75.13, 74.73, 74.33, 73.93, 73.53, 73.13, 72.73, 
/* -70 */ 72.33, 71.93, 71.53, 71.13, 70.73, 70.33, 69.93, 69.53, 69.13, 68.73,
/* -80 */ 68.33, 67.92, 67.52, 67.12, 66.72, 66.31, 65.91, 65.51, 65.11, 64.70, 
/* -90 */ 64.30, 63.90, 63.49, 63.09, 62.68, 62.28, 61.88, 61.47, 61.07, 60.66, 
/* -100 */ 60.26, 59.85, 59.44, 59.04, 58.63, 58.23, 57.82, 57.41, 57.01, 56.60
};

float pt100over0[] = {    // 0'C to 600'C 
/* 0   */ 100.00, 100.39, 100.78, 101.17, 101.56, 101.95, 102.34, 102.73, 103.12, 103.51, 
/* 10 */ 103.90, 104.29, 104.68, 105.07, 105.46, 105.85, 106.24, 106.63, 107.02, 107.40,
/* 20 */ 107.79, 108.18, 108.57, 108.96, 109.35, 109.73, 110.12, 110.51, 110.90, 111.29,
/* 30 */ 111.67, 112.06, 112.45, 112.83, 113.22, 113.61, 114.00, 114.38, 114.77, 115.15,
/* 40 */ 115.54, 115.93, 116.31, 116.70, 117.08, 117.47, 117.86, 118.24, 118.63, 119.01,
/* 50 */ 119.40, 119.78, 120.17, 120.55, 120.94, 121.32, 121.71, 122.09, 122.47, 122.86,
/* 60 */ 123.24, 123.63, 124.01, 124.39, 124.78, 125.16, 125.54, 125.93, 126.31, 126.69,
/* 70 */ 127.08, 127.46, 127.84, 128.22, 128.61, 128.99, 129.37, 129.75, 130.13, 130.52,
/* 80 */ 130.90, 131.28, 131.66, 132.04, 132.42, 132.80, 133.18, 133.57, 133.95, 134.33,
/* 90 */ 134.71, 135.09, 135.47, 135.85, 136.23, 136.61, 136.99, 137.37, 137.75, 138.13,
/* 100 */ 138.51, 138.88, 139.26, 139.64, 140.02, 140.40, 140.78, 141.16, 141.54, 141.91,
/* 110 */ 142.29, 142.67, 143.05, 143.43, 143.80, 144.18, 144.56, 144.94, 145.31, 145.69,
/* 120 */ 146.07, 146.44, 146.82, 147.20, 147.57, 147.95, 148.33, 148.70, 149.08, 149.46,
/* 130 */ 149.83, 150.21, 150.58, 150.96, 151.33, 151.71, 152.08, 152.46, 152.83, 153.21,
/* 140 */ 153.58, 153.96, 154.33, 154.71, 155.08, 155.46, 155.83, 156.20, 156.58, 156.95,
/* 150 */ 157.33, 157.70, 158.07, 158.45, 158.82, 159.19, 159.56, 159.94, 160.31, 160.68,
/* 160 */ 161.05, 161.43, 161.80, 162.17, 162.54, 162.91, 163.29, 163.66, 164.03, 164.40,
/* 170 */ 164.77, 165.14, 165.51, 165.89, 166.26, 166.63, 167.00, 167.37, 167.74, 168.11,
/* 180 */ 168.48, 168.85, 169.22, 169.59, 169.96, 170.33, 170.70, 171.07, 171.43, 171.80,
/* 190 */ 172.17, 172.54, 172.91, 173.28, 173.65, 174.02, 174.38, 174.75, 175.12, 175.49,
/* 200 */ 175.86, 176.22, 176.59, 176.96, 177.33, 177.69, 178.06, 178.43, 178.79, 179.16,
/* 210 */ 179.53, 179.89, 180.26, 180.63, 180.99, 181.36, 181.72, 182.09, 182.46, 182.82,
/* 220 */ 183.19, 183.55, 183.92, 184.28, 184.65, 185.01, 185.38, 185.74, 186.11, 186.47,
/* 230 */ 186.84, 187.20, 187.56, 187.93, 188.29, 188.66, 189.02, 189.38, 189.75, 190.11,
/* 240 */ 190.47, 190.84, 191.20, 191.56, 191.92, 192.29, 192.65, 193.01, 193.37, 193.74,
/* 250 */ 194.10, 194.46, 194.82, 195.18, 195.55, 195.91, 196.27, 196.63, 196.99, 197.35,
/* 260 */ 197.71, 198.07, 198.43, 198.79, 199.15, 199.51, 199.87, 200.23, 200.59, 200.95,
/* 270 */ 201.31, 201.67, 202.03, 202.39, 202.75, 203.11, 203.47, 203.83, 204.19, 204.55,
/* 280 */ 204.90, 205.26, 205.62, 205.98, 206.34, 206.70, 207.05, 207.41, 207.77, 208.13, 
/* 290 */ 208.48, 208.84, 209.20, 209.56, 209.91, 210.27, 210.63, 210.98, 211.34, 211.70,
/* 300 */ 212.05, 212.41, 212.76, 213.12, 213.48, 213.83, 214.19, 214.54, 214.90, 215.25,
/* 310 */ 215.61, 215.96, 216.32, 216.67, 217.03, 217.38, 217.74, 218.09, 218.44, 218.80,
/* 320 */ 219.15, 219.51, 219.86, 220.21, 220.57, 220.92, 221.27, 221.63, 221.98, 222.33,
/* 330 */ 222.68, 223.04, 223.39, 223.74, 224.09, 224.45, 224.80, 225.15, 225.50, 225.85,
/* 340 */ 226.21, 226.56, 226.91, 227.26, 227.61, 227.96, 228.31, 228.66, 229.02, 229.37,
/* 350 */ 229.72, 230.07, 230.42, 230.77, 231.12, 231.47, 231.82, 232.17, 232.52, 232.87,
/* 360 */ 233.21, 233.56, 233.91, 234.26, 234.61, 234.96, 235.31, 235.66, 236.00, 236.35,
/* 370 */ 236.70, 237.05, 237.40, 237.74, 238.09, 238.44, 238.79, 239.13, 239.48, 239.83,
/* 380 */ 240.18, 240.52, 240.87, 241.22, 241.56, 241.91, 242.26, 242.60, 242.95, 243.29,
/* 390 */ 243.64, 243.99, 244.33, 244.68, 245.02, 245.37, 245.71, 246.06, 246.40, 246.75,
/* 400 */ 247.09, 247.44, 247.78, 248.13, 248.47, 248.81, 249.16, 249.50, 249.85, 250.19,
/* 410 */ 250.53, 250.88, 251.22, 251.56, 251.91, 252.25, 252.59, 252.93, 253.28, 253.62,
/* 420 */ 253.96, 254.30, 254.65, 254.99, 255.33, 255.67, 256.01, 256.35, 256.70, 257.04,
/* 430 */ 257.38, 257.72, 258.06, 258.40, 258.74, 259.08, 259.42, 259.76, 260.10, 260.44,
/* 440 */ 260.78, 261.12, 261.46, 261.80, 262.14, 262.48, 262.82, 263.16, 263.50, 263.84,
/* 450 */ 264.18, 264.52, 264.86, 265.20, 265.53, 265.87, 266.21, 266.55, 266.89, 267.22,
/* 460 */ 267.56, 267.90, 268.24, 268.57, 268.91, 269.25, 269.59, 269.92, 270.26, 270.60,
/* 470 */ 270.93, 271.27, 271.61, 271.94, 272.28, 272.61, 272.95, 273.29, 273.62, 273.96,
/* 480 */ 274.29, 274.63, 274.96, 275.30, 275.63, 275.97, 276.30, 276.64, 276.97, 277.31,
/* 490 */ 277.64, 277.98, 278.31, 278.64, 278.98, 279.31, 279.64, 279.98, 280.31, 280.64,
/* 500 */ 280.98, 281.31, 281.64, 281.98, 282.31, 282.64, 282.97, 283.31, 283.64, 283.97,
/* 510 */ 284.30, 284.63, 284.97, 285.30, 285.63, 285.96, 286.29, 286.62, 286.95, 287.29,
/* 520 */ 287.62, 287.95, 288.28, 288.61, 288.94, 289.27, 289.60, 289.93, 290.26, 290.59,
/* 530 */ 290.92, 291.25, 291.58, 291.91, 292.24, 292.56, 292.89, 293.22, 293.55, 293.88,
/* 540 */ 294.21, 294.54, 294.86, 295.19, 295.52, 295.85, 296.18, 296.50, 296.83, 297.16,
/* 550 */ 297.49, 297.81, 298.14, 298.47, 298.80, 299.12, 299.45, 299.78, 300.10, 300.43, 
/* 560 */ 300.75, 301.08, 301.41, 301.73, 302.06, 302.38, 302.71, 303.03, 303.36, 303.69,
/* 570 */ 304.01, 304.34, 304.66, 304.98, 305.31, 305.63, 305.96, 306.28, 306.61, 306.93,
/* 580 */ 307.25, 307.58, 307.90, 308.23, 308.55, 308.87, 309.20, 309.52, 309.84, 310.16,
/* 590 */ 310.49, 310.81, 311.13, 311.45, 311.78, 312.10, 312.42, 312.74, 313.06, 313.39,
/* 600 */ 313.71, 314.03, 314.35, 314.67, 314.99, 315.31, 315.64, 315.96, 316.28, 316.60,
/* 610 */ 316.92, 317.24, 317.56, 317.88, 318.20, 318.52, 318.84, 319.16, 319.48, 319.80
};

void setup() {
  Serial.begin(9600);
  delay(2000);
  Serial.println("\npt100 MAX31865 start");
  pinMode(SS, OUTPUT);
  digitalWrite(SS, HIGH);
  SPI.begin();
    SPI.beginTransaction(settings);
        digitalWrite(SS, LOW);
            SPI.transfer(Configuration_REGISTER_W);
            SPI.transfer(Configuration); 
        digitalWrite(SS, HIGH);
    SPI.endTransaction();
}

void loop() {
  Serial.println("====");
  pt100Resistor = read_pt100ResistorData();
  Serial.print("Resistor = "); Serial.println(pt100Resistor,4);
  if (pt100Resistor < 100.0) {
    for ( t = 100; pt100under0[t] < pt100Resistor; --t){
      Serial.print(". ");
    }
      derutaR = ((pt100Resistor - pt100under0[t+1]) /  (pt100under0[t] - pt100under0[t+1]));
      pt100temperature = (t+1) - derutaR;
      Serial.print("\npt100temperature = \t");Serial.println(-1.0 * pt100temperature)  ;
    } else {
    for ( t = 0; pt100over0[t] < pt100Resistor; ++t){
      Serial.print(". ");
    }
      derutaR = ((pt100Resistor - pt100over0[t-1]) /  (pt100over0[t] - pt100over0[t-1]));
      pt100temperature = (t-1) + derutaR;
      Serial.print("\npt100temperature = \t");Serial.println(pt100temperature)  ;
    }

  delay(3000);
}

float read_pt100ResistorData() {
    SPI.beginTransaction(settings);
        digitalWrite(SS, LOW);
            SPI.transfer(RTD_Resistance_MSB); // 
            uint16_t highByte = SPI.transfer(0x55); // dummy
            uint8_t  lowByte = SPI.transfer(0x55);  // dummy
        digitalWrite(SS, HIGH);
    SPI.endTransaction();
    // Serial.print(highByte); Serial.print(" , ");Serial.println(lowByte);
    uint16_t dataT = ((highByte << 8) | lowByte) >> 1;
    r = dataT * refResistor / 32768.0;
    return r;
}

 実行している様子です。

グラフィック・ディスプレイに測定結果を表示

 前回の記事を参考に、グラフィック・ディスプレイに温度を表示します。

#include  <SPI.h> 
#define SS 7

SPISettings settings(100000,MSBFIRST,SPI_MODE1);

#define Configuration_REGISTER_W  0x80
#define Configuration 0b11010011 // 3wire autoconvertion 50Hzfilter
#define setConfig 0x00
const float TDnominal = 100.0;
const float refResistor = 430.0;
#define RTD_Resistance_MSB  0x01

int16_t sensorValue;
float analogSensorData;
float r, pt100Resistor, pt100temperature, derutaR ;
int t;

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <Fonts/FreeMonoBold18pt7b.h> #define TFT_CS 10 #define TFT_RST 9 // Or set to -1 and connect to Arduino RESET pin #define TFT_DC 8 Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST); float pt100under0[] = { // -100'C to 0'C /* 0 */ 100.00, 99.61, 99.22, 98.83, 98.44, 98.04, 97.65, 97.26, 96.87, 96.48, /* -10 */ 96.09, 95.69, 95.30, 94.91, 94.52, 94.12, 93.73, 93.34, 92.95, 92.55, /* -20 */ 92.16, 91.77, 91.37, 90.98, 90.59, 90.19, 89.80, 89.40, 89.01, 88.62, /* -30 */ 88.22, 87.83, 87.43, 87.04, 86.64, 86.25, 85.85, 85.46, 85.06, 84.67, /* -40 */ 84.27, 83.87, 83.48, 83.08, 82.69, 82.29, 81.89, 81.50, 81.10, 80.70, /* -50 */ 80.31, 79.91, 79.51, 79.11, 78.72, 78.32, 77.92, 77.52, 77.12, 76.73, /* -60 */ 76.33, 75.93, 75.53, 75.13, 74.73, 74.33, 73.93, 73.53, 73.13, 72.73, /* -70 */ 72.33, 71.93, 71.53, 71.13, 70.73, 70.33, 69.93, 69.53, 69.13, 68.73, /* -80 */ 68.33, 67.92, 67.52, 67.12, 66.72, 66.31, 65.91, 65.51, 65.11, 64.70, /* -90 */ 64.30, 63.90, 63.49, 63.09, 62.68, 62.28, 61.88, 61.47, 61.07, 60.66, /* -100 */ 60.26, 59.85, 59.44, 59.04, 58.63, 58.23, 57.82, 57.41, 57.01, 56.60 }; float pt100over0[] = { // 0'C to 600'C /* 0 */ 100.00, 100.39, 100.78, 101.17, 101.56, 101.95, 102.34, 102.73, 103.12, 103.51, /* 10 */ 103.90, 104.29, 104.68, 105.07, 105.46, 105.85, 106.24, 106.63, 107.02, 107.40, /* 20 */ 107.79, 108.18, 108.57, 108.96, 109.35, 109.73, 110.12, 110.51, 110.90, 111.29, /* 30 */ 111.67, 112.06, 112.45, 112.83, 113.22, 113.61, 114.00, 114.38, 114.77, 115.15, /* 40 */ 115.54, 115.93, 116.31, 116.70, 117.08, 117.47, 117.86, 118.24, 118.63, 119.01, /* 50 */ 119.40, 119.78, 120.17, 120.55, 120.94, 121.32, 121.71, 122.09, 122.47, 122.86, /* 60 */ 123.24, 123.63, 124.01, 124.39, 124.78, 125.16, 125.54, 125.93, 126.31, 126.69, /* 70 */ 127.08, 127.46, 127.84, 128.22, 128.61, 128.99, 129.37, 129.75, 130.13, 130.52, /* 80 */ 130.90, 131.28, 131.66, 132.04, 132.42, 132.80, 133.18, 133.57, 133.95, 134.33, /* 90 */ 134.71, 135.09, 135.47, 135.85, 136.23, 136.61, 136.99, 137.37, 137.75, 138.13, /* 100 */ 138.51, 138.88, 139.26, 139.64, 140.02, 140.40, 140.78, 141.16, 141.54, 141.91, /* 110 */ 142.29, 142.67, 143.05, 143.43, 143.80, 144.18, 144.56, 144.94, 145.31, 145.69, /* 120 */ 146.07, 146.44, 146.82, 147.20, 147.57, 147.95, 148.33, 148.70, 149.08, 149.46, /* 130 */ 149.83, 150.21, 150.58, 150.96, 151.33, 151.71, 152.08, 152.46, 152.83, 153.21, /* 140 */ 153.58, 153.96, 154.33, 154.71, 155.08, 155.46, 155.83, 156.20, 156.58, 156.95, /* 150 */ 157.33, 157.70, 158.07, 158.45, 158.82, 159.19, 159.56, 159.94, 160.31, 160.68, /* 160 */ 161.05, 161.43, 161.80, 162.17, 162.54, 162.91, 163.29, 163.66, 164.03, 164.40, /* 170 */ 164.77, 165.14, 165.51, 165.89, 166.26, 166.63, 167.00, 167.37, 167.74, 168.11, /* 180 */ 168.48, 168.85, 169.22, 169.59, 169.96, 170.33, 170.70, 171.07, 171.43, 171.80, /* 190 */ 172.17, 172.54, 172.91, 173.28, 173.65, 174.02, 174.38, 174.75, 175.12, 175.49, /* 200 */ 175.86, 176.22, 176.59, 176.96, 177.33, 177.69, 178.06, 178.43, 178.79, 179.16, /* 210 */ 179.53, 179.89, 180.26, 180.63, 180.99, 181.36, 181.72, 182.09, 182.46, 182.82, /* 220 */ 183.19, 183.55, 183.92, 184.28, 184.65, 185.01, 185.38, 185.74, 186.11, 186.47, /* 230 */ 186.84, 187.20, 187.56, 187.93, 188.29, 188.66, 189.02, 189.38, 189.75, 190.11, /* 240 */ 190.47, 190.84, 191.20, 191.56, 191.92, 192.29, 192.65, 193.01, 193.37, 193.74, /* 250 */ 194.10, 194.46, 194.82, 195.18, 195.55, 195.91, 196.27, 196.63, 196.99, 197.35, /* 260 */ 197.71, 198.07, 198.43, 198.79, 199.15, 199.51, 199.87, 200.23, 200.59, 200.95, /* 270 */ 201.31, 201.67, 202.03, 202.39, 202.75, 203.11, 203.47, 203.83, 204.19, 204.55, /* 280 */ 204.90, 205.26, 205.62, 205.98, 206.34, 206.70, 207.05, 207.41, 207.77, 208.13, /* 290 */ 208.48, 208.84, 209.20, 209.56, 209.91, 210.27, 210.63, 210.98, 211.34, 211.70, /* 300 */ 212.05, 212.41, 212.76, 213.12, 213.48, 213.83, 214.19, 214.54, 214.90, 215.25, /* 310 */ 215.61, 215.96, 216.32, 216.67, 217.03, 217.38, 217.74, 218.09, 218.44, 218.80, /* 320 */ 219.15, 219.51, 219.86, 220.21, 220.57, 220.92, 221.27, 221.63, 221.98, 222.33, /* 330 */ 222.68, 223.04, 223.39, 223.74, 224.09, 224.45, 224.80, 225.15, 225.50, 225.85, /* 340 */ 226.21, 226.56, 226.91, 227.26, 227.61, 227.96, 228.31, 228.66, 229.02, 229.37, /* 350 */ 229.72, 230.07, 230.42, 230.77, 231.12, 231.47, 231.82, 232.17, 232.52, 232.87, /* 360 */ 233.21, 233.56, 233.91, 234.26, 234.61, 234.96, 235.31, 235.66, 236.00, 236.35, /* 370 */ 236.70, 237.05, 237.40, 237.74, 238.09, 238.44, 238.79, 239.13, 239.48, 239.83, /* 380 */ 240.18, 240.52, 240.87, 241.22, 241.56, 241.91, 242.26, 242.60, 242.95, 243.29, /* 390 */ 243.64, 243.99, 244.33, 244.68, 245.02, 245.37, 245.71, 246.06, 246.40, 246.75, /* 400 */ 247.09, 247.44, 247.78, 248.13, 248.47, 248.81, 249.16, 249.50, 249.85, 250.19, /* 410 */ 250.53, 250.88, 251.22, 251.56, 251.91, 252.25, 252.59, 252.93, 253.28, 253.62, /* 420 */ 253.96, 254.30, 254.65, 254.99, 255.33, 255.67, 256.01, 256.35, 256.70, 257.04, /* 430 */ 257.38, 257.72, 258.06, 258.40, 258.74, 259.08, 259.42, 259.76, 260.10, 260.44, /* 440 */ 260.78, 261.12, 261.46, 261.80, 262.14, 262.48, 262.82, 263.16, 263.50, 263.84, /* 450 */ 264.18, 264.52, 264.86, 265.20, 265.53, 265.87, 266.21, 266.55, 266.89, 267.22, /* 460 */ 267.56, 267.90, 268.24, 268.57, 268.91, 269.25, 269.59, 269.92, 270.26, 270.60, /* 470 */ 270.93, 271.27, 271.61, 271.94, 272.28, 272.61, 272.95, 273.29, 273.62, 273.96, /* 480 */ 274.29, 274.63, 274.96, 275.30, 275.63, 275.97, 276.30, 276.64, 276.97, 277.31, /* 490 */ 277.64, 277.98, 278.31, 278.64, 278.98, 279.31, 279.64, 279.98, 280.31, 280.64, /* 500 */ 280.98, 281.31, 281.64, 281.98, 282.31, 282.64, 282.97, 283.31, 283.64, 283.97, /* 510 */ 284.30, 284.63, 284.97, 285.30, 285.63, 285.96, 286.29, 286.62, 286.95, 287.29, /* 520 */ 287.62, 287.95, 288.28, 288.61, 288.94, 289.27, 289.60, 289.93, 290.26, 290.59, /* 530 */ 290.92, 291.25, 291.58, 291.91, 292.24, 292.56, 292.89, 293.22, 293.55, 293.88, /* 540 */ 294.21, 294.54, 294.86, 295.19, 295.52, 295.85, 296.18, 296.50, 296.83, 297.16, /* 550 */ 297.49, 297.81, 298.14, 298.47, 298.80, 299.12, 299.45, 299.78, 300.10, 300.43, /* 560 */ 300.75, 301.08, 301.41, 301.73, 302.06, 302.38, 302.71, 303.03, 303.36, 303.69, /* 570 */ 304.01, 304.34, 304.66, 304.98, 305.31, 305.63, 305.96, 306.28, 306.61, 306.93, /* 580 */ 307.25, 307.58, 307.90, 308.23, 308.55, 308.87, 309.20, 309.52, 309.84, 310.16, /* 590 */ 310.49, 310.81, 311.13, 311.45, 311.78, 312.10, 312.42, 312.74, 313.06, 313.39, /* 600 */ 313.71, 314.03, 314.35, 314.67, 314.99, 315.31, 315.64, 315.96, 316.28, 316.60, /* 610 */ 316.92, 317.24, 317.56, 317.88, 318.20, 318.52, 318.84, 319.16, 319.48, 319.80 }; void setup() { Serial.begin(9600); delay(2000); Serial.println("\npt100 MAX31865 start"); pinMode(SS, OUTPUT); digitalWrite(SS, HIGH); SPI.begin(); SPI.beginTransaction(settings); digitalWrite(SS, LOW); SPI.transfer(Configuration_REGISTER_W); SPI.transfer(Configuration); digitalWrite(SS, HIGH); SPI.endTransaction(); tft.init(240, 320); // Init ST7789 320x240 Serial.println(F("Initialized TFT")); tft.fillScreen(ST77XX_BLACK); tft.setRotation(2); tft.setFont(&FreeMonoBold18pt7b); } void loop() { tft.fillScreen(ST77XX_BLACK); tft.setCursor(10, 50); tft.setTextColor(ST77XX_YELLOW); tft.setTextSize(1); tft.println("Temp:"); for (int i=0; i<5; i++){ tft.print(read_pt100temperature()); tft.println("'C"); delay(10000); } for (int i=0; i<5000; i++){ delay(3000); } } float read_pt100ResistorData() { SPI.beginTransaction(settings); digitalWrite(SS, LOW); SPI.transfer(RTD_Resistance_MSB); // uint16_t highByte = SPI.transfer(0x55); // dummy uint8_t lowByte = SPI.transfer(0x55); // dummy digitalWrite(SS, HIGH); SPI.endTransaction(); // Serial.print(highByte); Serial.print(" , ");Serial.println(lowByte); uint16_t dataT = ((highByte << 8) | lowByte) >> 1; r = dataT * refResistor / 32768.0; return r; } float read_pt100temperature() { Serial.println("===="); pt100Resistor = read_pt100ResistorData(); Serial.print("Resistor = "); Serial.println(pt100Resistor,4); if (pt100Resistor < 100.0) { for ( t = 100; pt100under0[t] < pt100Resistor; --t){ Serial.print(". "); } derutaR = ((pt100Resistor - pt100under0[t+1]) / (pt100under0[t] - pt100under0[t+1])); pt100temperature = (t+1) - derutaR; Serial.print("\npt100temperature = \t");Serial.println(-1.0 * pt100temperature) ; return -1.0 * pt100temperature; } else { for ( t = 0; pt100over0[t] < pt100Resistor; ++t){ Serial.print(". "); } derutaR = ((pt100Resistor - pt100over0[t-1]) / (pt100over0[t] - pt100over0[t-1])); pt100temperature = (t-1) + derutaR; Serial.print("\npt100temperature = \t");Serial.println(pt100temperature) ; return pt100temperature; } }

 実行中の様子です。

 冷凍庫に入れました。シースに入っているのが理由かレスポンスは熱電対より悪いようで、なかなか温度が下がりません。

接続

Arduino UNO R4 WiFi のベースのピン名 ピンの名称 MAX31865ボードのピンの名称 グラフィック・ディスプレイ・ボード のピンの名称
D13 RSPCKA CLK SCK
D12 CIPOA SDO MISO(接続していない)
D11 CIPIA SDI MOSI
D10 SSLA0   CS
D9     RST
D8     D/C
D7   CS  
GND   GND GND
+5V   VIN VIN

前へ

今から始める電子工作 Step4 ② 温度センサ 熱電対 MCP9601