電子工作
PR

COFFEE 自家焙煎 タイマー付き温度計 「ROAST TIMER」 の製作

ぽちお
記事内に商品プロモーションを含む場合があります

調理タイマーを利用した、家庭で手軽に楽しめるコーヒー豆の自家焙煎。
今回は、自作の「COFFEE焙煎 専用タイマー」を作成しました。

はじめに

「Artisan」試用機の紹介記事は、下記サイトからどうぞ、

COFFEE 自家焙煎(片手鍋) 電子工作で「Artisan」の試み
COFFEE 自家焙煎(片手鍋) 電子工作で「Artisan」の試み コーヒー豆の自家焙煎 最近では、家庭でも比較的容易に焙煎可能で、さらに、美味しいコーヒーを楽しまれている方も多くいらっしゃいますよね。...

今回は、単独動作で動作可能の 焙煎専用「ROAST TIMER」を 電子工作を用いて、作成する方法を紹介いたします。

安定した動作やノイズ対策など優位なように、ブレッドボードの簡易配線でなく ユニバーサル基板を使用し組上げます。

仕様

K熱電対タイプの温度センサーに対応し、関連する温度と時間を表示します。

基本動作

本体の表示部に、STARTからの時刻、温度及び 上昇率温度(RoR:Rate of Rise)を単独で表示
なお、本仕様のRoRは、焙煎温度の1分間当たりの変異温度を表します。

拡張動作

  • 「Artisan」試用互換・・・PC、USB接続
  • Bluetoothをサポート:離れた場所でも、対応するAndroid端末やPCなどに時刻・温度を通知・表示 また、受信されたデータにて二次的な処理が可能

作成に必要なスキル

モジュールの製作

ユニバーサル基板を使用します。その特有な「はんだ付け」作業や 組上の技量が必要です。

開発環境

マイコン「ESP32」は、ARDUINO-IDE(統合開発環境アプリ上のソフトウェア)を利用します。 それらの設定方法や開発利用方法等

ハードウェア

構成する主なハードウェア構成は、

CPU

ESP32

Wi-Fi・Bluetoothを内蔵し、低コストで低消費電力の電子工作にも便利で安価なマイコン「ESP32」シリーズ。 今回はこのマイコンを使用します。
Arduino開発環境IDEが利用でき、最近では ”Iot” 開発に関する電子工作にも活用され、情報量も豊富です 

ESP32-DevKitC-32E ESP32-WROOM-32E開発ボード 4MB
 技適等の信頼性で秋月電子通商からのメーカー品を使用しました。
 注:その他、安価流通品、サードパーティー製などの使用はご注意ください。

温度モジュール

MAX31855構成、K熱電対アンプモジュール

ディスプレイ

SSD1306
128×64 有機ELディスプレイ(OLED)青 グラフィックディスプレイモジュール

IC

7414 シュミットトリガインバータ
スイッチノイズ(チャタリング)対策用

その他

ノイズ対策コンデンサー、抵抗、タクトスイッチ等

回路図

部材仕入れ

一般的な部材や備品は、センサーを除く部品の購入先は、電子部品でお馴染みの「秋月電子通商」で入手できます。

ソフトウェア

Arduino IDE

ソフトウェアの開発環境を設定、制御プログラムを作成し マイコンにそのプログラムを書込みます。

設定

  • Arduino IDE ダウンロード
  • ESP32環境設定、ドライバ
  • ポート等の各種設定

モジュールライブラリ

プログラム(スケッチ)

#include <stdio.h>
#include <string.h>
#include <Wire.h>

#include <SPI.h>
#include "Adafruit_MAX31855.h"

#include "BluetoothSerial.h"

#include "SSD1306Wire.h"

const int startpin = 2, stoppin = 4;
unsigned long delay_cntr = 0;
unsigned int  sw_id = 0;

unsigned int sec_cntr = 0;
unsigned int min_cntr = 0;
unsigned int t_sec = 0;
unsigned int t_min = 0;

char MM_SS[] = "00:00";
char MM_work[] = "00";
char SS_work[] = "00";

double nt = 0;
double bnt = 0;
double ro = 0;
double ror = 0;


// MAX31855;
#define MAXDO   19
#define MAXCS   5
#define MAXCLK  18
Adafruit_MAX31855 thermocouple(MAXCLK, MAXCS, MAXDO);

//Bluetooth;
BluetoothSerial SerialBT;

// SSD1306;
SSD1306Wire display1(0x3c, SDA, SCL);
SSD1306Wire display2(0x3c, SDA, SCL);

void setup() {
  pinMode(startpin, INPUT);
  pinMode(stoppin, INPUT);

// SSD1306 Initial process;
  //  初期化
  display1.init();
  display2.init();
  //  反転
  display1.flipScreenVertically();
  display2.flipScreenVertically();
  //  フォント
  display1.setFont(ArialMT_Plain_16);
  display2.setFont(ArialMT_Plain_24);
  //  エリア+初期文字
  display1.drawString(10,2,"ROAST TIMER");
  display2.drawString(35,32,"00:00");
  // 初期表示
  display1.display();
  display1.setFont(ArialMT_Plain_24);
  display2.display();
  //  バッファクリア
  display1.clear();
  display2.clear();

// Serial Initial process;

  Serial.begin(9600);
  while (!Serial) delay(1); // wait for Serial on Leonardo/Zero, etc

  Serial.println("ROAST TIMER");

  delay(500); // wait for MAX chip to stabilize
  Serial.print("Initializing sensor...");
  if (!thermocouple.begin()) {
    Serial.println("ERROR.");
    while (1) delay(10);
  }
  Serial.println("DONE.");

  SerialBT.begin("ROAST TIMER");

}


void loop()
{

  if(delay_cntr == 1000) {

//== about 1 second(1000ms) interval

// TEMP Process
  // basic readout test, just print the current temp
  //   Serial.print("Internal Temp = ");
  //   Serial.println(thermocouple.readInternal());

   double c = thermocouple.readCelsius();
   double nt = thermocouple.readCelsius();

//   bnt = nt;

   if (isnan(c)) {
     int ktmf = 1;
     Serial.println("Thermocouple fault(s) detected!");
     uint8_t e = thermocouple.readError();
     if (e & MAX31855_FAULT_OPEN) Serial.println("FAULT: Thermocouple is open - no connections.");
     if (e & MAX31855_FAULT_SHORT_GND) Serial.println("FAULT: Thermocouple is short-circuited to GND.");
     if (e & MAX31855_FAULT_SHORT_VCC) Serial.println("FAULT: Thermocouple is short-circuited to VCC.");
   } else {

//  Routine Step.
  //  LCD "TEMP"
      display1.clear();
      display2.clear();
      display1.drawString(5,2,String(c,1)); 
      display1.display();

      ro = nt - bnt;
      ror = ro * 60;

      if (ror >= 0) {               // RoR値:正
        display1.drawString(80,2,"+");
        display1.drawString(92,2,String(ror,0)); 
        display1.display();
        }
     else {                         // RoR値:負
//      display1.drawString(80,2,"-");
      display1.drawString(80,2,String(ror,0)); 
      display1.display();
     }
      bnt = nt;

  // SERIAL "TEMP"
      Serial.println(c);

  // B/T "TIME+TEMP"
     SerialBT.print(MM_SS);
     SerialBT.print(" ");     
     SerialBT.print("Temp = ");
     SerialBT.print(c);
     SerialBT.println(" °C");

   }

// STOPWATCH Process

    delay_cntr = 0;

//  Starting Process.

    if (sw_id == 1) { 
      t_sec = t_sec + 1;
      sec_cntr = sec_cntr + 1;
   
//  MIN Info.
      if (min_cntr == 60) {
        min_cntr = 0;
        t_min = 0;
      }
//      
          
//  SEC Info.
      if (sec_cntr == 60) {
        sec_cntr = 0;
        t_sec = 0;
        min_cntr = min_cntr + 1;
        t_min = t_min + 1;

        snprintf(MM_work,4,"%02d",t_min);
        MM_SS[0] = MM_work[0];
        MM_SS[1] = MM_work[1];
      }
//
      snprintf(SS_work,4,"%02d",t_sec);
      MM_SS[3] = SS_work[0];
      MM_SS[4] = SS_work[1];
      display2.clear();
      display2.drawString(35,32,String(MM_SS)); 
      display2.display();    
      }
  }

//  SWITCH JUDGMENT
  if (digitalRead(stoppin) == HIGH) {
    //Stop
    sw_id = 0;
    min_cntr = 0;
    sec_cntr = 0;
    ESP.restart();
  }
  if (digitalRead(startpin) == HIGH && sw_id == 0) {  
    // Start
    sw_id = 1;

  }
//  TIME (time/conter setting) 
  delay(10);
  delay_cntr = delay_cntr + 10;
}

動作

スタンドアローン

単独動作(要USB電源入力)にて、START後、1秒周期に温度、時間及びRoRを装置内の有機ELディスプレイ(OLED)に表示します。

エクステンション

拡張機能として、RoR未通知にて下記をサポートします。

「Artisan」試用対応

PC(USB接続)による「Artisan」試用での運用が可能です。

Bluetoothサポート

対応するAndroid端末やPCなどに時刻・温度を通知・表示 また、受信されたデータにて二次的な処理にも対応可能です。
デフォルトとして、Bluetooth名:”ROAST TIMER”と定義していますが、
変更な場合はプログラム中(84行目)の
SerialBT.begin(“ROAST TIMER“); にて名称の変更が可能です。

また、通信データのフォーマットは、1秒周期に 00:00Temp = 00.00℃
00:00➡時間 Temp = 00.0℃➡温度 にて通知します。

アンドロイド端末

Serial Bluetooth Terminal:B/T接続上のシリアル通信情報の取得

CSV Viewer : 通信情報のCSV変換・編集

EXCEL:データ編集、表・グラフ表示

まとめ

  • COFFEE 自家焙煎専用タイマーの作成方法を紹介いたしました。
  • タイマーの他に、接続されたK熱温度センサーの温度及びRoRの表示
  • 単独動作(スタンドアロン)と拡張動作(エクステンション)では、
    Bluetooth、Artisan試用対応の両サポートで構成

注意

  • 無線システムを使用ので、マイコン製品の技適対応性にご注意ください。
  • Arduino IDE利用に伴う、運用方法にご注意ください。
ABOUT ME
ぽちお
ぽちお
シニアエンジニア
ものづくりが大好です。
記事URLをコピーしました