0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【自作焙煎ロガー】RP2040とMAX6675でArtisanに2chの温度(BT/ET)をModbus送信する

0
Last updated at Posted at 2026-02-23

【コスパ最強】RP2040とMAX6675でコーヒー焙煎用温度ロガーを自作し、ArtisanとModbus通信する

コーヒーの自家焙煎をしていると、だんだん「Artisan(焙煎プロファイル記録ソフト)で温度を可視化したい!」という欲求が湧いてきますよね。
今回は、マイコン(RP2040)と温度センサー(MAX6675)を使って、PC直結のコスパ最強温度ロガーを自作した備忘録です。

実は最初は「小さいOLEDディスプレイを付けようかな」「ESP32でWebSocket通信にしてワイヤレスにしようかな」と夢を膨らませていました。

しかし、

「いや、焙煎中はPC画面を見るし、安定性重視のコスパ最強構成にして焙煎そのものに注力するべきだ!」

と思い直し、今回の有線シンプル構成に落ち着きました。

ただ、この構成に行き着くまでにネット上に情報がなさすぎて10時間くらい溶かしたトラップがあったので、同じ犠牲者を出さないために共有します。


😫 最大のハマりポイント:複数チャネルのデータ渡しとModbusの採用

結論から言うと、

「Artisanに2つの温度(BT:豆温度、ET:環境温度)を同時に渡すなら、おとなしくModbusを使え!」

という話です。

Artisanとマイコンをシリアル通信させる際、ネット上の情報を見ると「シリアル出力で Behmor BT/CTTC4 などの既存デバイスプロトコルをエミュレートしてArtisanに読み込ませる」という手法が散見されます。
私も最初はそれに倣って実装したのですが、どうしてもArtisan側に1チャネル分のデータしか渡らない、もしくはエラーという事象に直面しました。

BT(豆温度)とET(環境温度)の2つを同時にモニタリングしたいのに、片方しか認識されない。ソースコードをいじったりArtisanの設定をこねくり回したりと、気づけば10時間ほど経過……。

結果的に、
「Modbus RTUプロトコルを使って、Artisan側からレジスタを指定して読みに行かせる」
という方法に切り替えたところ、あっさりと2チャネル同時の通信に成功しました。複数センサーを扱うならModbus一択です。


🛠 用途・コンセプト

  • PCと直接接続する(有線シリアル通信)
  • とにかくコスパ重視(余計なモジュールは付けない)
  • ArtisanにBT(豆温度)とET(環境温度)を安定して渡す

📦 使用するパーツ

1. RP2040(マイコン):352円

以下のようなやつを利用。以前に大量購入したものを利用。
RP2040 (Amazon)

2. MAX6675モジュール × 2個(温度センサーIC):999円

MAX6675温度センサーモジュール (Amazon)
Kタイプ熱電対の温度を読み取るICです。BT用とET用に2セット用意します。Kタイプ熱電対は付属のものでもOKですが、焙煎機の形状に合わせて適切な長さや太さのものを別途購入しても良いです。


🔌 RP2040とMAX6675のピン配線

以下のように配線しました。共通化もできるのですが、一応ノイズとかあるのかな?と思ったので別にわけました。
pasted-image-20260223152959.png

MAX6675ピン BT(豆温度)用のRP2040ピン ET(環境温度)用のRP2040ピン
SO (DO) GP 0 GP 12
CS GP 1 GP 13
SCK (CLK) GP 2 GP 14
VCC 3V3 5V
GND GND GND(共有)

💻 Arduino IDEでの開発準備

1. RP2040のボードマネージャ追加

Arduino IDEの Preferences(環境設定)を開き、「追加のボードマネージャのURL」に以下をコピペします。
https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json
pasted-image-20260223152959.png
pasted-image-20260223152918.png

その後、ボードマネージャからRP2040を追加し、ボード設定は "Raspberry Pi Pico" を選択します。
pasted-image-20260223153553.png

2. 必要なライブラリのインストール

以下のライブラリを追加します。(IDEのライブラリマネージャから検索、またはZIPで追加)

3. スケッチ(ソースコード)

以下のコードをコピーしてRP2040に書き込みます。オンボードLEDを利用して、
「正常時は緑、エラー時(センサー未接続など)は赤」
が一瞬光るようにしています。動作確認に便利です。

#include <max6675.h>
#include <ModbusRtu.h>
#include <Adafruit_NeoPixel.h>

// -------------------------
// ピン設定(MAX6675)
// -------------------------
// 1個目:BT(豆温度)用
#define DO_BT   0
#define CS_BT   1
#define CLK_BT  2

// 2個目:ET(環境温度)用
#define DO_ET   12
#define CS_ET   13
#define CLK_ET  14

// -------------------------
// ピン設定(RP2040 Zero オンボードLED)
// -------------------------
#define PIN_LED  16 // RP2040 ZeroのオンボードLEDはGP16
#define NUM_LEDS 1

// 各種インスタンス作成
MAX6675 thermoBT(CLK_BT, CS_BT, DO_BT);
MAX6675 thermoET(CLK_ET, CS_ET, DO_ET);
Adafruit_NeoPixel strip(NUM_LEDS, PIN_LED, NEO_GRB + NEO_KHZ800);
Modbus slave(1, 0, 0); 

// Modbus共有データ配列 (BT=0番, ET=1番)
uint16_t au16data[16] = { 0 };

// 時間管理用の変数
unsigned long lastReadTime = 0;
unsigned long ledOffTime = 0;

void setup() {
  Serial.begin(115200);
  slave.begin(115200);

  // LEDの初期設定
  strip.begin();
  strip.setBrightness(50); // 眩しすぎないように明るさを調整(0〜255)
  strip.show(); // 一旦消灯

  delay(500); // センサー安定待ち
}

void loop() {
  // 500ms(0.5秒)おきに温度を更新
  if (millis() - lastReadTime > 500) {
    
    float tempBT = thermoBT.readCelsius();
    float tempET = thermoET.readCelsius();

    bool isError = false;

    // BTの処理
    if (!isnan(tempBT)) {
      au16data[0] = (uint16_t)(tempBT * 100.0);
    } else {
      isError = true; // 読み取り失敗
    }

    // ETの処理
    if (!isnan(tempET)) {
      au16data[1] = (uint16_t)(tempET * 100.0);
    } else {
      isError = true; // 読み取り失敗
    }
    
    // --- LEDを光らせる処理 ---
    if (isError) {
      // エラー時(センサー未接続など)は「赤」
      strip.setPixelColor(0, strip.Color(255, 0, 0)); 
    } else {
      // 正常に読めている時は「緑」
      strip.setPixelColor(0, strip.Color(0, 255, 0)); 
    }
    strip.show(); // 点灯
    
    // 100ms後にLEDを消すための時間をセット(一瞬だけ光らせる)
    ledOffTime = millis() + 100;
    
    lastReadTime = millis();
  }

  // セットされた時間(100ms後)になったらLEDを消灯する処理
  if (ledOffTime > 0 && millis() > ledOffTime) {
    strip.setPixelColor(0, strip.Color(0, 0, 0));
    strip.show();
    ledOffTime = 0; // タイマーをリセット
  }

  // Modbusの通信リクエストに応答(ループを止めずに常時回す)
  slave.poll(au16data, 16);
}

☕ Artisan側の設定

Artisanの公式サイト からインストールが完了したら、以下の手順でModbusの読み込み設定を行います。

1. 「専門家」モードに変更する

メニューの 構成 (Config)モード (Mode) から 専門家 (Expert) にチェックを入れます。これをしないと詳細なデバイス設定ができません。
pasted-image-20260223154117.png

2. デバイスを「MODBUS」にする

メニューの 構成 (Config)デバイス (Machine) を開き、
「メーター (Meter)」の項目で MODBUS を選択します。
pasted-image-20260223154222.png

3. Modbusの通信・レジスタ設定

ここが最重要ポイントです。以下の画像を参考に設定してください。

  • COMポート:RP2040が接続されているポートを選択
  • 通信速度 (Baud Rate)115200
  • タイムアウト:環境に合わせて調整
  • 入力1 (BT用):レジスタ 0 を指定
  • 入力2 (ET用):レジスタ 1 を指定
    (ソースコードの au16data の配列番号に対応しています)
    pasted-image-20260223154239.png

💡 設定ファイルの読み込み・保存

Artisanの設定は ヘルプ (Help) メニューから読み込みや保存が可能です。
pasted-image-20260223154549.png82115120)

完成したもの(ケースはセンサ購入時についてきたものなので無料)

なんだかんだで、1500円くらい(はんだ付け器具やグルーガンなど除く)で出来上がった。
一番安い既製品「MS6514」でも1万円こえてくるし、何かいい方法ないかなぁ、手持ちのもの利用できないかなぁ~って思ったらできてしまった。世の中何とかなるものだ。
2026-02-23 17-29-25.jpg


おわりに

「とりあえず既存のプロトコルで通信させればいけるっしょ!」と軽い気持ちで始めたら、1チャネル問題のせいで丸1日近く溶かしてしまいました。
しかし、Modbusに切り替えてからは非常に安定しており、コスパ最強の有線ロガーとして大活躍しています。

機能モリモリのガジェットを作るのも楽しいですが、

「安定して動くシンプルな構成で、焙煎そのものに集中する」

というのもまた一つの正解だと思います。

自作ロガーでArtisan連携に悩んでいる方の参考になれば幸いです!良き焙煎ライフを!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?