今回は温度センサを使った電子工作です。
使用する部品も少ないし、回路も単純……なのに簡単に進まないのが電子工作!今回もかなり奮闘しました!
温度の取得だけでなく、cron(クロン)を使った自動処理、Google Chartsでのグラフ表示にも挑戦してみました。社内便利化ツール第3弾として、使いやすい温度計になるでしょうか!?
温度センサについて
今回使用する部品はこちら!
・ブレッドボード
・温度センサ (DS18B20)
・抵抗器
・ジャンパーワイヤー(オス-メス)3本
今回は「DS18B20」という温度センサを使用します。「DS18B20」は、「1-Wire」というインターフェースを使用した部品で、ラズベリーパイには1-Wire用のモジュールがあらかじめインストールされています。設定を有効にするだけですぐに使用できます!
1-Wire – Wikipedia
1-Wire はマキシム・インテグレーテッドの登録商標であり、接地線と一本の信号線(兼電力供給線)だけで低速なデータ転送を行うバス規格である。
DS18B20は、黒い本体に、3本足のピンがついています。ピンの役割と向きについては、メーカーの公式サイトで公開されているデータシートを参考にしました。
こちらはデータシートの1ページ目に掲載されている図です。
この図、小さく書いてありますが「BOTTOM VIEW」です。普段見慣れている回路図は、上面図ばかりなので、すっかり勘違いしてしまいました!配線を間違えたまま通電させると、センサがものすごく熱くなりますので注意が必要です!
配線図は図2のようになります(こちらは上から見た図です)
左側のVDDピンには電源を接続(緑色のジャンパワイヤー)、DQピンには1-Wire用のポートであるGPIO4を接続(青色のジャンパーワイヤー)、そして2つのピンは「プルアップ抵抗」で接続しています。
「プルアップ抵抗」とは何かと言うと……調べても分からずお手上げ状態だったので、上司に教えてもらいました!
一言で言うと、「入力(DQピン)が不安定になってしまうのを防ぐため」だそうです。プルアップ抵抗でつないでおくことで、入力がない状態のときにも常に若干の電流が流れるので、回路を安定させることができるそうです。
ラズベリーパイの準備
「DS18B20」を使用するには、「1-Wire」を有効化する必要があります。
まずは /etc/modules ファイルの設定です。rootユーザーでログインしてファイルを直接編集するか、「nano」コマンドでLX Terminalからファイルを開いて、下記の2行を追記します。
nano /etc/modules
/etc/modules
w1-gpio w1-therm
もう1つは、Raspbian 2015-01-31(NOOBS 1.3.12)以降のOSを使用している場合に必要となります。設定手順は先程と同じで、/boot/config.txtファイルに1行追記するだけでOKです。
nano /boot/config.txt
/boot/config.txt
dtoverlay=w1-gpio-pullup,gpiopin=4
準備はここまで!再起動して設定を反映させましょう。
reboot
1-Wireが有効化され、温度センサの認識に成功すると、「 /sys/bus/w1/devices 」にファイルが生成されます。実際にフォルダを開いてみると目視で確認できます。
「28-000006470bec」というショートカットフォルダがありました!
このファイル名が、温度センサの「デバイスID」となります。
こちらがフォルダの中身です!「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
このようになっていました!
暗号のような文字列ですが、温度は「t」の値で上記のデータでは「24750」となります。値は1000倍されているため、「24.750℃」ということになります。ファイルを読み込むたびに温度を取得する仕様となっているので、直接ファイルを開いた場合でも、温度データが更新されます。
コマンドラインから温度を取得する場合は、「cat」コマンドでファイルの中身を直接出力する方法が一番シンプルです。
cat /sys/bus/w1/devices/28-000006470bec/w1_slave
ちなみに、温度センサがうまく認識されなかった場合は、フォルダ内が空になっていたり、「w1_slave」ファイルが生成されませんので、その際は配線や設定を再確認しましょう。
温度を自動取得!
次は、温度取得の自動実行に挑戦します!
まずは下ごしらえです。温度データの取得・保存を行うプログラムを準備しましょう。
/var/www/temperature.php
<?php $deviceId = '28-000006470bec'; $today = date("Ymd"); $time = date("H:i"); $sensor_path = '/sys/bus/w1/devices/'.$deviceId.'/w1_slave'; $csv_dir = '/var/www/temperature/'; $csv_file = $today.'.csv'; $t = null; //温度取得 exec("cat ".$sensor_path, $w1_slave); if(isset($w1_slave[1])){ $tmp = explode('t=', $w1_slave[1]); if(isset($tmp[1])) $t = $tmp[1] / 1000; } //CSV書き込み if(!file_exists($csv_dir)){ mkdir($csv_dir); } if( $handle = fopen( $csv_dir.$csv_file , 'a' ) ){ fputcsv( $handle, Array("'".$time."'", $t) ); fclose($handle); } return;
「cat」コマンドで温度を取得し、日付ごとにCSVファイルに保存するプログラムを作成しました。「$deviceId」の値は、お持ちの温度センサのデバイスIDと差し替えてくださいね。
上記のように、PHPを使用する場合は、「php5」と「apache2」のパッケージを事前にインストールしておきましょう。インストール手順は第13回「ラズベリーラジオ前編 – インターネットラジオ受信と遠隔操作」で紹介しています。
プログラムの用意ができたら、次は自動取得の設定です。
定期的に自動実行させるには、「cron(クロン)」という機能を使用します。
crontab – Wikipedia
crontab(クロンタブ、あるいはクローンタブ、クーロンタブとも)コマンドはUnix系OSにおいて、コマンドの定時実行のスケジュール管理を行うために用いられるコマンドである。標準入力からコマンド列を読み取り、crontabと呼ばれるファイルにそれを記録する。この記録を元に定時になると、その命令内容を読み取り、実行が行われる。
CRON AND CRONTAB – Raspberry Pi Documentation
ラズベリーパイ公式サイトにもドキュメントが掲載されています。
cron(クロン)を使った工作は、「DevicePlus 電子工作マニュアル Vol.3」でも紹介されていますので、ぜひこちらも参考にしてくださいね!
cron(クロン)の設定方法は、crontabファイルに命令を1行記述するだけです。命令の書式は上記の両方のサイトで紹介されていますが、サンプルがたくさん掲載されているWikipediaの方が分かりやすいです。
# (行頭の # マークはコメント行を示す) # +------------ 分 (0 - 59) # | +---------- 時 (0 - 23) # | | +-------- 日 (1 - 31) # | | | +------ 月 (1 - 12) # | | | | +---- 曜日 (0 - 6) (日曜日=0) # | | | | | # * * * * * 実行されるコマンド
このように、分・時・日・月・曜日の5項目で実行のタイミングを指定し、実行したいコマンドを記述します。
固定値の他には、特殊記号が用意されていますので、繰り返し処理を行わせたい場合などに便利です。
- コンマ (,) で値のリストを指定する: 例) “1,3,4,7,8”
- ダッシュ (-) で値の範囲を指定する: 例) “1-6” (”1,2,3,4,5,6″という指定と同じ意味)
- アスタリスク (*) でそのフィールドで取りうる全ての値を表現する。例えば、時をあらわすフィールドでは「毎時」という意味となる。
それでは実際に設定を行いましょう。crontabファイルに命令を記述するには、下記のコマンドを実行します。
crontab -e
nanoエディタが起動し、「crontab」ファイルの中身が表示されます。「#」ではじまる行はコメント行です。crontabの書式に従って、下記のように命令を追記します。
0-59/10 * * * * php /var/www/temperature.php
毎時10分ごとに、温度取得プログラムを実行するように設定しました。「0-59/10」は「0,10,20,30,40,50」と記述するのと同じ内容になります。こうして実際に使ってみると、特殊記号の便利さが分かりますね!
命令がうまく登録されると、設定したタイミングでプログラムが呼び出されます。再起動は必要ありません。最初は短い間隔で呼び出されるように登録して、動作確認を行うことをおすすめします。
Google Chartsでグラフ化!
グラフの描画ができるパッケージもありますが、もっと手軽にカスタマイズしたいので、今回は「Google Chart」を使ってみました!
Google Charts
Chart Gallery – Google Charts
グラフの一覧はこちらで確認できます。棒グラフや円グラフはもちろん、地図を使ったジオチャートまでサポートされています。サンプルソースがたくさん用意されているので、簡単にグラフィカルなグラフを表示させることができます。
温度グラフの定番といえば、折れ線グラフ!ということで、今回は「Line Chart」を使用します!
サンプルソースを土台に、CSVファイルから読み込んだ温度データを表示できるようにカスタマイズしてみました。
/var/www/index.php
<?php $today = date("Ymd"); $csv_dir = '/var/www/temperature/'; $csv_file = $today.'.csv'; $grapgh = ''; //CSV読み込み if (($handle = fopen($csv_dir.$csv_file, "r")) !== false) { while (($line = fgets($handle)) !== false) { $grapgh .= '['.rtrim($line).'],'.PHP_EOL; } fclose($handle); }else{ echo 'no data'; } ?> <html> <head> <script type="text/javascript" src="https://www.google.com/jsapi"></script> <script type="text/javascript"> google.load('visualization', '1.1', {packages: ['line']}); google.setOnLoadCallback(drawChart); function drawChart() { var data = new google.visualization.DataTable(); data.addColumn('string', 'Time'); data.addColumn('number'); data.addRows([ <?php echo $grapgh; ?> ]); var options = { chart: { title: 'Raspberry Pi Thermometer', }, height: '500' }; var chart = new google.charts.Line(document.getElementById('linechart_material')); chart.draw(data, options); } </script> </head> <body> <div id="linechart_material"></div> </body> </html>
出力されたグラフはこちら!
図6が実行結果のグラフです。室温が上がり始めた11時30分は、パソコンの熱で室内が暖まってきた頃合い……当日の社内の様子が分かってしまうようなグラフに仕上がりました。温度変化の大きい季節に動かすと、大きく揺れるグラフができておもしろそうです!
Apacheの公開ディレクトリ内にファイルを設置したので、別の端末からもアクセスできます。ネットワークを利用することで、別室の温度監視も簡単に実現できますね!
まとめ
ラズベリーパイの手作り温度計、完成!
会議室などの常駐する人が居ない部屋の温度監視に活躍してくれそうです。夏場はエアコンの消し忘れチェックツールとしても役立ちそう!LEDを光らせる、音を鳴らすなど、温度によってお知らせする機能を付けるともっと便利になりますね!
ちなみに温度センサを使った電子工作のArduino版ははじめての電子工作超入門「第7回 Arduinoで作る簡易百葉箱(その1)。」で紹介されています。Arduinoユーザーの方はこちらもどうぞ!
今回「cron(クロン)」の使い方を覚えたので、次回はこの機能を応用して「目覚まし時計」を作ってみたいと思います。
主役の部品はこちら!このタクトスイッチを、アラームを止めるための「ストップボタン」として取り付けます!