LoginSignup
7
10

More than 3 years have passed since last update.

レッツラズパイ!〜温度センサーとmailgunで検知メールを送ろう編〜

Last updated at Posted at 2017-11-15

レッツラズパイ!・プロジェクト

  1. レッツラズパイ!〜Raspberry3にOSをインストールしよう〜
    【番外編】レッツラズパイ!〜"ディスプレイなしで"RaspberryPiにOSをインストールしよう編〜
  2. レッツラズパイ!〜Lチカ&Lピカをマスターしよう編〜
  3. レッツラズパイ!〜Webカメラで監視しちゃうゾ編〜
  4. レッツラズパイ!〜温度センサーで検知メールを送ろう編〜
  5. レッツラズパイ!〜Google HomeでLピカさせよう編〜
  6. レッツラズパイ!〜Google Homeに室温を教えてもらおう編〜
  7. レッツラズパイ!〜Lチカボタン編〜

RaspberryPiを始めて触る&IT初心者向けのドキュメントです。私の所属する会社で使う、IT初心者の方のインターンシップ向けのドキュメントとして書きはじめたので、かなり丁寧に書いていますがご了承下さい。

参考

温度センサーとmailgunで検知メールを送ろう

仕様と構成図

  • 温度センサーを取り付け、現在の温度をモニタリングできるようにする
  • 温度センサが27度以上を計測した時、スマホに「冷房つけろ」メールを飛ぶようにする
  • メールを飛ばす仕組みはmaigunを利用する
    • APIライクにメールを配信できるサービス
  • せっかくなのでLチカもさせて危機感を演出する

kousei2.png

必要なモノ

  • ブレッドボード×1個
  • 温度センサ (DS18B20)×1個
  • 抵抗器×2個
  • ジャンパーワイヤー(オス-メス)×5本
  • LED×1個

温度センサーで室温をモニタリングする

温度センサーの設定

まずは、温度センサーを配線していきます。下図を参考に、RaspberryPiとブレッドボードに配線していきましょう。温度センサーはGPIO4でしか使えないっぽいので、そこに配線するようにします。

:warning:温度センサーは配線を間違えると大変高温になります。やけどするので気をつけて下さい。

配線2_aa.jpg

製品 接続するブレッドボードの場所 接続するラズパイの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を押します。その後再起動を求められるので再起動をします。

IMG_3340.jpg

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のサンプルソースを使用して以下のスクリプトを作成します。

index.php
$ 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」のピンにしてください。

配線2_bb.jpg

続いて、27度でLEDランプがチカチカするシェルスクリプトを作成します。以下のプログラムを作成してください。前提条件として、Lチカ&Lピカ編を完了していて、「lchika.sh」が完成していることとします。

temperature.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」を実行するようにします。

temperature.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で検知メールを送ろう編は以上です。お疲れ様でした♪

7
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
10