Smart HomeをDIYする

Apple HomeKit は対応製品が少なくて高価なのでHomebridgeでがんばります

エアコンリモコンのHomeKitアクセサリをDIYする (後編:温度センサ他)

エアコンリモコンに相当するアクセサリを作る最終回です。今回のターゲットはパナソニックのエアコンですが、他のメーカーでも同様に作れます。下図のように、(右から)HomeKitに接続したHomebridgeサーバから、MQTT経由でコマンドを出し、ESP32で受け取って、赤外線LEDからリモコン信号を送り、エアコンをコントロールします。

 

前回のあらすじ

こちらの記事から続きます:

diysmarthome.hatenablog.com

diysmarthome.hatenablog.com

パナソニックのエアコンリモコン、A75C3777

と同等の赤外線パターンを送出する仕掛けを、ESP32で作りました。回路は以下です。

赤外線LEDの代わりに青色LEDを付けると以下のように光ります。

次に、HomebridgeのMqttthingプラグインを使って、MQTTメッセージで動作するHeater Coolerアクセサリを作りました。また、ESP32には、MQTTクライアント機能を追加しました。これで、HomeKitからエアコンが操作できるようになりました。

今回の目標〜室温表示と赤外線強化

前回までで、一応動作するようになりました。ただ、温度測定機能を作り込んでいませんでした。Heater Coolerアクセサリは、温度センサも兼ねてます。前回までの実装では、室温を取得していないので、例えばエアコンがoffの時に、0.0°Cと表示されてしまいます。

そこで、ESP32に温度センサ(DHT20)を取り付けて、正しい室温を送ることにします。こちらで作った仕組みです。

diysmarthome.hatenablog.com

また、赤外線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の特性を測りたいところです。

その測定には、こちらの他機能テスターという商品が便利でした。送料込みで2,198円でしたAmazonでも2,899円で買えます。

ROM焼き機のようなソケットに適当に部品を挿入すると、部品種類を自動判定して表示してくれます。抵抗、コンデンサ、コイル、ダイオード、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が左下に見えてます。

ユニバーサル基板で配線

動作確認できたのでユニバーサル基板

で配線しました。まずはFritzingを使って部品配置を考えます。

そして配線しました。

赤外線が出ていることを確認できるように、赤色LEDを追加しました。

裏側はこちらです。そのうちプリント基板も作りたいです。

まとめ

ESP32で作るエアコン用スマートリモコンに温度センサ機能を組み込みました。安価なZigbee接続温度湿度センサも売られているので、それを併用しても良かったかもしれません。また、赤外線を強化するために、赤外線LEDを複数個にして、電流を増やしました。LEDの足を長めに残しておくと、足を曲げてエアコンに向くように調整できます。

これで温度センサ内蔵のスマートリモコンが完成しました。スマートリモコンは棚の上など、赤外線が機器に届きやすい場所に設置することになります。デバッグするときにUSB接続するのが大変なので、OTAできるようにしました。

diysmarthome.hatenablog.com