簡易温度計を作る

乳児の体温を測る時などに使われる、非接触温度計を簡単に作ります。

# 使ったもの
- MLX90614
- 10kΩ抵抗 × 2
- Arduino UNO
- ブレッドボード
- ジャンパワイヤー
- M5Stack

2000円ちょっとで買える赤外線温度センサー、MLX90614を持て余していたので
使ってみました。
過去にストロベリーリナックスで購入した3V動作品です。
![09570-01.jpg](https://qiita-image-store.s3.amazonaws.com/0/256451/bb29fd15-f3de-5864-3807-f7a4843b2edd.jpeg)

# 配線
MLX90614のピン構成です。
![mlx90614.png](https://qiita-image-store.s3.amazonaws.com/0/256451/16e09ee1-1232-e13d-3fa9-af5c27e3f86d.png)

| Arduino UNO | ブレッドボード | MLX90614 |
|:-:|:-:|:-:|
| 3V3 | - | VDD |
| GND | - | VSS |
| A5(SCL) | 10kΩ | SCL |
| A4(SDA) | 10kΩ | SDA |
SCLとSDAに関しては、10kΩの片方の足から3V3電源を取るようにしてください。
実際に配線するとこのようになります。
![ArduinoUNO配線図.jpeg](https://qiita-image-store.s3.amazonaws.com/0/256451/fa311090-932a-84a8-2049-9ccee00ddcdb.jpeg)

# 基本動作
Adafruitの便利なライブラリがあるため、容易に動作させることができます。
Arduino IDEの スケッチ ＞ ライブラリをインクルード ＞ ライブラリを管理 で
出た検索窓に、「mlx」と検索すると表示されます。

<img width="809" alt="スケッチ ＞ ライブラリをインクルード ＞ ライブラリを管理.png" src="https://qiita-image-store.s3.amazonaws.com/0/256451/0e563a3d-1d12-1228-9ef4-1d6eaac4dd79.png">
上から3番目の、「Adafruit MLX90614 Library」です。
<img width="795" alt="ライブラリマネージャ.png" src="https://qiita-image-store.s3.amazonaws.com/0/256451/ef0679ad-b3f2-4555-d60f-70ebb2b8e7d8.png">
選択して「インストール」を押し、無事にインストールされれば使えます。

簡単に動作確認をしてみます。

```c:mlx90614_test.ino
#include <Adafruit_MLX90614.h>

Adafruit_MLX90614 mlx = Adafruit_MLX90614();

void setup() {
  mlx.begin();

  Serial.begin(9600);
}

void loop() {
  // 表面温度の表示
  Serial.print("Temperature : ");  Serial.println(mlx.readObjectTempC());
  // 周囲温度の表示
  Serial.print("Ambient : ");  Serial.println(mlx.readAmbientTempC());
  Serial.println();

  delay(3000);
}
```

指を近付けてみると、シリアルモニタにこのように表示されます。
<img width="749" alt="動作確認結果.png" src="https://qiita-image-store.s3.amazonaws.com/0/256451/56d440bb-adba-c52d-14e1-7b05113dde6a.png">

# PCに繋がなくても温度が見えるようにする
これだけでは、都度PCに繋がないと温度を見ることができません。
そこで、市販の温度計と同じように、単体で温度を見ることができるようにしたいと思います。

持っていたM5Stackに、計測した温度を表示させるようにしました。
Aボタンを押すと表面温度、Cボタンを押すと周囲温度が出るようにします。

```c:m5stack_mlx90614.ino
#include <Adafruit_MLX90614.h>
#include <M5Stack.h>

Adafruit_MLX90614 mlx = Adafruit_MLX90614();

void setup(){

  // セットアップ
  M5.begin();
  mlx.begin();

  Serial.begin(115200);

  // デフォルト表示
  Serial.println("Title");
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setTextColor(WHITE);
  M5.Lcd.setCursor(70, 40);
  M5.Lcd.setTextSize(4); 
  M5.Lcd.print("MLX90614");
  M5.Lcd.setTextSize(3); 
  M5.Lcd.setCursor(20, 100);
  M5.Lcd.print("Temperature");
  M5.Lcd.setCursor(170, 140);
  M5.Lcd.print("Display");
}

void loop() {

  if(M5.BtnA.wasPressed()) {
    // 表面温度表示
    Serial.println("Temperature");
    M5.Lcd.setCursor(10, 40);
    M5.Lcd.fillScreen(RED);
    M5.Lcd.setTextColor(WHITE);
    M5.Lcd.setTextSize(3);
    M5.Lcd.print("Temperature  ");
    M5.Lcd.setCursor(50, 100);
    M5.Lcd.setTextSize(8); 
    M5.Lcd.print(mlx.readObjectTempC());
    M5.Lcd.setCursor(230, 180);
    M5.Lcd.setTextSize(2);
    M5.Lcd.print(" deg.");

    delay(1000);
  }

  if(M5.BtnC.wasPressed()) {
    // 周囲温度表示
    Serial.println("Ambient");
    M5.Lcd.setCursor(10, 40);
    M5.Lcd.fillScreen(GREEN);
    M5.Lcd.setTextColor(WHITE);
    M5.Lcd.setTextSize(3);
    M5.Lcd.print("Ambient  ");
    M5.Lcd.setCursor(50, 100);
    M5.Lcd.setTextSize(8); 
    M5.Lcd.print(mlx.readAmbientTempC());
    M5.Lcd.setCursor(230, 180);
    M5.Lcd.setTextSize(2);
    M5.Lcd.print(" deg.");

    delay(1000);
  }
  M5.update();
}
```

実際に動いているところをGIFアニメにしてみました。
![M5Stack_MLX90614.gif](https://qiita-image-store.s3.amazonaws.com/0/256451/81d1e2fa-edd7-b4f3-8600-9c2d0374e19e.gif)
赤い画面の表面温度の時、指を近付けると温度が変わっているのが分かります。

# まとめ
センサーに対象物を近付けるだけですぐに温度を測れるため、
乳児の体温測定などに使われる理由がよく分かりました。
また、M5Stackが気軽に単体で動く表示器として扱えるため、少し動作を試してみたい時に最適です。