概要

熱電対を使って温度を計測し、ブラウザアプリに温度を出力するためのテストをした。
目的は、揚げ物をするのに油の温度管理をしたいということだった。ガステーブルに温度調整機能がついていないため、自分で温度管理をしないといけないのだが、少しでも便利に温度管理ができないものかと考えた。
ブラウザアプリで温度情報を受け取れるようにできれば、一定の温度でアラームを鳴らすなどいろいろなことができるようになる。

結果としてはブラウザアプリで温度を表示するところまでできた。
しかし、肝心の揚げ物をやらなくなってしまって、実運用までは進んでいない。コンベクションオーブンを導入して、油で揚げなくてもそれなりにおいしく調理できるようになったためである。
せっかくいろいろ揃えたので、また別の機会に続きをやってみたいと思う。

使用構成

  • 熱電対
    プラグ付きのK型熱電対プローブをAliExpressにて購入
    別途、熱電対のテスト用に既製品の温度計も購入した
    (これはこれで、いろいろな熱電対を使って温度が計測できるので便利だった)

  • MAX31855基板
    熱電対を接続するために、MAX31855をモジュール化した基板を購入
    熱電対のプラグを接続できるように変換コネクタを作成した

  • ESP32C3基板
    MAX31855からSPIでデータを読み出すために、自作のESP32C3の基板を使用
    電源は乾電池で、MAX31855のために独立の3.3VのLDOを実装

  • USBシリアル変換
    ESP32からのシリアル出力をUSBシリアル変換でPCに取り込んだ

ESP32のソフト

  • MAX31855のライブラリ
    実際の温度としての出力値に変換までしてくれるが、doubleで出力されるので送信するのには扱いにくい
    変換前の生データとしては取り出せなかった
  • SPIで直接
    受信処理は簡単なので、SPI.hで直接処理しても難しくはない
    生データのままBLEで送信する形にした

    #define SPI_DATA        5
    #define SPI_SCK         18
    #define SPI_CS          19
    #define SPI_MOSI        6
    void setup() {
    SPI.begin(SPI_SCK, SPI_DATA, SPI_MOSI, SPI_CS);
    pinMode(SPI_CS, OUTPUT);
    // BLEの初期化
    }
    void readSPI32(uint8_t* data) {
    SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
    digitalWrite(SPI_CS, LOW);
    *data = SPI.transfer(0);
    *(data+1) = SPI.transfer(0);
    *(data+2) = SPI.transfer(0);
    *(data+3) = SPI.transfer(0);
    digitalWrite(SPI_CS, HIGH);
    SPI.endTransaction();
    }
    void loop() {
    uint8_t spiData[4];
    readSPI32(spiData);
    dataBuf[0] = BLE_DATA_INTERNAL;
    memcpy(dataBuf+1, spiData, 4);
    pTxCharacteristic->setValue((uint8_t*)dataBuf, 1+4);
    pTxCharacteristic->notify();
    }

    https://github.com/muid7989/esp32-spi-max31855

ブラウザアプリ

  • 1秒に1回、デバイスのデータを読みに行っている
  • 温度データの変換は以下のようにした
    function onTxCharacteristicValueChanged(event) {
    cInternal = event.target.value.getInt16(3, false);
    cInternal = cInternal & 0xFFF0;
    cTarget = event.target.value.getInt16(1, false);
    cTarget = cTarget & 0xFFFC;
    cTarget = int(cTarget * 2.5 / 4);
    }

    https://github.com/muid7989/max31855-test

テスト結果

  • 温度出力が安定的に取得できた

メモ

  • 最初はUSBシリアルを接続したままデバッグをしていたが、この段階では出力値がおかしい感じになっていた
    USBシリアルを外してBLEで出力値を見ると安定していたので、接続によってノイズが混入していたのではないかと思われる