レッツラズパイ!・プロジェクト
-
レッツラズパイ!〜Raspberry3にOSをインストールしよう〜
【番外編】レッツラズパイ!〜"ディスプレイなしで"RaspberryPiにOSをインストールしよう編〜 - レッツラズパイ!〜Lチカ&Lピカをマスターしよう編〜
- レッツラズパイ!〜Webカメラで監視しちゃうゾ編〜
- レッツラズパイ!〜温度センサーで検知メールを送ろう編〜
- レッツラズパイ!〜Google HomeでLピカさせよう編〜
- レッツラズパイ!〜Google Homeに室温を教えてもらおう編〜
- レッツラズパイ!〜Lチカボタン編〜
RaspberryPiを始めて触る&IT初心者向けのドキュメントです。私の所属する会社で使う、IT初心者の方のインターンシップ向けのドキュメントとして書きはじめたので、かなり丁寧に書いていますがご了承下さい。
参考
- 第18回「ラズベリーパイで手作り温度計!」(IT女子のラズベリーパイ入門奮闘記)
温度センサーとmailgunで検知メールを送ろう
仕様と構成図
- 温度センサーを取り付け、現在の温度をモニタリングできるようにする
- 温度センサが27度以上を計測した時、スマホに「冷房つけろ」メールを飛ぶようにする
- メールを飛ばす仕組みはmaigunを利用する
- APIライクにメールを配信できるサービス
- せっかくなのでLチカもさせて危機感を演出する
必要なモノ
- ブレッドボード×1個
- 温度センサ (DS18B20)×1個
- 抵抗器×2個
- ジャンパーワイヤー(オス-メス)×5本
- LED×1個
温度センサーで室温をモニタリングする
温度センサーの設定
まずは、温度センサーを配線していきます。下図を参考に、RaspberryPiとブレッドボードに配線していきましょう。温度センサーはGPIO4でしか使えないっぽいので、そこに配線するようにします。
温度センサーは配線を間違えると大変高温になります。やけどするので気をつけて下さい。
製品 | 接続するブレッドボードの場所 | 接続するラズパイのPIN |
---|---|---|
温度センサ | F14、F15、F16 | - |
抵抗 | I15、I16 | - |
ジャンパワイヤー(青) | J14 | 20番ピン(GND) |
ジャンパワイヤー(黒) | J15 | 7番ピン(GPIO4) |
ジャンパワイヤー(白) | J16 | 17番ピン(3.3V) |
配線が完了したら、次に「1-Wire」を有効にします。
今回使用する「DS18B20」という温度センサは、1-Wire(接地線と一本の信号線兼電力供給線だけで低速なデータ転送を行うバス規格)というインターフェースを使用した部品です。ラズベリーパイには1-Wire用のモジュールがあらかじめインストールされているので、設定を有効にするだけですぐに使用できます。
GUIの左上のスタートメニュー→[設定]→[Raspberry Piの設定]をクリックします。[インターフェイス]タブを選択し、「1-Wire」の値を「有効」にし、OKを押します。その後再起動を求められるので再起動をします。
1-Wireが有効化され、温度センサの認識に成功すると、/sys/bus/w1/devicesにファイルが生成されます。実際に確認してみましょう。下記コマンドで温度センサーのデバイスIDを確認します。
$ ls /sys/bus/w1/devices
「28-000006470bec」のような文字列のディレクトリが作成されているかと思います。これがデバイスIDです。デバイスIDは今後必要になってくるので、メモしておきましょう。
次に、温度が出力されるファイルの中身を確認をします。温度が正常に出力されているか確認してください。
(device_id)には、先ほどメモしたデバイスIDを入力して下さい。
$ cat /sys/bus/w1/devices/(device_id)/w1_slave
室温をグラフでモニタリング
これから、温度センサーが感知した値をGoogleChartを使ってブラウザ上に表示させ、モニタリングできるようにします。表示させるには、RaspberryPiにWebサーバの機能が必要になるため、ApacheとPHPをインストールします。
$ sudo apt-get install apache2 php
インストールが完了したら、温度データの取得・保存を行うプログラムを作成します。deviceIdを先ほど確認したデバイスIDの値に変更し、プログラムを作成して下さい。
(コードは、第18回「ラズベリーパイで手作り温度計!」からお借りしました。)
$ sudo vim /var/www/temperature.php
<?php
//deviceIdは、先ほど確認したデバイスIDの値を入力
$deviceId = 'deviceId';
$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;
時間を指定して温度を自動で感知する設定をします。今回は「1分単位」に観測するよう、crontabで設定します。
$ sudo crontab -e
* * * * * php /var/www/temperature.php
GoogleChartのサンプルソースを使用して以下のスクリプトを作成します。
$ sudo vim /var/www/html/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 formatter = new google.visualization.NumberFormat(
{fractionDigits: 3}
);
formatter.format(data, 1);
var chart = new google.charts.Line(document.getElementById('linechart_material'));
chart.draw(data, options);
}
</script>
</head>
<body>
<div id="linechart_material"></div>
</body>
</html>
スクリプトが正常に動作していれば、以下のURLより温度グラフが表示されます。
http://RaspberryPiのIPアドレス/index.php/
グラフが表示されていれば成功です。
室温27度以上でメールを送る仕組みをつくる
27度になった時のトリガーの仕組みさえできれば、後はそれを応用してLチカさせたり、メールを送ったりすることが可能です。
27度以上になったらLチカさせる
LEDランプの配線をします。(Lチカ&Lピカ編を参考)以下の配線図を参考にしてください。電源についてはせっかく前回の設定がありますので、「GPIO2」のピンにしてください。
続いて、27度でLEDランプがチカチカするシェルスクリプトを作成します。以下のプログラムを作成してください。前提条件として、Lチカ&Lピカ編を完了していて、「lchika.sh」が完成していることとします。
$ vim $HOME/work/temperature.sh
#!/bin/sh
today=$(date "+%Y%m%d")
ondo=`tail -n 1 /var/www/temperature/${today}.csv | cut -d , -f 2 | cut -b 1,2`
if [ $ondo -ge 26 ] ; then
. $HOME/work/lchika.sh
echo "温度は27以上です"
else
echo "温度は27以下です"
fi
それではさっそく作ったシェルを実行しましょう。成功すると、「温度は27以上です」または「温度は27以下です」とターミナルに表示されます。「温度は27以上です」と表示された場合は、Lチカもしますので確認しましょう。もし27度以下であれば、自分の手で温度センサーの周りを囲み手動で温度を上げてみてください。
以上で、27度以上になったらLチカさせる設定は終了です。
メール通知の設定を追加しよう
今回は「Mailgun」を使ってメール通知を行います。Mailgunは、APIベースのメール配信サービスです。無料でも機能限定で使用できます。Bashだけでなく、もPython、Ruby、PHPなど様々な言語で使うことができます。
まずは、Mailgunのアカウントを作成してください。アクセスして「Try Mailgun Now」をクリックして進めれば、簡単に登録ができます。
以下のようなプログラムがアカウント作成後に表示されますので、保存しておいて下さい。
例)
curl -s --user 'api:key-***********************************' \
https://api.mailgun.net/v3/sandboxsampledomain.mailgun.org/messages \
-F from='Excited User <mailgun@sandboxsampledomain.mailgun.org>' \
-F to=mymail@example.com \
-F subject='Hello' \
-F text='Testing some Mailgun awesomness!'
先ほどのcurlコマンドを、シェルとしてファイル化しておきます。メッセージも少し変えておきましょう。
$ vim $HOME/work/mail.sh
#!/bin/sh
curl -s --user 'api:key-***********************************' \
https://api.mailgun.net/v3/sandboxsampledomain.mailgun.org/messages \
-F from='Excited User <mailgun@sandboxsampledomain.mailgun.org>' \
-F to=mymail@example.com \
-F subject='暑すぎます' \
-F text='クーラーつけてよ〜(泣)'
「temperature.sh」を編集し、27度以上の時に「mail.sh」を実行するようにします。
$ vim $HOME/work/temperature.sh
#!/bin/sh
today=$(date "+%Y%m%d")
ondo=`tail -n 1 /var/www/temperature/${today}.csv | cut -d , -f 2 | cut -b 1,2`
if [ $ondo -ge 26 ] ; then
. $HOME/work/lchika.sh
echo "温度は27以上です"
. $HOME/work/mail.sh
else
echo "温度は27以下です"
fi
これで準備は完了です。温度センサーが27度以上の時に、temperature.shを実行してみましょう。LEDランプがピカピカとひかり、あなたのメールアドレスに検知メールが飛んだはずです。
温度センサーとmailgunで検知メールを送ろう編は以上です。お疲れ様でした♪