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

 半導体センサは常温付近を測定するのに適しています。低温や高温では熱電対や白金測温体が使われます。

 ここでは、マイクロチップのMCP9601を使い、熱電対を利用します。

 過去、Arduino UNO R4 Minimaで利用した記事があります。

  

Arduino UNO R4 Minimaでセンサ・インターフェーシング ⑨ 温度センサ 熱電対 MCP9601

環境

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

熱電対アンプMCP9601のおもなスペック

 MCP9601のデータシート

  • 動作電圧 2.7〜5.5V
  • 温度の確度 ±2.0°C/±4.0°C (標準/最大)、K型 熱電対の精度は約 ±2°C ~±6°C
  • 分解能 ±0.0625 °C(これはADCの単なる分解能であり、確度ではない)
  • 変換時間 320ms(18ビット)
  • インターフェース I2C(10~100kHz)

熱電対の対応温度

  • K 型: -200~+1372°C
  • J 型: -150~+1200°C
  • T 型: -200~+400°C
  • N 型: -150~+1300°C
  • E 型: -200~+1000°C
  • S 型: +250~+1664°C
  • B 型: +1000~+1800°C
  • R 型: +250~+1664°C

 入手性の良いK型を利用します。

  uxcell -50C to +200C K型 温度測定 熱電対 ワイヤ ケーブル 3m 10 個入

 先端が容器に覆われたタイプもあります。

  Kタイプ 熱電対センサー 100mm  -100°C to 1250°C プローブ1M

  熱電対は、二つの金属を接合して、そこに発生する微弱な電圧を利用します。温度によって、発生する電圧は正比例するわけではないので、複数の温度範囲で近似関数を用意しています。

AdafruitのStemma QT/Qwiicボード

 解説のページ

 Stemma QT/Qwiic(JST SH 4ピン)コネクタは2か所に装着されていて、どちらにつないでもかまいません。このコネクタを使ってI2Cで制御する場合、特に、ジャンパ線をつなぐなどは不要です。

 コネクタは、表と裏のどちらも差し込めそうですが、ピンが内部の上部に並んでいるので、差し込める方向は一意です。ロック機構はないですが、すぐに抜けるということはありません。

接続

ライブラリの用意

 MCP960で検索して、見つかったAdafruit MCP9600ライブラリをインストールします。

 インストールを始めると次のパネルが出ました。
 全てをインストールを選びました。

スケッチ

 メニューのファイル->スケッチ例から、Adafruit MCP9600 Libraryのmcp9601_test.inoを選択します。

QWIICコネクタを使うので、19行目の1か所を修正します。

  

if (! mcp.begin(I2C_ADDRESS,&Wire1)) {
 
 

コンパイル、実行します。

 Hot Junctionの温度が、熱電対の先端の温度です。

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

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

  今から始める電子工作 Step3 ③ Wi-Fi、SPI グラフィック・ディスプレイ -テキスト

 スケッチです。

#include "Adafruit_MCP9601.h"
#define I2C_ADDRESS (0x67)
Adafruit_MCP9601 mcp;

/* Set and print ambient resolution */
Ambient_Resolution ambientRes = RES_ZERO_POINT_0625;

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <SPI.h>
#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); void setup() { Serial.begin(9600); delay(1000); Serial.println("Adafruit MCP9601 ST7789"); /* Initialise the driver with I2C_ADDRESS and the default I2C bus. */ if (! mcp.begin(I2C_ADDRESS,&Wire1)) { Serial.println("Sensor not found. Check wiring!"); while (1); } Serial.println("Found MCP9601!"); /* Set and print ambient resolution */ mcp.setAmbientResolution(ambientRes); Serial.print("Ambient Resolution set to: "); switch (ambientRes) { case RES_ZERO_POINT_25: Serial.println("0.25°C"); break; case RES_ZERO_POINT_125: Serial.println("0.125°C"); break; case RES_ZERO_POINT_0625: Serial.println("0.0625°C"); break; case RES_ZERO_POINT_03125: Serial.println("0.03125°C"); break; } mcp.setADCresolution(MCP9600_ADCRESOLUTION_18); Serial.print("ADC resolution set to "); switch (mcp.getADCresolution()) { case MCP9600_ADCRESOLUTION_18: Serial.print("18"); break; case MCP9600_ADCRESOLUTION_16: Serial.print("16"); break; case MCP9600_ADCRESOLUTION_14: Serial.print("14"); break; case MCP9600_ADCRESOLUTION_12: Serial.print("12"); break; } Serial.println(" bits"); mcp.setThermocoupleType(MCP9600_TYPE_K); Serial.print("Thermocouple type set to "); switch (mcp.getThermocoupleType()) { case MCP9600_TYPE_K: Serial.print("K"); break; case MCP9600_TYPE_J: Serial.print("J"); break; case MCP9600_TYPE_T: Serial.print("T"); break; case MCP9600_TYPE_N: Serial.print("N"); break; case MCP9600_TYPE_S: Serial.print("S"); break; case MCP9600_TYPE_E: Serial.print("E"); break; case MCP9600_TYPE_B: Serial.print("B"); break; case MCP9600_TYPE_R: Serial.print("R"); break; } Serial.println(" type"); mcp.setFilterCoefficient(3); Serial.print("Filter coefficient value set to: "); Serial.println(mcp.getFilterCoefficient()); mcp.setAlertTemperature(1, 30); Serial.print("Alert #1 temperature set to "); Serial.println(mcp.getAlertTemperature(1)); mcp.configureAlert(1, true, true); // alert 1 enabled, rising temp mcp.enable(true); Serial.println(F("------------------------------")); tft.init(240, 320); // Init ST7789 320x240 Serial.println(F("Initialized TFT")); tft.fillScreen(ST77XX_BLACK); tft.setRotation(2); tft.setFont(&FreeMonoBold18pt7b); } void loop() { uint8_t status = mcp.getStatus(); Serial.print("MCP Status: 0x"); Serial.print(status, HEX); Serial.print(": "); if (status & MCP9601_STATUS_OPENCIRCUIT) { Serial.println("Thermocouple open!"); return; // don't continue, since there's no thermocouple } if (status & MCP9601_STATUS_SHORTCIRCUIT) { Serial.println("Thermocouple shorted to ground!"); return; // don't continue, since the sensor is not working } if (status & MCP960X_STATUS_ALERT1) { Serial.print("Alert 1, "); } if (status & MCP960X_STATUS_ALERT2) { Serial.print("Alert 2, "); } if (status & MCP960X_STATUS_ALERT3) { Serial.print("Alert 3, "); } if (status & MCP960X_STATUS_ALERT4) { Serial.print("Alert 4, "); } Serial.println(); Serial.print("Hot Junction: "); Serial.println(mcp.readThermocouple()); Serial.print("Cold Junction: "); Serial.println(mcp.readAmbient()); Serial.print("ADC: "); Serial.print(mcp.readADC() * 2); Serial.println(" uV"); 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(mcp.readThermocouple()); tft.println("'C"); delay(3000); } for (int i=0; i<5000; i++){ delay(3000); } }

 実際に測定します。

 冷蔵庫です。

 冷凍庫です。ボードをそのまま入れて測っています。

 オーブン・トースタです。熱電対の先端を差し込んで測っています。

ガス台です。

前へ

今から始める電子工作 Step4 ① 温度センサ LM35失敗