#contents *概要 [#e2e25820] 時計の文字盤に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では、意外に多くの方から、「これ欲しい」「売り出さないの?」といった声をかけて頂きました。ハードウェアは初心者レベルですが、実用的な物が作ることができました。