前回まで/次回以降の取り組みはこちらから。
今回はセンサで測定したデータをRaspberry PiからAmbientというIoTサービスに送信して記録していきます。
Ambientへのデータ送信については後半にあります。(というか今回前半が長いです。)
AmbientとRaspberry Piの連携について知りたい方はRaspberry PiからAmbientにデータ送信するのセクションから見てください。
もくじ [hide]
Ambientとは
公式サイトより。
AmbientはIoTデーターの可視化サービスです。
マイコンなどから送られるセンサーデーターを受信し、蓄積し、可視化(グラフ化)します。
今回のpythonアプリ完成図
こんな感じ。
Ambientにデータ送信するためのGUIパーツを追加しました。
Arduinoスケッチ
asagao_iot_0_1_0.ino
pythonプログラム
main_0_1_0.py
Ambientについて、GUIではチャネルID、ライトキー、送信間隔、送信するかを決めれるようにしてますが、いったんソフトにベタテキストで書き込んで1分間隔でデータ送信してみました。
(あまりむやみやたらにグローバル変数使わない方が良いのは知ってるんですけどね…)
あと、時々アプリそのものの動作が止まることがあり、改善方法がなかなか見つからず苦労しました。
その痕跡で随所にtry~except文があったり、refresh_time関数やrefresh_sensor関数のタイマーが変わってたりします。
根本的な理由は別の場所にあったんですが、それは後述。。。
mainwondow_0_1_0.py は前回の mainwindow_0_0_8.py から変更なしなので省略します。
謎のフリーズに悩まされる
時々、アプリの画面更新が止まってしまう不具合に悩まされました。
時計やセンサーの値などの画面の数字が変わらなくなり、Ambientへのデータ送信も止まります。
フリーズするタイミングは都度バラバラです。
時計の秒が毎回同じ、とかならまだわかりやすいんですけどね…。
もっとも、これまでもたまに起こっていたんですが、ここにきて頻発。
(Ambientにデータを送信することで記録が残るので見えるようになっただけか?)
解決するためにあれこれ試しました。
- シリアル通信に関連する部分にtry~except文を入れる → 効果なし
- refresh_time関数とrefresh_sensor関数の実行タイミング見直し → 効果なし
- refresh_time関数とrefresh_sensor関数をくっつけてみる → 効果なし
(タイミングがかち合っている?) - Arduinoから不必要なデータの返信をやめてみる → 効果なし
- 電源をUSB充電器(一応QI対応のやつ)から純正電源に交換 → 効果なし
- グローバル変数のセンサデータを同時に読み&書きしてしまっている? → 未トライ
(未トライというか、ここに対する解決策を思いつかない)
結論:センサデータ送信指示の文字列を変えた
ら、とりあえず改善したみたいです。
当初、Raspberry PiからArduinoにセンサデータの送信指示(「d」という文字を送信)したら、センサの値を返事するようにしていました。
その後、LED照明やポンプの制御をするために「L100」や「W500」といった4文字分のデータを送るようになったので、データの長さを合わせて処理を簡単にするためにセンサデータの送信指示を「d000」に変更しました。ここで、フリーズ多発。
そこで、センサデータの送信指示を「dddd」にしてみたところフリーズが収まりました。
ArduinoIDEのシリアルモニタで確認してもそんな兆候が見られるので、Arduino側で送信指示の内容によって動作が変わっているようです。
「d000」を送ると返事するときとしないとき(正確にはセンサのデータを返事するときと「0」と一文字だけ返事するとき)がありますが、「dddd」を送ると毎回センサのデータを返事してくれます。
現段階でこれ以上の理由は分かっていませんが、今後、分かったら報告します。
気を取り直して、
Raspberry PiからAmbientにデータ送信する
Ambient公式でやり方解説されているのでその通りでOKです。
が、せっかくなのでAmbientの登録からデータアップ・確認まで解説します。
①Ambientに登録する
Ambient公式サイトを開き、右上の「ユーザー登録(無料)」をクリックします。
メールアドレスを入力し、パスワードを決めて「ユーザー登録(無料)」をクリックします。
登録したアドレスにメールが届きます。
届いたメールに記載されたリンクをクリックします。
webサービスやECサイトの登録でよくある流れですね。
メールに記載されたリンクを踏めば登録完了です。
②Ambientでチャネルを作る
チャネルというのはひとまとまりのデータをまとめる箱のようなイメージです。
1つのチャネルに8種類のデータを登録できます。
ログインして使っていきます。
トップページ右上の「ログイン」でもOK。
メールアドレスとパスワードを入力して「ログイン」をクリックします。
自分の「チャネル」が表示されます。
「チャネルを作る」をクリックして、新しいチャネルを作ります。
新しいチャネルが作られました。
この「チャネルID」(5桁の数字)と「ライトキー」(16桁の英数字)がデータのアップロードに必要です。
どこかにコピペしておくか、このページを開いたままにしておきます。
③pythonプログラムからデータを送る
pythonプログラムにデータアップロード用のコマンドを追加します。
1.ライブラリ追加
LXTerminalでライブラリをインストールします。公式サイトの通り。
2.pythonプログラムで使う
プログラムにライブラリを読み込みます。
ライブラリがないよ!と怒られます。どうして…。
(ericで動かしてみたらライブラリがないよ!と怒られたので、インストールできたか確認するためにThonnyIDEでも動かしてみたところです。やっぱり怒られました。)
3.パスを通す…?
ググってみたところ、どうやらこのライブラリはpython2系のライブラリらしく、python3系を使っているericやThonnyIDEからは保存場所を見つけられないようです…。
なので、保存場所を教えてあげる必要があります。
この作業を「パスを通す」というみたいです。
まずは保存場所を突き止めます。LXTerminalで
を実行します。
「Location:」に続く部分がAmbientライブラリの保存されている場所です。
確かに保存場所にも「python2.7」って入ってますね。
pythonでAmbientのライブラリをインポートする前にこの保存場所を教えてあげます。
エラーが出なくなりました。ちゃんと読み込めてるみたいです。
もちろん、ericでもエラー出なくなりました。
このあたりちゃんと公式で書いといてくれないと。無駄に悩んだじゃんかよー…(-ε-)*ブー
4.気を取り直してpythonプログラムで使う
Ambientのライブラリをインポートします。
インスタンス化します。
ここで、チャネルIDとライトキーを入力しておきます。
データを送信したいタイミングで.send命令を実行します。
データは’d1’~’d8’までです。
上のpythonプログラムを見てみてください。
④送ったデータを見てみる
Ambientにログインし、チャネルを開きます。
チャネルや各データの名前を付けたり、データを一般公開するか設定したり、位置情報を登録したりできます。
チャネル名を登録したので、上に表示される名前も変わりました。
次に、チャート設定をクリックしてグラフの設定をします。
グラフの名前や種類、8つのデータのうちどのデータを表示するか、メモリの縦軸を左側に取るか右側に取るか、それぞれの縦軸の最大値最小値、グラフの表示件数が設定できます。
例えば、温度・湿度・大気圧をこんな設定で1つのチャートに、
照度・土の水分量・タンクの水検知状況を2つめのチャートに登録してみます。
すると、こんな表示になりました。
これで、センサのデータがAmbientのサーバーに送信・記録されていきます。
今回は測定したデータをAmbientに送信して、いよいよIoTらしくなってきました。
まだまだ続きます。
コメント