石油ファンヒーターを改造して「延長」ボタンを自動化する

DIYする

石油ファンヒーターには、消し忘れ消火機能があり、運転開始後3時間で消火してしまいます。これを回避するためには、「延長」ボタンを押す必要があります。そこでファンヒーターの中にESP32を組み込んで、人の代わりに延長ボタンを押してもらうことにしました。

石油ファンヒーター

実家に石油ファンヒーターがありました。コロナの製品で、FH-G32YA2というモデルです。同じような製品は、ダイニチ工業、トヨトミなどが販売してます。石油ストーブ独特の臭いも殆ど無く、暖かくて使いやすく、安全な良い製品です。しかも1万円程度と安いです。

でもどの製品にも、消し忘れ消火機能があり、運転開始後3時間経過すると消火してしまいます。消火の15分前に警告音が鳴ります。自動消化される前に「延長」ボタンを押すとさらに3時間運転する仕組みになってます。安全のための機構なのですが、これが結構厄介です。

スマートホームを導入されている方の中には、延長ボタンにSwitchBotボットを取り付けて、物理的にボタンを押して、延長操作を自動化しようとされている人もいらっしいます。今回は、フォトリレーを使って電気的に延長ボタンを押します。SwitchBotbotよりも確実で、内部組み込みなので見た目もスマートです。延長動作は、タイマー回路で安価に実装しても良いのですが、豪華にマイコンを組み込んでHomeKit対応にしました。

安全装置を回避する改造ですし、製品取説には分解・改造を行わないよう警告されています。DIYする際には自己責任でお願いします。

分解する

まずはファンヒータのボタンやコントローラがどうなっているのか、分解して調べます。ファンヒータの前面パネルは、下部3箇所のネジを外すと取り外せます。

向かって右上側に制御回路があり、また上辺の部分にスイッチ、LED、液晶表示パネルがあります。スイッチ・表示パネルもネジを外せば取り外せます。スイッチ・表示パネルと制御回路は、白いフレキシブルケーブルで接続されていますが、これは手で引き抜くことができます。

スイッチ・表示部の中には、プリント基板が入ってます。

プリント基板は、パネル部品より小さいので、空きの部分にIoT回路を組み込めそうです。さらには、プラスチックパネルなので、Wi-Fiも透過しやすいです。

プリント基板をパネルから取り外してみます。反対側には、スイッチ、LED、液晶表示器が実装されていました。

スイッチとLED回路を調べる

プリント基板の上にある、SW204という押しボタンSWが、「延長」ボタンです。回路を追ってみたところ、複数のボタンがマトリックス配線されているようです。なのでフォトカプラーまたはフォトスイッチを使ってスイッチを操作するのが良いようです。

ちなみにSW201は「運転 入/切」スイッチです。またL201は、運転状態を示すLEDです。これらもフォトスイッチなどを使えば、自動化可能だと思います。こちらで、操作パネルの改造について説明しておきました。

PCケース操作パネルを改造してHomeKitからOn/Offする
PCケースの電源操作パネル内部にESP32を組み込んで、HomeKitからOn/Offできるようにしました。電源スイッチを導通させてOn/Offし、通電表示用LEDの状態を取得します。 既存機器操作パネルの改造方法 PCケースの電源をHom...

ファンヒーターを遠隔地からOn/Offする必要性はあまり感じていないので、今回は、「延長」ボタンだけを改造することにします。

ロジック用電源を探す

スイッチ・表示パネルに、GNDとロジック用電源が来ているのではと期待しましたが、残念ながら来ていないようでした。なので、電源とGNDは、本体側のコントローラ基板から引っ張ってくることにします。

本体の基板を取り外して、裏側を見ると、マイコンが搭載されていました。これだけの配線が片面基板で構成されているのはすごいと思いました。

型番から検索して、搭載された部品を特定しました。一番大きなチップは、TLCS-870/Cという東芝の8ビットマイコンでした。その右上の小さなチップは、IS93C66というEPROMで、右側の中くらいのチップは、TBD62003Aというトランジスタアレーでした。

これらのチップの仕様書をネットで探して、電源とGNDのピンを特定して、その配線を追いかけました。その結果、プリント基板の表側にあるジャンパー線に接続されていました。J32というジャンパー線がGNDで、J46が5V電源でした。ハンダ付しやすそうな、大きなジャンパー線だったので、ここから電源を取ることにしました。マイコンを含めて、ロジックは全部5Vで動作しているようです。

XIAO ESP32を使う

いつも使っているAliExpressのESP32 dev kitの在庫が手元になかったので、手近な部品屋さんでSeeed Studio XIAO ESP32C3を買ってきました。税込900円くらいで、技適マークもついていて、小型で、Arduinoでプログラムできて使いやすいです。USB Type-Cが付いてます。

回路を作る

Seeed Studio XIAO ESP32C3は、5V (USB)でも、3.3Vでも動作します。ファンヒーターのロジック電源は5Vなので、Seeed Studio XIAO ESP32C3の5V端子に接続します。

ただ、ESP32本体は3.3Vロジックで動作してます。また、前述のようにファンヒーターのロジックは5Vで、さらにスイッチはマトリックス配線なので、フォトスイッチで絶縁接続する必要があります。フォトスイッチは、たまたま店頭在庫のあったパナソニックのAQY210EHを使いました。これを、ESP32C3のGPIO10に、470Ωの抵抗を介して接続しました。スイッチ側は、既存の「延長」スイッチに並列に接続しました。手抜きの回路図ですが、こんな感じです。

この回路を、ユニバーサル基板の上に作成して、ファンヒーターのスイッチ・表示基板の隣に取り付けました。基板には空きがあるので、将来的にファンヒーターのOn/Offにも対応できそうです。

これでパネルを元に戻せば、完了です。外観からは改造の痕跡は全く分かりません。元通りの普通の石油ファンヒーターに戻りました。

プログラミング

ESP32では、2時間30分(150分)に1回、「延長」ボタンを電気的に接続するプログラムを作ります。これだけだったらタイマーICでも良いくらいの簡単な仕事です。そこで、ESP32の通信機能を活用して、自動延長を実施する・しないの設定をHomeKitから設定できるようにします。そのために、MQTTブローカーに接続して、延長On/Offの設定を受け取ります。

用意したプログラムは以下です。setupのところで、MQTTとArduinoOTAの設定をしています。これらについては過去の記事をご覧ください。

公衆MQTTサーバでLチカする
スイッチやセンサの状態や、リレーやサーボモータの制御コマンドを送受信する目的で、MQTT (Message Queueing Telemetry Transport)というプロトコルが使われます。MQTTは、Home AssistantやH...
Arduino IDEからESP32をOTAアップデート(改訂版)
OTA (Over The Air)を使ってESP32のスケッチをアップデートする方法の改訂版です。以前、試したESP32のスケッチ例は、もっと簡単にしても良いことを他の方のブログで知りました。おかげさまで活用できるようになりました。 とい...
//Extends operation of Corona Fan Heater FH-G32YA2

#include <EspMQTTClient.h>
#include <ArduinoOTA.h>

EspMQTTClient *client;
int switchPin=10; //IO pin to the photo switch

bool isExtendMode=false; //true: extend on every 150 min
long int counter=0; //counter for extend-interval (used in loop())

//WiFi & MQTT
const char SSID[] = "xxxxxxxx"; //WiFi SSID
const char PASS[] = "XXXXXXXX"; //WiFi password
char CLIENTID[] = "ESP32_xx:xx:xx:xx:xx:xx"; //MAC address is set in setup()
//for example, this will be set to "ESP32_84:CC:A8:7A:5F:44"
const char MQTTADD[] = "192.168.xxx.xxx"; //Broker IP address
const short MQTTPORT = 1883; //Broker port
const char MQTTUSER[] = "";//Can be omitted if not needed
const char MQTTPASS[] = "";//Can be omitted if not needed
const char SUBTOPIC[] = "mqttthing/fanheater/set"; //mqtt topic to subscribe
const char PUBTOPIC[] = "mqttthing/fanheater/get"; //mqtt topic to publish
const char PUBDEBUG[] = "mqttthing/fanheater/debug"; //for debug message

void onConnectionEstablished() {
  ArduinoOTA.setHostname("fanheater");
  ArduinoOTA.setPasswordHash("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
  ArduinoOTA.begin();
  client->subscribe(SUBTOPIC, onMessageReceived); //set callback function
  client->publish(PUBDEBUG,"Fan Heater started.");
  pubCurrentMode();
}

void pubCurrentMode(){
  if(isExtendMode) client->publish(PUBTOPIC,"true");
  else client->publish(PUBTOPIC, "false");
}

void onMessageReceived(const String& msg) {
  if(msg.compareTo("true")==0) {//set extend mode to on
    client->publish(PUBDEBUG, "Set true, received.");
    reset3HourTimer(); //first extension
    counter=0; //reset interval counter
    isExtendMode = true; //enable succeeding extension
  }
  else if(msg.compareTo("false")==0) {//set extend mode to off
    client->publish(PUBDEBUG, "Set false, received.");
    reset3HourTimer(); //last extension
    isExtendMode = false; //disable succeeding extension
  }
}

void setup()
{
  pinMode(switchPin, OUTPUT);
  digitalWrite(switchPin, LOW);
  isExtendMode=false; //default value: no extension
  String wifiMACString = WiFi.macAddress(); //WiFi MAC address
  wifiMACString.toCharArray(&CLIENTID[6], 18, 0); //"ESP32_xx:xx:xx:xx:xx:xx"
  client = new EspMQTTClient(SSID,PASS,MQTTADD,MQTTUSER,MQTTPASS,CLIENTID,MQTTPORT);
  delay(1000);
}

void reset3HourTimer() {
  digitalWrite(switchPin, HIGH); // turn the photo switch on
  delay(1000);
  digitalWrite(switchPin, LOW); // turn the photo switch off
}

void loop()
{
  ArduinoOTA.handle();
  client->loop();
  delay(100);
  if(++counter > (150 * 60 * 10)) { //on every 150 min
    counter=0;
    if(isExtendMode) reset3HourTimer();
  }
  if((counter % 300) == 0) // on every 30 sec, reports the mode, JIC
    pubCurrentMode();
}

メインloop()では、150分に1回、「延長」スイッチをOnにしています。ただ、isExtendModeというbool変数がfalseの場合は、延長スイッチをOnにしません。また、30秒に1回、現在のisExtendModeの値を、MQTTにpubしてます。

MQTTからmqttthing/fanheater/set trueまたはfalseを受け取ると、isExtendModeの値を設定します。また、延長スイッチもOnにしてます。これをOnにすると、ファンヒーターからピッというビープ音が出るので、動作確認にもなります。

このプログラムでは、初期値で、isExtendModeをfalseにしています。つまり、MQTTからの指示が無い限り、燃焼延長を行いません。未改造の状態と同じように、ファンヒーターが動作するので、安全です。

HomeKitから操作する

HomebridgeでMQTTThingプラグインを以下のように設定しておきました。

{
    "type": "switch",
    "name": "FH Extender",
    "topics": {
        "getOn": "mqttthing/fanheater/get",
        "setOn": "mqttthing/fanheater/set"
    },
    "accessory": "mqttthing"
}

この結果、iPhoneやMacのホーム.appに以下のようなスイッチが表示されます。

これをOnにすると、燃焼の延長が動作し、さらに2時間30分おきに、「延長」ボタンが押されます。これをOffにしたときも、一回だけ「延長」ボタンが押されますが、その後は押されません。なので石油ファンヒータの機構により、3時間後に自動消火されます。

これで、就眠中に3時間おきにビープ音で起こされて、延長ボタンを押す手間から解放されました。(取説では就眠時にファンヒーターを使わないように警告されているので、このような使用は考慮されてません)燃焼の自動延長をオートメーションで中断する設定も可能です。例えば、オートメーションで朝7時に自動延長Offにする設定をしておくと、

これで7時以降は自動延長しないので、10時には自動消火されます。

まとめ

石油ファンヒーター動作を自動延長するように改造しました。ESP32を組み込み、これが150分ごとに「延長」ボタンを押します。また、自動延長の有効・無効はMQTTメッセージで設定できるようにしました。このため、HomeKitから自動延長を設定できます。

ストーブの危険性は理解できますが、石油ファンヒーターの連続稼働時間の3時間制限は、やりすぎな気がしてました。なので、ちょっと過剰な安全装置を外す方向のDIYとなりました。ただ、HomeKitと連動することで、特定時刻や、外出のタイミングで、3時間制限を自動的に有効化するなどの設定も可能です。スマートホームの機能を活用することで、安全性と利便性を両立させた使い方を探っていきたいです。

コメント

  1. momo より:

    はじめまして。素人です。たまたたどり着きまして大変参考にさせていただいております。
    コロナの型番は違いますが、前面パネルや本体基板はまったく同じです。
    まずシンプルにしたかったので、本体基盤のブザーから抵抗を介してフォトカプラからsw204に繋いでみました。ブザーがなるたびに延長はされましたが、電源ボタンや温度設定でもブザーが鳴るため、動作が少し不安定です。
    安全性を保ちながらシンプルにすべく考えたのが人感センサ(https://www.amazon.co.jp/dp/B09997L7CP)を利用する方法です。ファンヒーターの近くで人が活動している間のみ延長され、構造的にもシンプルでいいと考えました。センサーはファンヒーター本体基盤から電源を取り、出力もきちんと5Vが出ます。近所で買った安いフォトカプラ(TLP785)を介してsw204に接続しましたが、どうしてもフォトカプラが反応しないところで躓いています。フォトカプラは入力側に320Ω、700Ωなどでつないでみましたが無反応です。お時間があるときになにか思いつかれることでもあればご返信いただけると助かります。

    • diysmartmatter より:

      シンプルで良い方法ですね!

      TLP785はフォトトランジスタ1個の構成なので、電流が流れる方向が決まっていると思います。SW204に接続する配線を逆にしてみてはどうでしょうか。もしくはTLP222のような両方向に電流が流せるフォトカプラーを使うのが良いかなと思います。

  2. momo より:

    ご返信ありがとうございます。逆配線でも試してみましたが反応なしでした。壊したかと思い、予備に買っていたものでも試しましたが動かず。TLP785は最初に試したときにも使用していて、そのときは動作していたので理由がわかりません。TLP222のような別タイプを試してみようと思います。ありがとうございます。

    • diysmartmatter より:

      もしかしたらAM312の出力ピンからは、フォトカプラのLEDを直接ドライブする電力は取れないのかもしれないですね。公式のリファレンス回路みたいにFETでスイッチする必要があるのかも

      https://www.micros.com.pl/mediaserver/info-cz%20am312.pdf

      • momo より:

        なるほど、そういう可能性も考えられそうですね。とりあえず明日は近くのパーツ屋で他に使えそうなフォトカプラ、フォトスイッチがあるか見てくる予定です。それから他の人感センサーモジュールやFETを使うことも検討してみようと思います。ありがとうございます。

タイトルとURLをコピーしました