Raspberry PI がその日の天気を教えてくれる
はじめに
その日の天気をチェックし雨なら傘を持っていく、当たり前のことに聞こえますが、朝が弱くものぐさな人間には困難の多い作業です。
”調べる”のは面倒だけれども、”教えてくれる”なら聞いてやろう、ということで天気を調べてお知らせしてくれる仕組みをRaspberry PI に組み込みました。
いわゆるXFD(eXtreme Feedback Device)というものに近いのかもしれません。
大まかな流れ
指定の時刻になったら、天気予報をネットから取得し、結果をLED で通知します。これだけです。
LED を光らせるためには
Raspberry PI のGPIO にLEDを接続する必要があります。
天気の取得
以前紹介したWeather Hacks - livedoor 天気情報を利用します。
LED の接続
LEDはGPIO に接続します。GPIO は下の写真の剣山のようにピンが立っている部分です。
それぞれのピンごとに役割が違います。詳しくは以下のURLを参考にしてください。 RPi Low-level peripherals - eLinux.org
今回はGPIO 17, 27番に2色のLEDを接続しました。
LED はブレッドボードというものに差し込みます。 半田付けをせずにLED と抵抗、基盤を接続できる優れものです。
- 出版社/メーカー: スイッチサイエンス
- メディア: エレクトロニクス
- この商品を含むブログを見る
ブレッドボードと基盤を接続するにはジャンパワイヤが必要です。 Raspberry PI 基盤側にメスが必要で、ブレッドボード側にオスが必要なのでオス-メスの商品がよいでしょう。
- 出版社/メーカー: スイッチサイエンス
- メディア: エレクトロニクス
- 購入: 1人 クリック: 1回
- この商品を含むブログを見る
今回の天気表示では黄色と青のLEDを主に使います。いかにAmazonリンクを貼りますが、少し高いですね。秋葉原などが近ければ電子パーツ店の個売りを利用するのが良いでしょう。抵抗についても同様です。
- 出版社/メーカー: イーケイジャパン
- メディア: おもちゃ&ホビー
- この商品を含むブログを見る
- 出版社/メーカー: イーケイジャパン
- メディア: おもちゃ&ホビー
- この商品を含むブログを見る
抵抗は470Ωのものを使っています。秋葉原などでは1本5円で売っています。
【PLOVER】 カーボン抵抗 炭素皮膜抵抗 1/4W(0.25W) 許容差±5% オリジナルセット 1Ω?1MΩ 37種類 各20個(合計740個) PR-203
- 出版社/メーカー: PLOVER
- メディア: エレクトロニクス
- この商品を含むブログを見る
接続方法は以下の回路図のようにしました。基本的な接続順はGPIO->LED->抵抗->Ground となります。
今回、赤の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で制御する
- 出版社/メーカー: RS Components Ltd (ソースマーキング及び販売 Umemoto LLP)
- メディア: エレクトロニクス
- この商品を含むブログ (11件) を見る