#contents

時計の文字盤に12個のLEDを付けて、雨の降る時刻を教えてくれるシステムです。

- 1時間毎の天気予報データをxml形式でWEBから取得します。
- rubyでパースして、1時間毎に雨の予報かどうかを判定します。
- 雨の予報であれば、その時刻のLEDを点灯させます。

*外観 [#tde66cb0]
#ref(IMG_20140823_133109.jpg)
- 4時から6時に雨が降る予報を示しています

*回路図 [#x13394b1]
#ref(お天気時計回路図.PNG)
- シリアルパラレル変換ICである74HC595を2個使用して12個のLEDを制御しています

*プログラム [#program]
- cronで1時間に1度実行させます

 #!/usr/bin/ruby
 require 'rexml/document'
 require 'open-uri'
 require 'pi_piper'
 
 # 市町村コードで天気予報データを取得(21202:大垣市)
 url = "http://api.tenki.jp/api/blog/parts/point_clock/forecast_map_point_21202.xml"
 doc = REXML::Document.new(open(url))
 # 現在時刻の取得 JST(+9h)
 now = Time.now + 9*60*60
 
 # シリアルパラレル変換にGPIO 23,24,25pinを使用
 $pins = {
  :ser => PiPiper::Pin.new(:pin => 25, :direction => :out), # serial data
  :sck => PiPiper::Pin.new(:pin => 24, :direction => :out), # shift register clock
  :rck => PiPiper::Pin.new(:pin => 23, :direction => :out)  # latch clock
 }
 
 def shift(key)
  $pins[key.to_sym].on
  $pins[key.to_sym].off
 end
 
 def reset
  $pins.values.each{|pin| pin.off}
 end
 
 def send_bits(data)
  printf "0x%04x\n",data
  0.upto(15) do |byte|
    if ((1 << byte) & data) == 0
      $pins[:ser].off
    else
      $pins[:ser].on
    end
    shift(:sck)
  end
  shift(:rck)
 end
 
 puts now
 bits = 0
 for i in 1..11 do
  t = now + 60*60 * i
  str = t.strftime("%Y-%m-%d %H:00:00")
  id = doc.elements['//forecast[public_datetime="'+str+'"]/weather/id']
  h = t.hour % 12
  if id then
    wid = id.text.to_i
    print h, "\t", wid, "\n"
    # 強雨(3)または弱雨(4)ならLED点灯
    if (wid == 3 || wid == 4) then
      bits |= 1 << (15-h)
    end
  end
 end
 puts ""
 
 reset
 send_bits(bits)

- &ref(forecastclock.rb); ダウンロード用ファイル

*Ogaki Mini Maker Faire 2014 [#s96eca42]
- Ogaki Mini Maker Faire 2014に出展しました。

&ref(IMG_20141006_113532.JPG);
&ref(お天気時計.png,zoom,50%);

- Ogaki Mini Maker Faire 2014では、意外に多くの方から、「これ欲しい」「売り出さないの?」といった声をかけて頂きました。ハードウェアは初心者レベルですが、実用的な物が作ることができました。

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS