読者です 読者をやめる 読者になる 読者になる

Raspberry PI がその日の天気を教えてくれる

photo by cindy47452

はじめに

その日の天気をチェックし雨なら傘を持っていく、当たり前のことに聞こえますが、朝が弱くものぐさな人間には困難の多い作業です。

”調べる”のは面倒だけれども、”教えてくれる”なら聞いてやろう、ということで天気を調べてお知らせしてくれる仕組みをRaspberry PI に組み込みました。

いわゆるXFD(eXtreme Feedback Device)というものに近いのかもしれません。

今回のソースコードGithubで公開しています。

大まかな流れ

指定の時刻になったら、天気予報をネットから取得し、結果をLED で通知します。これだけです。

LED を光らせるためには

Raspberry PI のGPIO にLEDを接続する必要があります。

天気の取得

以前紹介したWeather Hacks - livedoor 天気情報を利用します。

LED の接続

LEDはGPIO に接続します。GPIO は下の写真の剣山のようにピンが立っている部分です。

f:id:zonomasa:20140321074538j:plain

それぞれのピンごとに役割が違います。詳しくは以下のURLを参考にしてください。 RPi Low-level peripherals - eLinux.org

今回はGPIO 17, 27番に2色のLEDを接続しました。

LED はブレッドボードというものに差し込みます。 半田付けをせずにLED と抵抗、基盤を接続できる優れものです。

普通のブレッドボード

普通のブレッドボード

ブレッドボードと基盤を接続するにはジャンパワイヤが必要です。 Raspberry PI 基盤側にメスが必要で、ブレッドボード側にオスが必要なのでオス-メスの商品がよいでしょう。

ジャンパワイヤ(オス?メス) 10本セット

ジャンパワイヤ(オス?メス) 10本セット

今回の天気表示では黄色と青のLEDを主に使います。いかにAmazonリンクを貼りますが、少し高いですね。秋葉原などが近ければ電子パーツ店の個売りを利用するのが良いでしょう。抵抗についても同様です。

NO.15 高輝度LED(青色・3mm)

NO.15 高輝度LED(青色・3mm)

NO.16 高輝度LED(黄色・3mm)

NO.16 高輝度LED(黄色・3mm)

抵抗は470Ωのものを使っています。秋葉原などでは1本5円で売っています。

接続方法は以下の回路図のようにしました。基本的な接続順はGPIO->LED->抵抗->Ground となります。

f:id:zonomasa:20140321082438p:plain

今回、赤のLEDは使っていません。

LED の点滅

LEDはコマンドラインから次のような流れで明滅させることができます。

# 27 番に接続したLEDの点滅 
$ sudo su
$ echo 27 > /sys/class/gpio/export
$ echo out > /sys/class/gpio/gpio27/direction
$ echo 1 > /sys/class/gpio/gpio27/value
$ echo 0 > /sys/class/gpio/gpio27/value
$ echo 27 > /sys/class/gpio/unexport

今回はRuby で制御をしたいので上記作業を抽象化したモジュールを書きました。

# -*- coding: utf-8 -*-

module LED
  private
  def self.led_open(no)
    begin
      exp = open("/sys/class/gpio/export", "w")
      exp.write(no)
      exp.close
    rescue => err
      puts err
    end
  end

  def self.led_close(no)
    uexp = open("/sys/class/gpio/unexport", "w")
    uexp.write(no)
    uexp.close
  end

  def self.led_out(no)
    dir = open("/sys/class/gpio/gpio#{no}/direction", "w")
    dir.write("out")
    dir.close
  end

  public
  def blink10(no)
    led_open(no)
    led_out(no)
    out = 1
    10.times do
      val = open("/sys/class/gpio/gpio#{no}/value", "w")
      val.write(out)
      val.close
      out = out == 1 ? 0 : 1
      sleep 0.2
    end
    led_close(no)
  end

  def on(no)
    led_open(no)
    led_out(no)
    val = open("/sys/class/gpio/gpio#{no}/value", "w")
    val.write(1)
    val.close
    led_close(no)
  end

  def off(no)
    led_open(no)
    led_out(no)
    val = open("/sys/class/gpio/gpio#{no}/value", "w")
    val.write(0)
    val.close
    led_close(no)
  end
  module_function :on, :off, :blink10
end

このファイルをrequire して、以下のようにすれば希望のGPIO番号のLEDにたいしてON、OFF、点滅(10秒)を指示できます。

require 'pi_led'

LED.on(17) # 17番を点灯
LED.off17) # 17番を消灯
LED.blink10(17) # 17番を10秒間点滅

天気予報を表示する

ここまでの仕組みを使って最終的に以下のコードで天気予報を実現しました。

# -*- coding: utf-8 -*-

$:.unshift File.dirname(__FILE__)  # ロードパスにカレントディレクトリを追加

require 'json'
require 'pi_led'

LED.off(17)
LED.off(27)

LED.blink(17)
LED.blink(27)

# 今日の天気を取得 130010は地域コード
# 地域コード変更の場合は http://weather.livedoor.com/forecast/rss/primary_area.xml
tenki = JSON.parse!(`curl http://weather.livedoor.com/forecast/webservice/json/v1?city=130010`)["forecasts"][0]["telop"]

if // =~ tenki.to_s
  LED.on(17)  # 雨の場合は青いLEDを光らせる
else
  LED.on(27)  # 雨が降らない場合は黄色いLEDを光らせる
end

これにより雨で傘が必要なときは青いLEDが光り、傘が不要なときは黄色いLEDが光ります。

まとめ

Raspberry PIを用いて天気予報を行う仕組みを作成しました。 具体的にはその日の天気予報を取得し、傘が必要か否かをLEDの色で表示してくれるというものです。

朝起きて目に付く場所にRaspberry PIをおくことで、傘の忘れ物を防ぐことができるでしょう。

学べた技術要素としては以下の3点です。 ・LED を光らせるための電気的な知識(抵抗、電圧) ・Raspberry PI のGPIOにLEDを接続する ・Raspberry PI のGPIOをRubyで制御する

Raspberry Pi Type B 512MB

Raspberry Pi Type B 512MB

参考にしたURL

コチョナナバ: Raspberry PiとRubyでLEDをチカチカさせる