プログラミング素人のはてなブログ

プログラミングも電気回路も専門外の技術屋の末端が勉強したことや作品をアウトプットするブログ。コードに間違いなど見つけられたら、気軽にコメントください。 C#、Python3、ラズパイなど。

エアコンをSlackでスマートリモコン化する【2019年版】

昨夏にスマートリモコン化したエアコンの改良版です。
s51517765.hatenadiary.jp

昨年のプロダクトの課題は、ボタンが一種類しか動作できないため、柔軟性がなかったことです。
今年は、リモコンのボタンを「電源off/on」「温度設定up」「温度設定down」を使えるようにしました。

回路

まずは回路です。昨年はトランジスタをつかったためうまくいきませんでした。
今年は、フォトカプラを使うことで複数のボタンが制御可能になりました。
f:id:s51517765:20190616154031p:plain

フォトカプラとは、得られる機能としてはトランジスタ(NPN)にとても似ていますが、制御入力と制御出力が電気的に絶縁されている、ということが大きく異なります。
今回もいつもおなじみSODIALのパーツを使用しました。Amazonで入手出来て安くてよいです。

ただしDataSheetが見つけられません。Amazonのレヴューを参考にSHARPの似た品名のものを参考にしました。
DataSheetは秋月の商品サイトが便利で、たまにしか買わないのにお世話になっております…
https://akizukidenshi.com/download/PC817C.pdf

f:id:s51517765:20190616154710p:plain
PC817 SHARP

このような足のたくさんある部品は、○印があるところが1番pinで通常は千鳥ではなく周回するようにpinの番号になっています。だいたいの部品がそうなっているはずです。
f:id:s51517765:20190616155011p:plain

フォトカプラとは、回路図にあるようにLEDとフォトセンサを組み合わせたものです。
信号入力側はこのLEDのために入力電圧を制限する必要があります。
SHARPのものと同等であるとすれば、IFは20mAなのでラズパイの3.3Vで動作させるなら、165Ω以上の抵抗を入れる必要があります。
私は手元にたくさんあった500Ωにしました。(一般には15%ぐらいのマージンを取って200Ωぐらいでよいです。)

f:id:s51517765:20190616155902p:plain
SHARP PC817C Datasheet

その他は昨年のものと同じ要領です。
f:id:s51517765:20190616163117j:plain

プログラム

昨年からの変更点は、リアルタイムで動作させる機能を追加しました。
「now」や「今」といったキーワードで動作させます。

@listen_to(u'(now|今|すぐ)+')
@respond_to(u'(now|今|すぐ)+')
def timerReset(message, something):
    try:
        text = message.body['text']
        if "on" in text or "off" in text or "power" in text:
            airconSet.aircon_power()
            message.reply("電源を操作しました。")
        elif "up" in text or "上" in text:
            airconSet.aircon_temp_set_up(1)
            message.reply("温度設定を +1 しました。")
        elif "down" in text or "下" in text:
            airconSet.aircon_temp_set_down(1)
            message.reply("温度設定を -1 しました。")
    except Exception as e:
        print(e)
        message.reply("指示を解釈できませんでした。")

このとき「now up」とすると、スケジュール機能も同時に動作してしまうので、こちらも変更しました。
数字が入っているときはスケジュールとして認識させたいので起動条件を変更しました。
「up」or「down」と数字が入っているときはこちらが起動します。\s?がスペース(省略可能)で\dが整数を表す正規表現です。

@listen_to(u'(上|up|下|down)\s?\d')  # up +スペース+数字 スペースは省略可能
@respond_to(u'(上|up|下|down)\s?\d')
def OrderUpDown(message, something):
  ----

まとめ

フォトカプラを使ってリモコン(エアコン)ハックを高機能化しました。
最初からフォトカプラに気づいていれば…というところではありますが。
f:id:s51517765:20190616163708p:plain
github.com

参考

qiita.com