石油ファンヒーターには、消し忘れ防止機能があり、運転開始後3時間で消火してしまいます。これを回避するためには、「延長」ボタンを押す必要があります。これが面倒なので、ファンヒーターの中にESP32を組み込んで、人の代わりに延長ボタンを押してもらうことにしました。
石油ファンヒーター
実家に石油ファンヒーターがありました。コロナの製品で、FH-G32YA2というモデルです。同じような製品は、ダイニチ工業、トヨトミなどが販売してます。石油ストーブ独特の臭いも殆ど無く、暖かくて使いやすく、安全な良い製品です。しかも1万円程度と安いです。
でもどの製品にも、消し忘れ消火機能があり、運転開始後3時間経過すると消火してしまいます。消火の15分前には警告音が鳴ります。自動消化される前に「延長」ボタンを押すとさらに3時間運転する仕組みになってます。安全のための機構なのですが、これが結構厄介です。
スマートホームを導入されている方の中には、延長ボタンにSwitchBotボットを取り付けて、物理的にボタンを押して、延長操作を自動化している人も多いようです。
今回は、フォトリレーを使って電気的に延長ボタンを押します。SwitchBotボットを使うよりも確実で、内部組み込みなので見た目もスマートです。延長動作は、タイマー回路で安価に実装しても良いのですが、豪華にマイコンを組み込んでHomeKit対応にしました。これでiPhoneやMacのホーム.appから、自動延長のOn/Offが可能になります。
安全装置を回避する改造ですし、製品取説には分解・改造を行わないよう警告されています。DIYする際には自己責任でお願いします。
分解する
まずはファンヒータのボタンやコントローラがどうなっているのか、分解して調べます。ファンヒータの前面パネルは、下部3箇所のネジを外すと取り外せます。
上の写真の、向かって右上側に制御回路があり、また上辺の部分にスイッチ、LED、液晶表示パネルがあります。スイッチ・表示パネルもネジを外せば取り外せます。スイッチ・表示パネルと制御回路は、白いフレキシブルリボンケーブルで接続されていますが、これは手で引き抜くことができます。下は、取り外したスイッチ・表示パネルです。
スイッチ・表示部の裏側には、プリント基板が入ってます。以下は、裏側の写真です。
プリント基板は、パネル部品より小さいので、空きの部分にIoT回路を組み込めそうです。さらには、プラスチックパネルなので、Wi-Fiも透過しやすいです。
プリント基板をスイッチパネルから取り外してみます。下の写真は、取り外したプリント基板の反対側です。こちら側には、スイッチ、LED、液晶表示器が実装されていました。
スイッチとLED回路を調べる
プリント基板の上にある、SW204という押しボタンSWが、「延長」ボタンです。回路を追ってみたところ、複数のボタンがマトリックス配線されているようです。なので機械式リレー、フォトカプラー、フォトスイッチのような、接地が絶縁できるリレーか電子スイッチを使って、スイッチを操作するのが良いようです。
ちなみに、隣のSW201は「運転 入/切」スイッチです。またL201は、運転状態を示すLEDです。これらもフォトスイッチなどを使えば、自動化可能だと思います。こちらで、操作パネルの改造について説明しておきました。
ただ、ファンヒーターを遠隔地から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が付いてます。
急ぎの案件でなければ、ESP-01搭載のリレーモジュールを使っても良かったと思います。さらに安価で簡単に製作できます。
回路を作る
Seeed Studio XIAO ESP32C3は、5V (USB)でも、3.3Vでも動作します。ファンヒーターのロジック電源は5Vなので、Seeed Studio XIAO ESP32C3の5V端子に接続します。
ただ、ESP32本体は3.3Vロジックで動作してます。また、前述のようにファンヒーターのロジックは5Vで、さらにスイッチはマトリックス配線なので、フォトスイッチで絶縁接続する必要があります。フォトスイッチは、たまたま店頭在庫のあったパナソニックのAQY210EHを使いました。本来はもっと安価な部品で良く、オーバースペックだと思います。これを、ESP32C3のGPIO10に、470Ωの抵抗を介して接続しました。スイッチ側は、既存の「延長」スイッチに並列に接続しました。手抜きの回路図ですが、こんな感じです。SW204は、ファンヒーターの既存スイッチです。
この回路を、ユニバーサル基板の上に作成して、ファンヒーターのスイッチ・表示基板の隣に取り付けました。基板には空きがあるので、将来的にファンヒーターのOn/Offにも対応できそうです。3Mの両面テープ裏紙が見えてますが、これはWi-Fiアンテナ部分です。
これでパネルを元に戻せば、完了です。外観からは改造の痕跡は全く分かりません。元通りの普通の石油ファンヒーターに戻りました。
プログラミング
ESP32では、2時間30分(150分)に1回、「延長」ボタンを電気的に接続するプログラムを作ります。これだけだったらタイマーICでも良いくらいの簡単な仕事です。そこで、ESP32の通信機能を活用して、自動延長を実施する・しないの設定をHomeKitから設定できるようにします。そのために、Raspberry Piで動かしているMQTTブローカー (Mosquitto) にWi-Fi接続して、延長On/Offの設定を受け取ります。
用意したプログラムは以下です。setupのところで、MQTTとArduinoOTAの設定をしています。これらについては過去の記事をご覧ください。
//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から操作する
Mosquittoを動作させているRaspberry Piの上では、Homebridgeも動作させています。Homebridgeは、MQTTThingプラグインを使って、Mosquittoにアクセスします。
そこで、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時間制限を自動的に有効化するなどの設定も可能です。このようにスマートホームの機能を活用することで、安全性と利便性を両立させた使い方を探っていきたいです。
コメント
はじめまして。素人です。たまたたどり着きまして大変参考にさせていただいております。
コロナの型番は違いますが、前面パネルや本体基板はまったく同じです。
まずシンプルにしたかったので、本体基盤のブザーから抵抗を介してフォトカプラからsw204に繋いでみました。ブザーがなるたびに延長はされましたが、電源ボタンや温度設定でもブザーが鳴るため、動作が少し不安定です。
安全性を保ちながらシンプルにすべく考えたのが人感センサ(https://www.amazon.co.jp/dp/B09997L7CP)を利用する方法です。ファンヒーターの近くで人が活動している間のみ延長され、構造的にもシンプルでいいと考えました。センサーはファンヒーター本体基盤から電源を取り、出力もきちんと5Vが出ます。近所で買った安いフォトカプラ(TLP785)を介してsw204に接続しましたが、どうしてもフォトカプラが反応しないところで躓いています。フォトカプラは入力側に320Ω、700Ωなどでつないでみましたが無反応です。お時間があるときになにか思いつかれることでもあればご返信いただけると助かります。
シンプルで良い方法ですね!
TLP785はフォトトランジスタ1個の構成なので、電流が流れる方向が決まっていると思います。SW204に接続する配線を逆にしてみてはどうでしょうか。もしくはTLP222のような両方向に電流が流せるフォトカプラーを使うのが良いかなと思います。
ご返信ありがとうございます。逆配線でも試してみましたが反応なしでした。壊したかと思い、予備に買っていたものでも試しましたが動かず。TLP785は最初に試したときにも使用していて、そのときは動作していたので理由がわかりません。TLP222のような別タイプを試してみようと思います。ありがとうございます。
もしかしたらAM312の出力ピンからは、フォトカプラのLEDを直接ドライブする電力は取れないのかもしれないですね。公式のリファレンス回路みたいにFETでスイッチする必要があるのかも
https://www.micros.com.pl/mediaserver/info-cz%20am312.pdf
なるほど、そういう可能性も考えられそうですね。とりあえず明日は近くのパーツ屋で他に使えそうなフォトカプラ、フォトスイッチがあるか見てくる予定です。それから他の人感センサーモジュールやFETを使うことも検討してみようと思います。ありがとうございます。