モノづくりエンジニアのための情報ポータルサイト|エンジニアピット

CAREER LAB簡単「IoT」体験!Raspberry Piで「室温つぶやきボックス」を作ってみた!(前編)

簡単「IoT」体験!
Raspberry Piで「室温つぶやきボックス」
を作ってみた!(前編)
DATE2015/04/23
最近は、さまざまなモノをインターネットに接続して「状態」を把握したり、自由にコントロールしたりする「IoT(Internet of Things)」の技術が話題になっています。

そこで今回は超小型パソコンの「Raspberry Pi」を活用して、部屋の室温を簡単に取得できる機能を組み込んでみます。そして、どこからでも自宅の室温が把握できるようにして、最終的にはあらかじめ設定した温度になったら自動でツイートもできるような「IoT」を体験してみましょう!
簡単「IoT」体験!Raspberry Piで「室温つぶやきボックス」を作ってみた!

準備するもの

Raspberry Pi以外で、必要な電子パーツ類は以下の通りです!
必要な電子パーツ類
  • ジャンパーワイヤ(オス・メス)3本
  • 抵抗(2.2kΩ)
  • デジタル温度センサ(DS18B20+)
  • ブレッドボード1個
今回は、なるべく簡単に温度を取得したいので、1つのGPIOポートだけでデータを送受信できる「1wire」を使ってみたいと思います。コレに最適なのが、数百円程度で購入できるデジタル温度センサ(DS18B20+)という電子パーツです。

まずは、このデジタル温度センサの使い方からトライしてみましょう!

「1wire」デバイスの使い方!

Raspberry Piのデフォルト設定では、「1wire」が無効になっています。そこで、まずは利用できるように設定を変更するところから始めてみましょう。

Raspberry Piのコンソール画面から、以下のコマンドを実行します。

$ cat /etc/modules

これで、現在のモジュール設定一覧が表示されます。

# Sound
snd-bcm2835

# SPI
spi-bcm2708
spi-dev

# I2C
i2c-bcm2708
i2c-dev

ここへ、「1wire」の設定を書き込みます。

$ sudo vim /etc/modules

テキスト編集画面になるので、最後の行に以下の設定内容を入力して保存します。

w1-gpio

w1-therm

同様の手順で、configファイルにも設定を書き込みます。

$ sudo vim /boot/config.txt

以下の設定内容を最後の行へ入力して保存すれば完了です!

dtoverlay=w1-gpio-pullup,gpiopin=4

あとは、Raspberry Piを再起動すれば「1wire」が利用できるようになります。

$ sudo reboot

デジタル温度センサを配線してみよう!

それでは、「Raspberry Pi」と「デジタル温度センサ」を組み合わせてみたいと思います。以下の回路図を参考に、ブレッドボードを使って配線してみてください。
ブレッドボードを使って配線
配線する際に、デジタル温度センサ(DS18B20+)には向きがあることに注意しましょう。
デジタル温度センサ(DS18B20+)には向きがある
半円の形状を参考にしながら、反対向きにならないように配線してみてください。

温度を測定してみよう!

配線が完了したら、いよいよ部屋の温度を測定してみましょう!

まず、Raspberry Piのコンソール画面から、正常にデバイスが認識されているかを確認します。

$ ls /sys/bus/w1/devices/

28-00000**** w1_bus_master1

「28-00000」で始まる数値が表示されていたら正常に認識されています。(表示されない場合は、再度「設定&配線」を確認してみましょう)

この数値は、「1wire」デバイス1つずつに割り当てられている固有IDのようなもので、ここからさまざまな情報を取得することができます。

実際に部屋の室温を測定して表示するには、固有IDフォルダ内にある「w1_slave」ファイルを表示することで可能になります。

$ cat /sys/bus/w1/devices/28-00000*****/w1_slave

8c 01 4b 46 7f ff 04 10 2e : crc=2e YES
8c 01 4b 46 7f ff 04 10 2e t=24750

上記の例では、「cat」コマンドを使って「w1_slave」ファイルの中身を表示しています。
ここで表示された「t=24750」の部分が温度になっています。(数値は部屋の温度によって変化します)
「t」の数値を1000で割れば、実際の温度になるので、現在は…

24750÷1000=24.75℃

となります。

「cat」コマンドを実行することで、何度も再測定が可能になるので実際に数回測定して誤差を確認すると良いでしょう。
※デジタル温度センサ(DS18B20+)は、-10℃から+85℃までは「±0.5℃」の精度です。

プログラミングしてみよう!

今度は、シェルスクリプトを使ってもっと簡単に室温を表示するプログラミングに挑戦してみましょう!方法としては、先ほどと同様に「cat」コマンドでデータを取得し、それを変数「text」へ格納します。

text=`cat /sys/bus/w1/devices/28-00000647dd91/w1_slave`

取得する室温データは毎回同じ形式なので、「substr」コマンドで指定した部分(tの数値)を別の変数「temp_value」へ格納します。

temp_value=`echo $text | awk '{print substr($0, 70)}'`

あとは、取得した温度を1000で割ることによって、室温を表示させます。

echo `expr $temp_value / 1000`

上記内容を踏まえて、「temp.sh」というファイルを作ってみました。

1 #!/bin/sh

2

3 text=`cat /sys/bus/w1/devices/28-00000647dd91/w1_slave`

4 temp_value=`echo $text | awk '{print substr($0, 70)}'`

5 echo “現在の温度は、`expr $temp_value / 1000`℃です!”

そして、スクリプトを実行すると、現在の室温が表示されます!

$ sh temp.sh
現在の温度は、24℃です

まとめ

今回、学習した内容をもう一度おさらいしておきましょう!
  • 「1wire」を利用することで、1つのGPIOからデータを送受信できる
  • デジタル温度センサは、固有IDを利用してデータにアクセスできる
  • シェルスクリプトを作成することで、簡単に室温データを取得できる
「1wire」デバイスを使った基本的な利用方法を解説しましたが、いかがだったでしょうか。

後編ではシェルスクリプトを改造し、自動で室温ログを取得しながらツイート機能を組み込んで、外出先からでも室温が把握できるようにするのでお楽しみに!

エンジニアピット キャリアラボ一覧へ戻る