今から始める電子工作 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); #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℃です。
●抵抗値から温度を得る
には、補正方法が三つ紹介されています。
初めての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 |