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

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


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

今回はAmbientへのデータ送信の機能追加です。

謎のフリーズその後

前回、pythonアプリのフリーズに悩まされました。

センサデータ送信指示の文字列を「d000」から「dddd」に変えたらとりあえず改善しました。

その後24時間連続で問題なく動いているので、これで先に進んでみます。

今回のpythonアプリ完成図

こんな感じ。

今回の変更点は5つです。

  1. 前回追加した、Ambientにデータ送信するためのGUIパーツを使えるようにした。
    画面左下から右下に位置を変更。
  2. Ambientにデータアップロード成功した時刻を記録するようにした
  3. 設定値が保存できるようにした。
  4. スクリーンショットモードをつけた。
  5. 全体的にGUIの配置見直し。だいぶごちゃついてきましたが…。

Ambientにデータ送信するためのGUIパーツを使えるようにした

要は前回の続きです。

プログラム内のテキストベタ打ちからGUI上の入力欄に入力した情報を使えるようにしました。

あと、データの送信間隔も選べるようにしました。

設定値が保存できるようにした

プログラムを実行するたびにすべての入力欄が初期値(ほとんど0)に戻るので、自動保存機能を用意しました。

右上の「設定保存」ボタンを押すと設定値を「setting.txt」というファイルをpythonファイルと同じ階層に保存します。

プログラム起動時に「setting.txt」があればそこから各設定値を読み込んで起動する、なければ初期値で起動するという仕組みです。

スクリーンショットモードをつけた

現時点でAmbientのチャネルIDとライトキーが画面上に表示されています。
今後はGoogleドライブやLINE API関連などの設定値を設定値として表示していきます。

ブログ用のスクリーンショットを撮って一枚一枚隠す処理をしていくのは手間なので、スクリーンショットモード有効にしたらそうした設定値の部分が「●●●●」表示になる機能を付けました。

webサービスのログイン画面とかのパスワード欄でよくあるやつです。

データ送信タイミングを決めるロジック

データの送信間隔は、以下の中から選択できるようにしました。

Ambientのデータ送信に関する取り決めで1日のデータアップ量が3000件までと決まっています。
今回のように、1回の通信で複数のデータを送った場合には、データの個数分カウントされるようです。

なので、1日にアップできるデータ数から最短の送信間隔を計算すると、

  • データ1系統:1日=(24時間×60分×60秒) = 86400秒 ÷ 3000 = 28.8秒に1回
  • データ2系統:1日=86400秒 ÷ 3000 ÷ 2 = 57.6秒に1回
  • データ3系統:1日=86400秒 ÷ 3000 ÷ 3 = 57.6秒に1回
  • データ4系統:1日=86400秒 ÷ 3000 ÷ 4 = 86.4秒に1回
  • データ5系統:1日=86400秒 ÷ 3000 ÷ 5 = 115.2秒に1回
  • データ6系統:1日=86400秒 ÷ 3000 ÷ 6 = 144.0秒に1回 ⇦now
  • データ7系統:1日=86400秒 ÷ 3000 ÷ 7 = 172.8秒に1回
  • データ8系統:1日=86400秒 ÷ 3000 ÷ 8 = 201.6秒に1回

になります。
なので上記のインターバルを設定できるようにしましたが、通常は144秒以上、つまり3分以上に設定して使う必要があります。

データ送信のタイミングは、60000msごとや120000msごとにタイマーを走らせてデータを送信してもいいのですが、こんなルールで送信することにしました。

  • 1分:現在時刻の「秒」が「0」
  • 2分:現在時刻の「分」を2で割った余りが「0」かつ、「秒」が「0」
  • 3分:現在時刻の「分」を3で割った余りが「0」かつ、「秒」が「0」
  • 4分:現在時刻の「分」を4で割った余りが「0」かつ、「秒」が「0」
  • 5分:現在時刻の「分」を5で割った余りが「0」かつ、「秒」が「0」
  • 10分:現在時刻の「分」を10で割った余りが「0」かつ、「秒」が「0」
  • 15分:現在時刻の「分」を15で割った余りが「0」かつ、「秒」が「0」
  • 20分:現在時刻の「分」を20で割った余りが「0」かつ、「秒」が「0」
  • 30分:現在時刻の「分」を30で割った余りが「0」かつ、「秒」が「0」
  • 60分:現在時刻の「分」が「0」かつ、「秒」が「0」

というのも、例えば「5分おき」にしたときに、記録を始めるタイミングによって「16時2分20秒→16時7分20秒→16時12分20秒→…」とか「19時4分46秒→19時9分46秒→19時14分46秒→…」みたいな中途半端なタイミングでのデータの並びになることが想定できます。というか、高確率でなります。

それは気持ち悪くて、「0分→5分→10分→…」とデータが並んでほかったのでこんなことをやっています。(正確には〇時〇分1秒とかなることがありますが、それは良しとしました。)

あと数字がとびとびなのも、1時間=60分をきっちり割り切れる数という観点で決めたからです。60の約数です。
それならば12分おきがあってもよかったんですけど、5分10分15分20分という並びにわざわざ入れるほどでもないなと思ったので省略しました。

Arduinoスケッチ

前回から変更ありませんので省略。

pythonプログラム

main_0_1_1.py

mainwondow_0_1_1.py

 


 

まだまだ続きます。

コメント

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