見出し画像

エアコンのリモコン複雑すぎん?

何か組み込み系の開発をしてみようと思い、Arduinoを知りwifiとBlutoothも使いたかったのでESP32を買ってみました。
どうもみぐです。


どうせなら使えるもので勉強になるものを作りたい。

最近、朝晩寒いから遠隔でエアコン操作したい。
部屋の温度確認して、寒そうなら暖房つけとくとか。
API連携の需要も高そうだから、温度センサーつけてwifiでクラウドに保存して、Bluetooth使ってスマホのアプリから閲覧、操作できるようにしたら色々達成できるのでは?

調べてるとスマートリモコンとか使ったらしたいことしやすそうだけど・・いや勉強のためもあるんだから、ESP32で全部するか。

ということで、全部一度にするのは無理なので、まずは温度センサーの値を表示して、Bluetooth介してスマホで閲覧するところまで。

温度センサーが反応しない

ブレッドボードを使えば半田付けなしでもできると知って、組み立てましたが、温度センサーが反応しない。
このセンサーの接続スカスカだけどこんなもん?
違うな、これセンサー側は半田付けしないといけないんだ。そうかー
なんでも使えると思って気にせず買ってしまった。

確か実家に半田ごてあったな・・

事後画像

これはダメかもしれん・・
試しに電源繋いだ瞬間、バチっと火花が散ってショートしました。こわっ
写真でコードが切れたように見えてるのはショート後です。
古い電化製品には気をつけましょう。
火事とかにならなくてよかった。

半田ごて買ってきて、中学くらいの時の技術の時間にした作業を思い出しながら、くっつけて・・・認識した!
やっぱスカスカなのはダメだよね。

ESP32に温湿度センサーAHT20と赤外線レシーバーついてます。

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通りだよ?明らかに足りてないよね?
本体側でも情報持ってて組み合わせでデコードするのか

一部抜粋

変動する値だけに着目。明らかに周期性はありそう。
ただ全部をカバーできるアルゴリズムって・・
もうやめようかとも思いましたが、多分解析できた。

こういうの考えるのは好きだけど、これ考えるのに時間費やしていていいのかと。
丸一日以上かかった。
むしろよく辿り着いた。
興味ない大多数の方は読み飛ばしてください。

並び順が同じ規則になるのが8つ間隔→3bit
わかりやすい並びを基準軸として、基準軸から+1度と考える

基準軸の値と+1度なら001のXORを取る。+2度なら010とXOR。-1度は111とXOR。

時刻の"分"部分はそのままの値の16進数なんだけど、"分"成分を加味すると
4bitで収まる値までは算出した値に+2、4bit超える時は算出した値に-2をして下4桁のbitとXOR
4bit超える時はそれを更に上位bitもXORかけると出たっぽいです。

冷房は基準の軸が違うだけで、同じ法則っぽい。

停止ボタンは最終的に得られた値に下2桁だけビット反転

もうわけわからない。ほんと辿り着いたの奇跡すぎる

これでやっと信号の値得られたので、実装できそう。
ほんとに合ってるか全部は確認してないけど、動きそうならいいか。
疲れた。
達成感と疲労感が半端ない。

割とお腹いっぱいになってきたよー
どこまでするか悩んでますが、続きがあればまた。

長くなってしまった。お付き合いありがとうございました。

追記:
投稿してから気づきました。
今回たまたま見かけたコードがRAW-Dataしか表示しないものだったため、そのまま解析していましたが、Prontoデータを用いる必要があったのですね。ややこしいはずだわ。メーカーの違いによるものかと思ってました。
うー



いいなと思ったら応援しよう!