エアコンリモコンに相当するアクセサリを作る最終回です。今回のターゲットはパナソニックのエアコンですが、他のメーカーでも同様に作れます。下図のように、(右から)HomeKitに接続したHomebridgeサーバから、MQTT経由でコマンドを出し、ESP32で受け取って、赤外線LEDからリモコン信号を送り、エアコンをコントロールします。
前回のあらすじ
こちらの記事から続きます:
パナソニックのエアコンリモコン、A75C3777
と同等の赤外線パターンを送出する仕掛けを、ESP32で作りました。回路は以下です。
赤外線LEDの代わりに青色LEDを付けると以下のように光ります。
次に、HomebridgeのMqttthingプラグインを使って、MQTTメッセージで動作するHeater Coolerアクセサリを作りました。また、ESP32には、MQTTクライアント機能を追加しました。これで、HomeKitからエアコンが操作できるようになりました。
今回の目標〜室温表示と赤外線強化
前回までで、一応動作するようになりました。ただ、温度測定機能を作り込んでいませんでした。Heater Coolerアクセサリは、温度センサも兼ねてます。前回までの実装では、室温を取得していないので、例えばエアコンがoffの時に、0.0°Cと表示されてしまいます。
そこで、ESP32に温度センサ(DHT20)を取り付けて、正しい室温を送ることにします。こちらで作った仕組みです。
また、赤外線LEDも改良しました。ということで、今回の内容は、温度センサの追加と赤外線の強化です。
温度センサを取り付ける
以前の記事で使用したセンサDHT20とESP32プログラムを使います。使用するセンサは、秋月で380円で売られている温度・湿度センサDHT20です。I2C接続なので、電源、グラウンド、信号線2本の、合計4本の配線を追加するだけです。回路図を再掲しておきます。
またDHT20ライブラリを使って温度・湿度情報を取得し、MQTTで送信します。前回のスマートリモコンプログラムに対して、追加する部分は以下です。
//...略...
#include "DHT20.h"
#define GPIO_SDA 21 //I2C for DHT20
#define GPIO_SCL 22 //I2C for DHT20
DHT20 dht; //instance of DHT20
//...略...
const char PUBTOPIC[] = "mqttthing/irOffice/get"; //to publish temperature
const char DEBUG[] = "mqttthing/irOffice/debug"; //topic for debug
//...略...
//IR Remo and MQTT: read DHT20 and publish results
void publishDHT() {
char buff[64];
float humi, temp;
if(DHT20_OK != dht.read()){
client->publish(DEBUG,"DHT20 Read Error.");
}else{
humi=dht.getHumidity();
temp=dht.getTemperature();
sprintf(buff, "{\"temperature\":%.1f,\"humidity\":%.0f}", temp, humi);
client->publish(PUBTOPIC,buff);
}
}
void loop() {
client->loop();
if(millis() - dht.lastRead() >= 60000) publishDHT();
}
publishDHT()という関数を作って、ここでDHT20から温度・湿度を読んで、MQTTにパブリッシュしています。この結果、例えば、
{"temparature":21.5,"humidity":64}
というようなメッセージが、mqttthing/irOffice/getトピックに流れます。これを取り込むために、Mqttthingプラグインで作ったHeater Coolerアクセサリに、getCurrentTemperatureのトピックを読む部分を追加します。
{
"type": "heaterCooler",
"name": "Aircon",
略
"topics": {
略
"getCurrentTemperature": "mqttthing/irOffice/get$.temperature",
略
},
"accessory": "mqttthing"
}
.$temperatureは、json形式のtemperatureキーの内容を取得するという意味です。これでオフの時に現在室温が表示されるようになりました。
温度センサとしても表示されます。(別のセンサが23℃と反応しているので両方表示されてます)
DHT20には湿度センサもあるのですが、Heater Coolerアクセサリでは湿度は使われません。もったいないので、MqttthingでHumidity Sensorアクセサリを作って記述しておきます。
{
"type": "humiditySensor",
"name": "DHT20_humi",
"topics": {
"getCurrentRelativeHumidity": "mqttthing/irOffice/get$.humidity"
},
"accessory": "mqttthing"
}
これで湿度センサも表示されました。
赤外線LEDを強化する
今までに回路では、赤外線LEDを1個だけ使用し、これに35mA程度流していました。でもエアコンから離れると動作しないこともありました。またLEDの指向性が高い(半減するのが20度らしいです)ので、LEDを正しくエアコンに向ける必要がありました。なので、光量を上げるために複数のLEDを使用して、さらにこれらを別々の方向に向けて、赤外線の届く範囲を広げようと考えました。その回路を考えるためには、LEDとFETの特性を測りたいところです。
その測定には、AliExpressで買った、多機能テスターという商品が便利でした。送料込みで2,100円でした。割高になりますが、Amazonでも2,389円で買えます。
ROM焼き機のようなZIFソケットに適当に部品を挿入すると、部品種類を自動判定して表示してくれます。抵抗、コンデンサ、コイル、ダイオード、FETなどを測定してくれます。まずは、今回使用している赤外線LEDを測定してみました。すると順方向電圧が1.15Vだとわかりました。3個くらいは直列でいけそうです。
同様に、今回使用したFETを測定しました。閾値電圧は2.5Vで回路図で目論んだ通りでした。ドレインソース間の起電力は0.68V, 抵抗は1.9Ωでした。
なので、LEDを3個直列にして、さらにFETに接続すると、全部の起電力が(1.15 x 3) + 0.67=4.12 Vになります。これを保護抵抗を介して5Vに接続すると、電圧差は 5 – 4.12 = 0.88 Vです。手元に10オームの抵抗がありました。これを保護抵抗として接続することを考えると、抵抗成分はFETの内部抵抗を加えて11.9オームになります。電流は、0.88 / 11.9 = 74mAになると計算できます。
ちょっと多い気もしますが、LEDの絶対定格が150mAで、FETが200mAなので、74mAなら大丈夫な気がします。リモコンなので点灯時間は一瞬ですし、38kHzのデューティ比は1/3らしいので、色々考えて10オームで良いかと思いました。それで以下のように接続しました。
電流を実測したところ大体75mA前後でした。テスターすごいです。ブレッドボードに組んだ様子は以下です。LEDが3個ついてます。また温度センサDHT20が左下に見えてます。
ユニバーサル基板で配線
動作確認できたのでAmazonで売っていたユニバーサル基板
で配線しました。まずはFritzingを使って部品配置を考えます。
そして配線しました。
赤外線が出ていることを確認できるように、赤色LEDを追加しました。
裏側はこちらです。そのうちプリント基板も作りたいです。
まとめ
ESP32で作るエアコン用スマートリモコンに温度センサ機能を組み込みました。安価なZigbee接続温度湿度センサも売られているので、それを併用しても良かったかもしれません。また、赤外線を強化するために、赤外線LEDを複数個にして、電流を増やしました。LEDの足を長めに残しておくと、足を曲げてエアコンに向くように調整できます。
これで温度センサ内蔵のスマートリモコンが完成しました。スマートリモコンは棚の上など、赤外線が機器に届きやすい場所に設置することになります。デバッグするときにUSB接続するのが大変なので、OTAできるようにしました。
コメント