エアコンのリモコン複雑すぎん?
何か組み込み系の開発をしてみようと思い、Arduinoを知りwifiとBlutoothも使いたかったのでESP32を買ってみました。
どうもみぐです。
どうせなら使えるもので勉強になるものを作りたい。
最近、朝晩寒いから遠隔でエアコン操作したい。
部屋の温度確認して、寒そうなら暖房つけとくとか。
API連携の需要も高そうだから、温度センサーつけてwifiでクラウドに保存して、Bluetooth使ってスマホのアプリから閲覧、操作できるようにしたら色々達成できるのでは?
調べてるとスマートリモコンとか使ったらしたいことしやすそうだけど・・いや勉強のためもあるんだから、ESP32で全部するか。
ということで、全部一度にするのは無理なので、まずは温度センサーの値を表示して、Bluetooth介してスマホで閲覧するところまで。
温度センサーが反応しない
ブレッドボードを使えば半田付けなしでもできると知って、組み立てましたが、温度センサーが反応しない。
このセンサーの接続スカスカだけどこんなもん?
違うな、これセンサー側は半田付けしないといけないんだ。そうかー
なんでも使えると思って気にせず買ってしまった。
確か実家に半田ごてあったな・・
これはダメかもしれん・・
試しに電源繋いだ瞬間、バチっと火花が散ってショートしました。こわっ
写真でコードが切れたように見えてるのはショート後です。
古い電化製品には気をつけましょう。
火事とかにならなくてよかった。
半田ごて買ってきて、中学くらいの時の技術の時間にした作業を思い出しながら、くっつけて・・・認識した!
やっぱスカスカなのはダメだよね。
Bluetoothが認識しない
ArduinoIDE上で温度と湿度の表示はできるようになりました。
接触悪かったりすると、出なかったりして原因に悩まされましたが。
次はBluetoothでスマホから温度を取得。まずはBluetoothを認識させるところから。
Bluetoothが一覧に表示されない。
出力の問題なのか、受け手の問題なのかわからない。
アプリの問題を除外するため、他のBLEScannerというアプリで確認。
一覧にある!
接続もできて、Arduino側でも接続認識する!
受け手の問題か・・スマホのBluetoothの設定にもちゃんと出てくる。
しかし自作アプリではflutterで一番メジャーそうなflutter_blue_plusを使って・・認識できない。
色々やってみたけど原因がわからず、試しにflutter_reactive_bleを使ったら・・きた!
原因がわからないと辛いですね。特にArduino触ってると思うのが、同じことしてるはずなのに急にできるようになることとかある。
何か違うことがあるんでしょうね。
今までなら腐って挫折したくなるところですが、最近はダメでも腐らずにやり切ろうと頑張ってます。
認識したので、接続・・・接続できない泣
全体的にコードは複雑にならないんですが、その分違うところで不具合が。
BLEScannerでは接続できるので、明らかにアプリ問題。
問題点が絞れてるのは非常にありがたい。
ChatGPT様様なんだけど、聞いてないところはスルーされたり、ハルシネーションがあったりするから困る。
connectToAdvertisingDeviceでは接続できずconnectToDeviceにしたら接続できたりしました。
そんなこんなでようやく
最初2秒おきとかに更新してたけど、普段はタップして取得でいいなと思って直したけど、それも手間取りました。
これ、ほんとにしなきゃダメ?
途中何度も思いましたが、腐らない腐らない。
しかし、この後再び強く思うようになるとは。
温度、湿度表示できた。
次はエアコンのリモコン操作
とりあえず運転、停止ボタンだけ使えたらいいかな。
汎用的なリモコンがあるなら、その辺りから信号取得できるかな。
ネット上にない。
他のメーカー解析してる方もいるけど、我が家はシャープ製
(今見てたら、もしかしたらあったのかも)
しょうがないので、赤外線受信してコード調べるところから。
エアコンのリモコン複雑すぎん?
運転ボタンなかったので、とりあえず暖房ボタン。
Protocol=PulseDistance Raw-Data=0x61EC1AA018 104 bits LSB first
次に停止ボタン
Protocol=PulseDistance Raw-Data=0x51EC1AA018 104 bits LSB first
ちょっと念の為もう一回暖房
Protocol=PulseDistance Raw-Data=0x11EC1DA018 104 bits LSB first
・・・え、待ってさっきと違くない?
色々試す。
違うモードにしてから暖房押すと変わる。
時刻違うと変わる。
温度違うと変わる。
冷房と暖房と停止で変わる値の場所が一緒。
きっと風量とかでも変わるけど、今回は使わない
しかもこれ変わる範囲狭いし、明らかに情報量足りてない・・
温度と時刻の"時間"部分で4bit、時刻の"分"部分で別の8bit、しかも温度・時刻部分は"分"の値によっても変動する。
チェックサム的なものがあるんでしょうね。
複雑すぎん?
運転と停止だけで良いのに・・
でも普段タイマーも使うから時間情報間違って送られて誤作動されるのは困る・・解析しないといけないのか。
さらに見てると
温度だけで18度〜32度、時間で24時間。冷房と暖房、停止。
え、4bitだよ?16通りだよ?明らかに足りてないよね?
本体側でも情報持ってて組み合わせでデコードするのか
変動する値だけに着目。明らかに周期性はありそう。
ただ全部をカバーできるアルゴリズムって・・
もうやめようかとも思いましたが、多分解析できた。
こういうの考えるのは好きだけど、これ考えるのに時間費やしていていいのかと。
丸一日以上かかった。
むしろよく辿り着いた。
興味ない大多数の方は読み飛ばしてください。
これでやっと信号の値得られたので、実装できそう。
ほんとに合ってるか全部は確認してないけど、動きそうならいいか。
疲れた。
達成感と疲労感が半端ない。
割とお腹いっぱいになってきたよー
どこまでするか悩んでますが、続きがあればまた。
長くなってしまった。お付き合いありがとうございました。
追記:
投稿してから気づきました。
今回たまたま見かけたコードがRAW-Dataしか表示しないものだったため、そのまま解析していましたが、Prontoデータを用いる必要があったのですね。ややこしいはずだわ。メーカーの違いによるものかと思ってました。
うー