センサーなどをつなぐだけで簡単にIoT化ができるObnizを使って、エアコンの遠隔操作リモコンを作ってみました。公式HPのチュートリアルにまさにやりたいことが載っていたので、それを参考にしながら工作しました。
目標とするリモコンの概要
今回作成したいリモコンの概要について整理します。まず、一番やりたいことは、
①:エアコンのOn/Offをスマホを使って外出先から操作する
です。暑い夏や寒い冬に家に帰る前にエアコンの電源を付けることが出来るようにすることが目的です。
それだけだと、エアコンをつける必要があるのかどうかわからないので、
②:現在の部屋の温度を取得して表示する
機能も欲しいです。快適な気温のときにわざわざエアコンをつける必要はないですからね。
この二つだけで十分と言えば十分なのですが、ちゃんと信号を送っているのか確認するために、
③:信号を送ったらブザーを鳴らす
機能も追加します。家にいない時には確認できませんが、まあ練習ということで付けてみます。
用意する部品
先ほどの機能を実現するにあたって必要な部品は次のとおりです。
- Obniz
- 赤外線モジュール: IoT Home Kitに付属の赤外線モジュールを使用します。
- 温度センサー: LM35DZ
- 電子ブザー: UDB-05LFPN
その他、ブレッドボードとピンヘッダ、ピンソケットを用意します。
用意した部品をくみ上げたのが次の写真です。
Obnizの0~3番ピンが赤外線モジュール、4~6番ピンが温度センサー、7番ピンと10番ピンが圧電ブザーと接続しています。
HTMLプログラム
公式HPの制作例にある”遠隔エアコン操作!”で示されているソースコードを流用します。
obnizはWebから操作できるハードウェアです。難しかったハードウェアもWEB技術なら簡単に扱えます。WEBで使える豊富なライブラリとハードウェアを組み合わせることもできます。また、WEBにある1つのソフトウェアから世界中に置いたすべてのハードウェアをコントロールできます。 遠隔エアコン操作! - obniz.io |
サンプルのソースコードとその説明に関しては、上記のページをご参照ください。ここでは、そこで公開されているソースコードをどのように改造したかを紹介します。
ボタンタッチ時の動作を非同期関数へ変更
まず、変更したのはボタンを押したときに起動する関数を非同期関数に変更したことです。この理由としては、ボタンを押して赤外線の信号を送信した後に、ブザーを一定の間鳴らすためです。
Obnizでは、代表的な電子部品のパーツライブラリが公開されており、ブザーは下記のページで公開されています。これを見ると、ブザーを鳴らすためにはobnizでwait関数を使う必要があることがわかります。このwait関数が非同期関数であるため、ボタンを押したときに動作する関数も非同期関数にする必要があるわけです。
obnizはWebから操作できるハードウェアです。難しかったハードウェアもWEB技術なら簡単に扱えます。WEBで使える豊富なライブラリとハードウェアを組み合わせることもできます。また、WEBにある1つのソフトウェアから世界中に置いたすべてのハードウェアをコントロールできます。 現実をソフトウェア化する | obniz - obniz.io |
ボタンを押したときの動作部分だけを抜き出すと次のようになります。
$("#on").click(async function(){ // your value for on here. infraredLed.send([ここには送信したい信号を記入]) //speaker ピッピ、と音が鳴る speaker.play(1000) //1000hz await obniz.wait(100) speaker.stop() await obniz.wait(100); speaker.play(1000); //1000hz await obniz.wait(100); speaker.stop(); })
温度センサからの戻り値を補正
今回使用した温度センサー、LM35DZのObnizライブラリも公開されています。それを使うと簡単に温度を取得することが出来ます。
obnizはWebから操作できるハードウェアです。難しかったハードウェアもWEB技術なら簡単に扱えます。WEBで使える豊富なライブラリとハードウェアを組み合わせることもできます。また、WEBにある1つのソフトウェアから世界中に置いたすべてのハードウェアをコントロールできます。 現実をソフトウェア化する | obniz - obniz.io |
実際、先に紹介したサンプルソースコードも公開されている関数を使って温度を取得しています。しかし、この関数を使って取得した温度と、市販の温度計の温度にずれがあることがわかりました。そこで、このずれを補正することが出来ないか、考えました。
まず、LM35DZで温度を取得できる仕組みですが、大気の温度によってLM35DZから出力される電圧が線形に変化します。したがって、この出力電圧を読むことで、現在の気温を知ることが出来ます。Obnizで公開されているライブラリの中身はわかりませんが、おそらく電圧値を読み取って、計算によって温度を求めていると思います。
しかし、仕様書に書かれているICの特性はあくまで一般的な、あるいは代表的、平均的なICの特性であって、一つ一つのICの特性はある一定のばらつきをもっていると考えられます。そこで、市販の温度計の値とセンサからの値が一致するように補正をかけます。
気温と出力電圧の関係が線形だとすると、
完成
上記二点をサンプルソースコードに追加したら、完成です!
エアコンをスマホから停止することが出来ています!また、温度センサで読み取った値も表示されています。