にゃみかんてっくろぐ

猫になりたい

Raspberry Piでダッシュボードを作る(5) -温度・湿度(センサ)-

f:id:no_clock:20171016214958j:plain

Raspberry Piとミニディスプレイ,各種センサを使ってダッシュボードを作ります.


今回のゴール

  • 室内の温度・湿度を表示する.

センサの調達

Raspberry Pi本体にセンサはありませんが,GPIO(General Purpose Input/Output: 汎用入出力)用のピンが40ピン*1配置されています.このピンを使って,センサ類に電源を供給したり,通信したりすることが可能です.というわけで,センサを調達します.

(余談… これまでソフトウェアにしか縁がなく,センサなどの電子部品を扱うのは難しいと思っていました.が,やってみると案外難しくありませんし,「Raspberry PiでXXをやってみた」系の記事もたくさん見つかります.特に今回は工具不要で刺すだけ繋ぐだけです.心配はいりません!)

材料

(リンクはすべて秋月電子通商にジャンプします)

  • 温湿度センサ: AM2320
  • ブレッドボード: なんでも良い.例えばBB-801
  • ジャンプワイヤ(オス-メス): なんでも良い.例えば秋月C-08933

温湿度センサ 温湿度を測定するためのものです.I2Cという通信方式に対応していて,読み取りが比較的容易です.
ブレッドボード 電子部品の実験用パーツです.たくさん穴が空いていて,一定のルールで電気的に繋がっています.ここに部品やケーブルを繋いで,回路を組み立てます.
ジャンプワイヤ 電子部品どうしを繋ぐケーブルです.今回はRaspberry Piとブレッドボードを繋ぐために使用します.

配線

Raspberry Piの電源を切っておきます.Raspberry Piピン配置図AM2320のデータシート(秋月のページにPDFへのリンクあり)を参照しつつ,配線します.

f:id:no_clock:20171107220443p:plain

f:id:no_clock:20171107213520j:plain

I2C有効化

標準でI2Cが無効になっているため,まずは有効にします.設定はGUI/CUIいずれでも可能です.設定が終わったら,念のため再起動しておきましょう.

参考: 最近の Raspberry Pi で I2C を有効化 - Rabbit Note

読み取り

温度と湿度を読み取ります.I2Cは,複数の電子部品(デバイス)と通信できるように,「デバイスのアドレス」と「データ」をセットで通信します.データ(バイト列)の内容はデバイスによって様々です.

本当はデータシートをじっくり眺めるべきところですが,幸いAM2320は接続例が多数あります.そうした情報を活用しましょう.

参考: 温湿度センサAM2320をRaspberry Pi 3で使用する|wizqro.net

Pythonの登場

今回はRubyではなくPythonというプログラミング言語が登場します.Python 3系が新しいので,こちらをインストールしましょう.

$ sudo apt-get install python3 python3-smbus
$ python3
(Python 3.x系が起動する.quit()またはCtrl+Dキーで終了)

参考ページのスクリプトをファイルに書き込み,実行してみましょう.

(read_temphumid.pyとして作った場合)
$ python3 read_temphumid.py
59.0
20.8

1行目が湿度,2行目が温度です.読み取れました.

ダッシュボードへの追加

ダッシュボードはRubyスクリプト,温湿度の読み取りはPythonスクリプト

ここはちょっと無理矢理ですが,RubyスクリプトからPythonスクリプトを実行することで,温湿度をダッシュボード上に表示していきます.

先ほどのread_temphumid.pyは,ダッシュボードのapp.rbと同じディレクトリに置いておきます.そして,views/index.erbを編集します.

<div class="card">
  <h4 class="card-header text-white bg-success">温湿度</h4>
  <div class="card-body">
    <%
      data = `python3 read_temphumid.py`.split(/\n/)
      humidity = data[0]
      temperature = data[1]
    %>
    <p class="card-text">
      気温: <%= temperature %>℃<br>
      湿度: <%= humidity %>%
    </p>
  </div>
</div>

ダッシュボードを表示しましょう.温度・湿度が表示されました.

f:id:no_clock:20171107220442p:plain

今回はここまで.

*1:古いモデルは26ピン