あさがおIoT観察日記⑰:RaspberryPiからAmbientにデータ送信する【大人の自由研究】

Arduino
この記事は約8分で読めます。


前回まで/次回以降の取り組みはこちらから。

今回はセンサで測定したデータをRaspberry PiからAmbientというIoTサービスに送信して記録していきます。

Ambientへのデータ送信については後半にあります。(というか今回前半が長いです。)
AmbientとRaspberry Piの連携について知りたい方はRaspberry PiからAmbientにデータ送信するのセクションから見てください。

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らしくなってきました。

まだまだ続きます。

コメント

タイトルとURLをコピーしました