ESP-01で温度ロガー(熱電対)

#はじめに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211703/e5a12c23-8b92-618c-934d-f8f10ce460df.png)
納豆自作のためOMRONの温度調整器E5CBを購入しました。内臓リレーでホットポットの電源をON-OFFしています。現状は閾値制御としているため、オーバーシュートしてしまい設定値+3度位まで上昇します。
PID制御できるようでどの位パフォーマンスを示せるか興味が湧いたので、温度ロガーを作成することにしました。

#仕様
- センサーは熱電対
- データはAmbientにアップロード(5分毎)
- コントローラにESP-01を使用する

センサーは熱電対とします。食品に突っ込んで測定するためステンレスシースが必要なためです。DS1820にステンレスシースを付けたものもありましたが、シースが短いものしかありませんでした。

データはAmbientにアップロードすることにし、仕事中でも外出中でもデータの確認ができるようにします。

コントローラはESP-01(ESP8266)を使用します。熱電対用のMAX6675はSPI通信で信号線を3本使用するため、OLED等の表示は諦めることにしました。

#必要なもの
##ESP-01
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211703/d2470753-0b40-e650-e9d7-80711a6f31eb.png)
ESP8266を搭載したボードであればどれでも構いません。**日本では、ESP-01は技適の認証がありませんので違法となる可能性があります。**

##MAX6675
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211703/fb14463d-be23-3fb1-dc04-0df108fe14ad.png)
MAX6675モジュールです。K型熱電対を接続して、SPIでデータを読みとることができます。

##熱電対
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211703/13523998-e997-bc5e-ed0f-2c495812f4b4.png)
K型を使用します。温度と熱起電力がリニアであるため、最も良く使用される熱電対です。2ドル程度で購入しました。熱を検知する部分はシース先端になります。

##その他
その他、3.3Vレギュレータ、アルミケース、基板、抵抗、配線材等が必要になります。

#回路図

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211703/e83d7cc4-0bb4-2175-1289-923486e54d9c.png)
OLED表示はあきらめましたが稼動しているかどうかのモニタは必要ということで、TXピンにLEDを接続しました。

#作成
##ケース加工
ドリルとやすりで四角穴を作って、熱電対端子が出るようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211703/4cd3e2c5-f608-37e5-6395-94b3d8783927.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211703/bcc81da0-96f3-acb2-6eed-dcdd84daf838.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211703/a0a4f39e-e89b-9c20-30f3-1375af50e859.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211703/4ec0396c-a1d9-0d99-12b7-16468dc23a4a.png)

##基板
表
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211703/90112929-ebd6-d2ba-e8b0-105f43bac553.png)
裏
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211703/cb1fbbbb-6f71-082b-f368-b499369f6e56.png)

デバッグ中
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211703/a9570bf9-d6e8-784f-07d5-13557d5f34d3.png)

##完成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211703/4fabe313-bd3c-cc1c-782c-0bdd86e685ff.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211703/b97a8e00-1765-79d2-f8c2-9bfb3f47ec53.png)


#プログラム
LEDをTX端子に接続しておりデバッグ時はTX信号、運用時はLEDで状態表示としようとも考えましたが、シリアル出力の速度を300bpsにすることでSerial.printでの文字出力が発生するとLEDがチカチカするのを確認できたためこれで良しとしました。一ループごと(10秒)ごとにチカチカし、ESP8266が生きていることが確認できこれでも十分でした。


```Audino:Logger
///////////////////////////////////////////////////////////////////////
// 2021/04/03
// 
// Temperature logger, store to Ambient
//
// ESP-01 & MAX6675(Thermo couple) & Ambient
///////////////////////////////////////////////////////////////////////

#include <ESP8266WiFi.h>

#include "max6675.h"
#include "Ambient.h"

unsigned long runtime = 0L;
float temperature = 0.0;


#define PERIOD    300   // Uploading freq (Sec)
#define INTERVAL  10000 // Loop interval

///////////////////////////////////////////////////////////////////////
// MAX6675
// 1  GND -- GND
// 2  VCC -- 3.3V
// 3  SCK -- GPIO0
// 4  CS  -- GPIO2
// 5  SO  -- RXD (GPIO3)
///////////////////////////////////////////////////////////////////////
int thermoDO = 3;
int thermoCS = 2;
int thermoCLK = 0;

MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);

///////////////////////////////////////////////////////////////////////
// WIFI & Ambient
///////////////////////////////////////////////////////////////////////
// WIFI Setting
const char* ssid = "SET YOUR WiFi SSID";        // ***CHANGE HERE*** ここにWiFiのSSIDを入力
const char* password = "SET YOUR WiFi PASS";    // ***CHANGE HERE*** ここにWiFiのPASSを入力

// Ambient setting
unsigned int channelId =  00000;                // ***CHANGE HERE*** Ambient Channel IDを入力
const char* writeKey = "00ff11ee22dd33cc";      // ***CHANGE HERE*** Ambinet Write IDを入力 

WiFiClient client;
Ambient ambient;


void upload();  // uploading function

///////////////////////////////////////////////////////////////////////
// SETUP
///////////////////////////////////////////////////////////////////////

void setup() {

  Serial.begin(300);
// for debug  Serial.begin(115200);
  delay(100);
  Serial.println("Start");


  pinMode(thermoDO, INPUT);   // これをセットしないと0しか読み取れない
  
 // wifi初期化
  WiFi.begin(ssid, password);
  Serial.println("WiFi start.");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  // チャネルIDとライトキーを指定してAmbientの初期化
  ambient.begin(channelId, writeKey, &client);
  Serial.println("Ambient start.");

  // time set
  runtime = millis();
}

///////////////////////////////////////////////////////////////////////
// MAIN
///////////////////////////////////////////////////////////////////////

void loop() {

  // Read temp. from MAX6675
  temperature = thermocouple.readCelsius();

  unsigned long millsec = millis();
  if( runtime > millsec ) // 一周した.やっつけ処理
  {
    runtime = 0L;
  }
  if( millsec - runtime > (PERIOD * 1000) )
  {
    upload();   //upload仮停止
    runtime = millsec;
  }

  // 読み取った値をシリアルにプリント
  Serial.print("Temp = ");
  Serial.println(temperature);

  // delays
  delay(INTERVAL);
}

// uploade to ambient
void upload()
{
  // Ambientに連携
  ambient.set(1, temperature);
  ambient.send();
}
```


#おわりに
+2度くらいズレているようですが、まあ十分な精度かと思います。なにより温度ログを入手できるようになったことで、温調のチューニングに役立でることができるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211703/54303fc9-4df3-9943-42f0-927d8e8efcee.png)