Arduinoで創るネットワーク対応リモコン(ソフトウェア)
前回のハードウェア編の続きの内容。ハードウェアが出来たので、ソフトウェアを書き込む。
リモコンの機能
リモコンの機能は、以下のものとした。
- iPhone/Androidで、エアコン入切を制御(予約)ができる
- エアコンに信号が送れるかのテストができる
- 無料で運用できる
もとの日経Linuxの記事だと、「温度センサーで温度を見ながら制御する」ということだった。私には、そこまで必要ないので、時間で制御するようにした。特定の時間が来たら、エアコンが動いたり止まったりする。エアコン入切の予約は、iPhone/Androidなどで出来るようにする。外出中でも制御が可能だ。
もう一つ重要なのは、無料で運用できる点。Arduinoをネットワークに繋げて、ネットワーク上の命令で動くようにする。つまり、自由に処理を動かせるサーバ(PHPやRubyが動く)が必要だ。しかし、それだと有料になってしまう(GAEもあるけどね)。
そこで考えたのが、Dropboxで制御する方法。Dropboxのファイルに命令を書き込んでおいて、一定時間おきにArduinoが命令を確認しにいく。これだと無料で運用することができる。
Arduinoのプログラム
Arduinoに以下のプログラムを書き込んだ。
エアコンの制御信号
エアコンの制御信号はこの記事で取得したものを埋め込んだ。外部から読み込むのは複雑になりそうだったから。
エアコンの制御信号は数が多いので、普通に配列に入れると、メモリ不足でプログラムが止まってしまう。何も言わずにバッサリと落ちてしまう。この問題は「PROGMEM」で解決した。
Dropbox上のファイルを取得
Arduinoでネットワークアクセスで勉強していたので、簡単にDropbox上のファイルを取得できた。このプログラムでは5分おきにファイルを取得する。
時間を取得する
意外と大変だったのが、時間を取得する処理。Arduino単体では、時間は取得することが出来ないのだ。電源投入時に時間を書き込むか・・、NTPで時間を取得するしかない。
今回は、NTPで取得することにした。NTPを取得する方法は、NTPを使ってインターネット経由で時刻をあわせるを参考にした。
ArduinoのTimeライブラリの導入は、(Macだと)「~/Documents/Arduino/libraries/Time/」というフォルダを作成し、Time.hやTime.cppを置いて、Arduino開発環境を再起動する。
Windowsでも、ソースコードが配置されるフォルダと一緒の階層に、librariesフォルダを作れば良いはず。
タクトスイッチ
タクトスイッチはテスト用のものだ。タクトスイッチを押すと、リモコンの信号を送信する。エアコンに向くように、リモコン本体の角度調整が必要なので、手軽にリモコン信号を送信する機能が必要だった。
Dropbox上のファイル
こんなファイル(Controller.txt)を置いている。
;Format:"$HHMM:COMMAND"
-start-
$1800:OFF
$1820:OFF
$2150:OFF
$0430:ON
$0520:OFF
-end-
プログラム内で”$HHMM:”から始まる文字を探しに行って、見つかると”ON”か”OFF”のコマンドを読み込む。ONだとエアコンにスイッチを入れる制御信号を送り、OFFだとスイッチを切る制御信号を送る。”$”以外から始まるの行はスキップされる。
時間は10分間隔の指定となる。18時2分にArduinoがこのファイルを処理すると、”$1800:OFF”が命令対象となり、エアコンを停止する信号が送られる。
18時12分にArduinoがこのファイルを処理すると、”$1810:XX”が命令対象となる。この命令はファイルに無いので、何も実行せずにスキップする。
*最後に改行のみの行が必要。最後の空行で、終了判定をしている。