美味しい炒飯の作り方を、定量的に調べるため、サーモセンサーを購入しました。
MLX90640というサーモセンサーと、ESP32というマイクロコントローラーから、wifi経由でPCに温度データを飛ばし、ブラウザで温度を可視化します。
中華鍋の温度を動画で可視化でき、とても収穫がありました!
サーモセンサーを使って遊んでみたい方の参考になればと思います。
※今回はITの記事です
1. 全体概要
炒飯をもっと定量的に作りたいので、温度センサーを使って調理温度を測ってみました。
私は電子工作初心者のためかなり時間をかけてしまいましたが、何とか中華鍋の温度を計測できました。
どのように温度データをwi-fi経由でPCに送信するか、色々試行錯誤しましたが、
結果として有限会社ランカードコム
様のブログに書かれている、赤外線アレイセンサー「MLX90640」をESP32につないでWebSocketしてみましたと「ESP32でディープラーニング」のコードをほぼコピペさせて頂くことで、ブラウザに測定結果を動画形式(コマ送り)で見ることができました。
2. 部品
以下の部品を使って作りました。
合計で1万円前後だったと思います。(バッテリー代を除く)
・ ブレッドボード ×2
・ ブレッドボード ジャンパーワイヤ(メス-オス)
・ ESP32-DevKitC ESP-WROOM-32開発ボード
・ MLX90640 本体
・ MLX90640につなぐケーブル
・ モバイルバッテリーなどの電源
・ USBケーブル(Micro USB Type-B)
ちなみに、家庭での調理でも300℃を超える場合がありますが、センサーの仕様上300℃以上は測定できません。
※リンク切れてたらすみません
3. 開発環境
私が実行した環境は以下です。
・ PCのOS
・ windos10
・ IDE
・ VScode
・ PlatformIO
・ クライアント側のwebsocket
・ Python3のプログラム
・ 測定データの加工
・ ターミナル(git bash)
・ 結果の確認
・ ブラウザ(google chrome)
環境構築の手順です。
- VScodeをインストールする
・ 参考:Qiita Visual Studio Code (Windows版) のインストール - ExtensionsタブからPlatformIOをインストールする
・ 参考:UEC Media Design Lab ESP32をVSCodeとPlatformIO IDEで動かす方法 - プロジェクトを作成する
・ 手順2の参考サイトのNew Projectを選択し
のあたりを参照、
4. プログラム
センサーにプログラムをアップロードするまでの流れは以下です。
1. 赤外線アレイセンサー「MLX90640」をESP32につないでWebSocketしてみましたと「ESP32でディープラーニング」から一部のソースをコピペさせて頂く
2. ビルドする
3. ESP32にUploadする
では各手順の詳細です。
1. 赤外線アレイセンサー「MLX90640」をESP32につないでWebSocketしてみましたと「ESP32でディープラーニング」から一部のソースをコピペさせて頂く
まずは必要なソースを準備します。
フォルダ構成
・ platformio.ini
・ src
・ main.cpp
・ AsyncTCP.h
・ MLX90640_API.cpp
・ MLX90640_API.h
・ MLX90640_I2C_Driver.cpp
・ MLX90640_I2C_Driver.h
・ data
・ app.css
・ app.js
・ work
・ check.html
platformio.ini
1 2 3 4 5 6 7 8 9 10 11 |
[env:esp32dev] platform = espressif32 board = esp32dev framework = arduino platform_packages = framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git # using the latest stable version lib_deps = ESP Async WebServer # or using GIT Url (the latest development version) lib_deps = https://github.com/me-no-dev/ESPAsyncWebServer.git |
main.cpp
srcフォルダ直下に、main.cppファイルを作成し、赤外線アレイセンサー「MLX90640」をESP32につないでWebSocketしてみましたのmain.cppコードをコピペさせて頂く。
その後、
1 2 3 |
const char* ssid = "*******"; const char* password = "******"; |
の*
部分を自分が使用しているwi-fiの値に変更する。
AsyncTCP.h
srcフォルダ直下に、AsyncTCP.hファイルを作成し、https://github.com/me-no-dev/AsyncTCP/blob/master/src/AsyncTCP.hのコードをコピペする。
MLX90640_API.cpp
MLX90640_API.h
MLX90640_I2C_Driver.cpp
MLX90640_I2C_Driver.h
sparkfun/SparkFun_MLX90640_Arduino_Exampleから、Example1_BasicReadings.ino
以外の4つのファイルを取得し、srcフォルダ直下に格納する。
MLX90640_I2C_Driver.cpp
をそのままビルドするとエラーが出るため、以下のように修正する。
#include <Wire.h>
の前後あたりに、
1 2 |
#include<Arduino.h> |
を追記し、
私の環境ではSerial.println
でエラーが出たので、
1 2 |
Serial.println("No ack read"); |
と
1 2 |
Serial.println("Error: Sensor did not ack"); |
の部分をコメントアウトする。
app.js
app.css
dataフォルダを作成し、dataフォルダ直下に、app.js
とapp.css
を作成し、https://github.com/me-no-dev/AsyncTCP/blob/master/src/AsyncTCP.hのそれぞれのコードをコピペする。
コピペしたapp.js
の最低温度、最大温度の設定を
1 2 3 4 |
const rgb = { min: 20, // 表示する最低温度 max: 35, // 表示する最高温度 |
以下のように変える。
1 2 3 4 |
const rgb = { min: 150, // 表示する最低温度 max: 300, // 表示する最高温度 |
check.html
workフォルダを作成し、workフォルダ直下に、check.htmlを作成する。
ESP32でディープラーニングのcheck.htmのソースをコピペする。
2. ビルドする
3. ESP32にUploadする
5. 配線
配線はQwiic IR Array (MLX90640) Hookup Guideを参考に、以下の写真のように繋げました。
コード | ピン |
---|---|
赤コード | 3V3 |
黒コード | GND |
黄コード | 22ピン |
青コード | 21ピン |
また、ブレッドボード1つではピンを指すスペースが足りないので、2つのブレッドボードを使用しています。
もう一つのブレッドボード(切り離してない)と合わせて、ESP32-DevKitCを差し込みます。
6. 測定
ESP32-DevKitCにusbケーブルを指し、電源につなげると自動的に温度データの取得を開始します。
wi-fiで送信された温度データを、PC上のpython3 websocket clientで受信し、jsonファイルで保存します。
まず準備として、PCにpython3の実行環境を用意します。
参考:私は色々入ってるAnacondaのpython3系 64bit windowsをインストールしてます
ターミナルを開き、websocket-clientをpipでインストールします。
1 2 |
pip install websocket-client |
collect_data.py
てきとうな場所にcollect_data.py
ファイルを作成し、ESP32でディープラーニングのcollect_data.pyのソースをコピペします。
ターミナルから、
1 2 |
python cpllect_data.py |
を実行し、温度データの受信を開始します。
接続が完了すると秒数のカウントアップが始まります。
受信を止めたい場合は、ctrl + c
などで強制的に止めてokです。
作成したjsonファイルを加工するため、以下のコマンドを実行します。
yyyymmdd
はデータの取得した年月日などを入れます。
1 2 |
cat temperature_yyyymmdd* | sed -e '$s/.$/]/' -e '1s/^/[/' > temperature_yyyymmdd.json |
catすぐ右のtemperature_yyyymmdd*
はyyyymmdd+{任意の文字列}のファイルを加工対象とするという意味で、末尾のtemperature_yyyymmdd.json
は加工したデータのファイル名を意味します。
【補足】 とりあえず温度が測定できているか確認したい場合
いきなりwi-fiでwebsocketの通信を行い、pythonで作成したデータをブラウザで表示させようとしてエラーが出ると、どのステップに問題があるのか切り分けが難しくなることがあります。
その場合、ProccessingというIDEで動くプログラムを使うと、温度センサーが正常に働いているかを確認することができます。
こちらのサイトにProcessingを用いた確認方法が記載されてます。P.T.A.55 人感センサーの候補として32X24のサーマルカメラMLX90640をESP32で試してみる
Processingの環境を準備し、MLXHeatCamフォルダと中身のMLXHeatCam.pde
を実行し、esp32からusbでPC送られてきたシリアルポートの値で温度分布を表示できます。
参考:Qiita Processingの導入方法
MLXHeatCam.pdeを実行した際、
RuntimeException: Error opening serial port COM6: Port busy
のようなエラーメッセージが出る場合は、読み取ろうとしているシリアルポートが既に使用されている可能性があるので、他の処理を特定して止めるか、強引ですがusbケーブルをさしなおすなどすると良いと思います。
(PlatformIOのmonitor
が起動されているとか、MLXHeatCam.pdeを2重起動してしまった時にこのエラーが出ました。)
また、
processingの myPort = new Serial(this, Serial.list()[2], 115200);
の行でArrayIndexOutOfBoundsException:
のようなエラーが出ている場合、読みよるシリアルポートの番号が違っている可能性があります。
私の環境の場合、シリアルポートCOM6の読み取りはSerial.list()[2]
ではなくSerial.list()[0]
とすると正常に動きました。
[2]の代わりに入れるべき数字は、MLXHeatCam.pdeのプログラム中でprintln(Serial.list());
を実行して出てくる数字のようです。
参考:つくったブログ シリアル通信でArduinoからProcessingに情報を渡す
7. 結果
中華鍋の一つである広東鍋の温度を計測してみました。
動画では、温度上昇 → 下降 → 再びちょっと上昇 → 下降 のように温度が推移しています。
これは、コンロのSIセンサーという安全装置が鍋の温度を検知し、一定温度以上になると自動的に火力を抑えられているためです。
ここで注目なのが、1回目にSIセンサーが働いた時と、2回目に働いた時を比較すると、1回目の方が鍋全体の温度が高い点です。
Siセンサーが1回目に働くときは、鍋中央の温度が低いが、鍋側面は熱く、温度差が大きい状態であり、鍋全体としてみるとかなり高温状態です。
しかし、2回目にSiセンサーが働くときは、鍋側面の熱がある程度中央に伝わっており、鍋側面と中央の温度差が小さくなり、鍋全体が比較的低温です。
つまり、より高温で調理したい場合は、加熱を始めてSiセンサーが初めて(1回目に)働いたタイミングで、食材を炒め始めるのがベストということです。
(ちなみに、冷蔵庫で中華鍋を冷やしてから加熱を開始してみましたが、最高温度にあまり変化はありませんでした)
以上です。
最後まで読んで下さりありがとうございました!!
【関連記事】
「中華鍋を買い替えてみて炒飯がどう変わったか」
「高火力なカセットコンロで店の炒飯を再現できるのか?」
スポンサーリンク
ツイッターやってます。ブログの更新報告などしゃべっています。↓
Follow @chahanofgear
インスタに作った炒飯を投稿しています。↓