YU2TA7KA's BLOG ~take one step at a time~

派生開発、組み込み開発周りのこと。

室温表示の実装【おうちカメラ】

f:id:yuji-tanaak:20190706065553j:plain

やったこと

我が家に赤ちゃんがあと少しでやってくる予定です。これまでで、最低限の機能は実装できていました。今回はラズパイに接続した気温センサ値をブラウザ上に表示できる機能を追加しました。初めてNode.jsを使ったのですが、全然わからず四苦八苦しました。5時間くらいやった気がします。さらに起動時にNode.jsを実行する実装にも3時間くらいかかってます。。Webプログラミング慣れてなさすぎです。

システム構成

www.yu2ta7ka-emdded.com

システム構成図(ver2)

f:id:yuji-tanaak:20190630150705j:plain

ハードウェア

名前 用途 価格
ラズパイ環境(Raspberry Pi 3 Model b+) ストリーミングの配信。定期撮影データの保存。 8,800円
Raspberry Pi Official Camera V2 ラズパイに装着して、撮影を行う。 4,580円
スマートフォン ストリーミング配信視聴端末。日常利用していない古いものを利用。Simカードなし。 0円
お菓子の箱 ラズパイ収納ケースとして利用。 0円
WiFi無線ルータ 家庭内ネットワークの構築。 4,480円
温度センサ adt7410 室温の取得。 500円

ソフトウェア

名前 用途
MJPG-streamser ストリーミング配信
cron 定期撮影、定期温度取得の実行
systemd ラズパイ起動時にアプリケーションを実行開始する
Node.js 取得した温度値をブラウザに表示するサーバープログラミング環境
Google フォト 定期撮影したデータをAPIで自動でアップロードする(未実装)

$ uname -a 
Linux raspberrypi 4.19.42-v7+ #1219 SMP Tue May 14 21:20:58 BST 2019 armv7l GNU/Linux
$ nodejs -v  
v8.11.1  
$ npm -v  
1.4.21  

機能

室温表示

ラズパイに接続した温度センサ値で室温を取得し、それをブラウザに表示します!これだけの機能です!室温は10分に一回更新されます。小数点以下は切り捨てです。

室温表示のしくみ

f:id:yuji-tanaak:20190706070953j:plain
温度センサ周りはpythonで実装しており、読み取ったデータを一旦テキストファイルに出力します。そして、Node.jsがそのテキストファイルを読み取り、室温をhtmlへ渡します。Node.jsから温度センサを制御する方法もあるのですが、それはそれでいろいろ調査実装が必要そうだったのでパスしました。pythonを用いた温度センサ制御であれば、「Raspberry Piで学ぶ電子工作」を参考にすぐできたので、テキストファイル経由のほうが簡単そうという想定でした。Node.jsでテキストファイルを読み込む実装であっても時間かかりましたが。。できてよかったです。
一応、10分ごとに取得した気温データはすべてログとして残すようにしています。これもグラフ表示できるようにしたいですね。いつかは!

今後実装したい機能

  • 定期撮影した画像をGoogle フォトへ自動アップロード
  • 気温によるエアコン制御
  • 撮影画像による表情分類

おわりに

ひとまずこれで運用をしていこうと思います。温度センサ読み取ってブラウザに表示するなんてすぐにできるだろうと思ったら、Webプログラミング知らなさすぎて苦労しました*1。普段は組み込み系のプログラミングしていることが多いので、Webプログラミング周りは新鮮でもあり面白かった部分もあります。Webプログラミング界隈はネットに玉石混交でめちゃくちゃ情報が多い*2ので、検索閲覧での情報取捨選択の試行錯誤が大変でした。
今回実装した、Node.js+ラズパイ+温度センサ制御、Node.js+ラズパイ+起動時実行に関しては備忘録的にも別途記事化しておきたいなぁと思います。まだまだわかっていない部分もあるので、記事化するときに勉強できたら良いかなと。
今後はというか夏休みくらいにGoogle フォトへ自動アップロード機能を実装できればなぁと思います。


*1:パス設定関連でいろいろ時間食われました。具体体的には、初期ディレクトリ(WorkingDirectory)の設定をsystemdのServiceセクションに書いておく必要に気づけなかった。

*2:組み込み系に比べて