tAROの試行錯誤

技術的なことを色々試した過程を記録

Timer Camera Xで定点観測カメラを作る(その4)

前回からの続きです。

isogabamaware.hatenadiary.jp

前回は以下の4を作ったので、今回は5を作ります。

  1. Node-REDでhttpで画像を送受信し、表示する環境を作る
  2. TimerCameraXで撮影した画像をPC上で確認する
  3. TimerCameraXからhttpでNode-REDに画像を送信する
  4. TimerCameraXをディープスリープさせて定期的に撮影するようにする
  5. AWS部分を作り、node-redから画像を送信する
  6. TimerCameraXとAWSをつなぐ

と思ったのですが、前回は画像をプレーンテキストで送っていたため付加情報が送れていませんでした。 そこで、今回は4の続きとして、画像をJSONで送ってみます。

4. (続き)TimerCameraXをディープスリープさせて定期的に撮影しJSONで送る

JSONをhttp POSTする方法を調べるために前々回の参考サイトをもう一度見てみます。

randomnerdtutorials.com

 // If you need an HTTP request with a content type: application/json, use the following:
 //http.addHeader("Content-Type", "application/json");
 //int httpResponseCode = http.POST("{\"api_key\":\"tPmAT5Ab3j7F9\",\"sensor\":\"BME280\",\"value1\":\"24.25\",\"value2\":\"49.54\",\"value3\":\"1005.14\"}");

この部分を参考にしてJSONで送ってみます。 せっかくJSONで送るので、画像だけでは面白くないので、バッテリーの電圧も送ってみます。 ちょっとブサイクですが、こんな感じになりました。

    http.addHeader("Content-Type", "application/json");
    String json_data = String("{\"jpeg\":\"") + String(reinterpret_cast<char*>(base64buff))
      + String("\",\"battery\":") + String(bat_get_voltage()) + "}";
    int httpResponseCode = http.POST(json_data.c_str());

受信側のNode-REDもJSONを受け取るように変更します。

f:id:tARO:20210127224625p:plain

http inノードの後ろにjsonJavaScriptオブジェクトに変換するノードを追加します。 その後、jpegを画像表示のdashboardのtemplateノードへ、batteryをグラフ表示のためのchartノードへつなぎます。

無事ダッシュボードに撮影画像とグラフが表示されたので、バッテリーがどの程度持つか、バッテリーが切れるまでグラフを描き続けてみようと思います。 60秒スリープだと半日程度時間がかかってしまうので、5秒スリープに変更し1時間程度でバッテリー切れになることを期待します。

f:id:tARO:20210127224709p:plain

PCからUSBを抜いたのがグラフの20:43:05,4089mvです。 ここからバッテリー駆動になり徐々に電圧が下がっているのがわかります。 また1時間後にみてみたいと思います。

f:id:tARO:20210127224734p:plain

22:05:32,3591mvを最後に更新されなくなりました。 スリープ時間は5秒に設定しているのですが、起動やWiFi接続に2秒程度かかり、7秒間隔で画像が送られてきていました。 1時間22分27秒(4947秒)バッテリーで駆動したので、約700枚撮影できたことになります。 ここから1時間に1回撮影した場合を計算すると、700/24で約29日とほぼ公表スペック通り1ヶ月動作させることができることがわかりました。 なかなかよくできていますね。