プログラムと電子工作の置き場、たまにコラム

日々のスニペットやMaker's系のプログラムを置いてきます。

Raspberry Piで計測したデータをEmailで送信する。

前回はフォトレジスタとADコンバーターを使ってRaspberry Piで部屋の明るさを計測しました。今回は取得したデータをある一定の条件の際に携帯電話に送信するお知らせ機能を追加したいと思います。

Raspberry Piシリアル通信

その前に前回出てきたコードを理解するにはシリアル通信の基礎知識が必要です。
SPIモジュール
上記のサイトで簡潔にまとめられているため、一度ご覧いただくとよいと思います。

require 'pi_piper'
loop do
  value = 0
  PiPiper::Spi.begin do |spi|
    raw = spi.write [0b01101000,0]
    value = ((raw[0]<<8) + raw[1]) & 0x03FF
  end
  puts value
  sleep(1)
end

先ほどのサイトの説明通り8ビット * 2の計16ビットの情報をMCP3002とRaspberry Piで交換しています。MCP3002から取得したデータを変数rawに代入。その後、ビットをシフトさせて必要な情報を取り出しvalueに代入してます。
基本的に商品のデータシートに説明書きがありますので事前に読んでみるとよいでしょう。これはMCP3002のデータシートの一部です。
f:id:yuriai0001:20140513212613j:plain
各ピンがどのような機能を持っているのかがわかります。
例えば、今回のコードで以下のデータを送っていますが、1bitは0、2bit目はスタートビットとして必ず1、SGL/DIFFビットでは1、次のビットでは今回はCH0を使っているので0,MSBFでは受け取るデータをMSBFにするため1としています。それ以降はDon't careのため0です。

 raw = spi.write [0b01101000,0]

f:id:yuriai0001:20140513212533j:plain

mcp3002データシート

条件を設定して測定した数値をメール送信する

Emailの送信にはActionMailerを使用します。
Ruby on Railsでは、標準になっているので、メールを受けるユーザーとして知らない間にあなたも必ず使ったことがあるというライブラリーです。今回は単体で使いましょう。
gemファイルを取得しましょう。
gem install actionmailer

クラスメソッドを通じて設定を行います。今回はGmailを使いました。
今回はただのテストということもありますし、セキュリティのことを考え新しくアカウントを作ります。

# -*- coding: utf-8 -*-
require 'pi_piper'
require 'action_mailer'

ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.smtp_settings = {
  address:   'smtp.gmail.com',
  port:      587,
  domain:    'smtp.gmail.com',
  user_name: 'gmailアカウント',
  password:  'gmailパスワード',
  authentication: 'plain',
}

class Pi_mailer < ActionMailer::Base
  def sendmail(body)
   mail(
      to:      '送信したいアドレス',
      from:    'gmailアドレス',
      subject: 'info from Raspberry Pi',
      body:    body.to_s
    )
  end
end

loop do
  value = 12
  PiPiper::Spi.begin do |spi|
    raw = spi.write [0b01101000,0]
   value = ((raw[0]<<8) + raw[1]) & 0x03FF
  end
  Pi_mailer.sendmail("部屋の明かりの値は#{value}です。").deliver
  sleep(60)
end

これでひとまず完成しました。ただ、このままだと60秒毎にメールが送られてきます。
Pi_mailer.sendmail().deliverの呼び出しに関して何らかの一定条件を加えたほうがよさそうです。

Rubyでの条件分岐の書き方がわからない場合、
条件分岐 - Ruby入門
このサイトをご覧いただくと良いです。

例えば、valueの値を比較し前回測定よりも300以上の上昇がある場合にはメールを出すという条件にしておけば、特に夜の場合は必ず何らかの明かりが点灯したと考えるのが妥当です。そこら辺の条件に付いては設置場所によっても違うのでご自身にあった設定を行ってください。このプログラムを稼働させておくと、誰かと一緒に暮らしている場合、何時に帰ってきたでしょ。なんてちょっと相手を驚かせることができるかもしれません。ただ、いたずらは程々にしましょう。信頼はRaspberry Piではプログラミングできません!

Raspberry Piで部屋の温度を取得

今回はセンサーにCDSを使いましたが、例えば、温度センサーや大気圧センサーを使いデータを取得することもできます。
では、次の章では比較的簡単で実用的な部屋の温度を取得してみましょう。
Raspberry Piで温度センサー。部屋の気温を取得しよう - Raspberry Pi 電子工作