Fri 11/28, 2008

Weather Ticker [Electronics ]

Weather Tickerインターフェース誌 ColdFire 基板特集(22)
- コンテスト一次審査不通過記念その2

Weather Ticker はインターネットで天気予報情報を取得して表示するガジェット。SilentC プログラムの HTTP クライアントで情報を取得し、ユーザドライバで LCD に表示する。RSS 情報の加工は SilentC には荷が重いため、自宅サーバ内にゲートウェイとなる CGI プログラムを用意している。

まずは 11/1 のエントリで紹介したブレッドボードでの回路図。でもって、SilentC から動作させるためのユーザドライバのプロジェクトアーカイブ。

回路図(bitmap)
LCDUserDriver.zip

LCD 表示についてはエレキジャックの記事「HCS08マイコンにLCDモジュールをつなぐ」と同様。ProcessorExpert でテストプログラムを書き、BDM で動作確認した後でユーザドライバに変換した。

以下がユーザドライバの関数仕様。

  • UserDriver(0) - LCD_Init
    IO ポートと LCD モジュールの初期化。負電圧発生用 PWM 発振(100KHz)
  • UserDriver(1, unsigned char *p) - LCD_L1Out
    LCD の 1 行目に引数 p で渡される文字列を表示する。 表示可能桁である 16 を超えた分は無視し、不足する場合には空白で埋める。
  • UserDriver(2, unsigned char *p) - LCD_L2Out
    LCD の 2 行目に引数 p で渡される文字列を表示する。 他は LCD_L1Out と同じ。
  • UserDriver(3) - LCD_Test
    初期化(LCD_Init)をおこない、LCD に "CQ-FRK-MCF52233/Hello, World!" と表示する。LCD 動作確認用。

とりあえず SilentC のコンソールから UserDriver(3) として呼び出せばテスト文字列が表示される。

インターネットの天気予報 RSS フィードを取得してティッカー風に表示させるための SilentC プログラムと Web server 用の CGI がこちら。

SilentC.zip

  • htc - SilentC プログラム。htc::main で起動するが、main 中の URL 情報は適宜変更すること。
  • wr.cgi - RSS 取得、整形用の Perl による CGI プログラム。
  • UserDriver.bin - LCD 用ユーザドライバ

http://rss.weather.com/ のサービスを利用したが、第三者向けに変換結果を提供するのは規約に抵触するかもしれない。日本語サービスの場合には LCD で表示できないため、Text::Kakasi などを用いて半角カナに変換すれば良いのだが、「曇」が「ドン」とかになってしまうのはご愛嬌だ。Livedoor のサービスを使って日本語表示をできるようにしたのが下記の CGI プログラム。半角カナにする場合は sw パラメータを付ける(sw=1 でカナ、デフォルトは 0)。また、n パラメータで地域を指定できる(n=4 で札幌。これがデフォルト)。

#!/usr/bin/perl

# Weather Report RSS Gateway for CQ-FRQ-MCF52233
# 2008.11 by masato

use Encode;
use LWP::Simple;
use XML::RSS;
use CGI qw/:standard/;
use Text::Kakasi;

my $q = new CGI;
my $sj = find_encoding('cp932');

# 4:sapporo
my $sw = $q->param('sw');
my $n = $q->param('n') || 4;
my $url = sprintf('http://weather.livedoor.com/forecast/rss/1b/%d.xml', $n);
my $data_from_web = get($url);

my $rss = new XML::RSS;
$rss->parse($data_from_web);

my $channel = $rss->{'channel'};

print $q->header(-type => 'text/plain', -charset=>'shift_jis');

$kks = Text::Kakasi->new('-sjis', '-Jk', '-Hk', '-Kk', '-Ea');

my $i = 0;
foreach my $item ( @{$rss->{'items'}} ) {
  $i++;
  next if $i == 1;
  my $s = $item->{'title'};
  my $ss = $item->{'description'};
  if (defined($sw) and $sw) {
    print $kks->get($sj->encode($s))."\n";
    print $kks->get($sj->encode($ss))."\n\n";
  } else {
    print $sj->encode($s)."\n";
    print $sj->encode($ss)."\n\n";
  }
}

Posted by masato at 09:00 PM
このエントリーのトラックバックURL: http://bird.dip.jp/cgi-bin/mt/mt-tb.cgi/1650
コメント

うーん、なんででしょうね。
2つとも通過しないなんて考えられない。どちらも良い作品なのに。

と言うかmasatoさんと遭えるチャンスかと思っていたのに。

Posted by: せくすぃ部長 at 11/28, 2008 10:51 PM

hamayan さんにそう言っていただけて光栄です。
きっと同じようなネタでもっと良い作品があったのでしょう。
自分でも今ひとつ練り切れていないと感じてます。

Posted by: masato at 11/28, 2008 11:01 PM
コメントする

おそらく携帯電話等からは投稿できません。日本語文字列を含まないコメントやトラックバック、および当サイトへの言及を含まないトラックバックは御遠慮いただいております。また、90日以上経過した記事へのコメントはできません。










名前、アドレスを登録しますか?