ESP8266でBlynkとThingSpeakの両方にデータを送信したい


Blynkは美しい

センサーデータを収集して可視化するサービスはいろいろありますが、最近 Blynk というサービスを知りました。他のサービスと比べて、特にBlynkはデザインが美しく、メインで使いたいなーって思うサービスです。

ただ、(私の調査不足かもしれませんが)アプリを起動していない時のデータは保存されていないようで、History Graphを見ると、その間のデータは抜けてしまっていました。

ThingSpeakでデータを蓄積する

ThingSpeak もデータの収集・可視化を行うサービスで、グラフをブラウザ上で見ることができます。Blynkのようにスマホのアプリを起動していない時でも、常にデータを収集してくれています。

じゃあ両方使おう!あれ…うまくいかない?

ということで、

  • リアルタイムのセンサーデータを見るのは Blynk
  • 過去のセンサーデータを見るのは ThingSpeak

で行うようにしてみました。ところが、Blynkを使用しているとThingSpeakへのデータ送信が失敗するのです(ThingSpeak.writeFields()の戻り値が-302)。ThingSpeakのライブラリを使わずに、HTTPで直接アクセスするプログラムを書いてもだめでした。
 Blynkのアプリ側でオフラインにすると、問題なくThingSpeakに送信できます。もしかしてESP8266は同時に1コネクションしか通信できないのか…?

解決策:ThingSpeakに送信するときだけBlynkをオフラインにする

void loop() {
  Blynk.run();
    :
  //数分おきに行うThingSpeakへ送信する処理
  if(...) {
    Blynk.disconnect();  // Blynkから切断
      :
    ThingSpeak.setField(1, tbuf);
    ThingSpeak.setField(2, hbuf);
    ThingSpeak.setField(3, pbuf);
    int code = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
      :
    Blynk.connect();  // Blynkに接続
  }
    :
}

これでThingSpeakにも接続できるようになりました。Blynkから切断している間はもちろんアプリからアクセスすることはできませんが、ThingSpeakへの送信は数分に1回ですし、1-2秒で完了するので、特に支障はないでしょう。

やっぱりIoTクラウドサービスは便利

データを収集するだけなら簡単ですが、グラフを表示させるとなると自分で作るのは大変。過去のデータに加えて、最新のデータに更新していく処理を考えると、自分じゃ作りたくないですね。(^^;; なので、こうやってデータを可視化してくれるサービスは本当に助かります。