ArduinoにXPortでIP持たせて、そこにPerlからデータをプッシュする。

s.h.log: XPortをEthernet-UARTコンバータとして使うの通りにXPortを設定する。

そこに、明日の天気のデータをLivedoorお天気のRSSからパースしてsocketで送ると、

socket通信をXPort越しにArduinoで受け取れるので、晴れ/曇り/雨でそれぞれLEDを光らせる「てるてる坊主」を作ろうというもの。

最初は今日の天気だったが、よく考えたら今日の天気は空見ればわかるから、Date::Simple使って明日の天気になった。

あと、送信データもstringではなくchar一文字でいいやという事になった。Arduinoには文字列比較系の関数が無いし、heepが無いマイコンに無理させる必要も無いし。

以下は暫定版のArduino&Perlコード。

physicalとwebに向いているのをそれぞれで分業させたので、結構短く書けて楽だった。

これでテンプレートができたので、GoogleCalendarから予定引っ張ってきて枕に振動モータ突っ込んで起こすとか1時間あれば作れる。



send-tomorrow-weather.pl

#合宿moduleワークショップ用「てるてる坊主」

#Livedoorお天気RSSから明日の東京の天気をparseし、

#Socketを使って”s”/”c”/”r”で晴れ/曇り/雨をXPortに送信する

#

#Perl5.8.4

#Date:2007/3/22

#Author:ShoHashimoto

#WebSite:http://shokai.org/

usestrict;

usewarnings;

useEncode;

useLWP::Simple;

useXML::RSS;

useIO::Socket;

useDate::Simple;

my$addr=shift;

my$port=shift;

my$url=”http://weather.livedoor.com/forecast/rss/13/63.xml”;

my$document=get($url)ordie”can’tgetcontentfrom$url¥n”;

my$rss=XML::RSS->new;

$rss->parse($document);

#明日の日付を取得

my($year,$month,$day)=Date::Simple->today->next->as_ymd;

my$sock=IO::Socket::INET->new(PeerAddr=>$addr,

PeerPort=>$port,

Proto=>’tcp’);

for(@{$rss->{items}}){

my$title=encode(‘utf8’,$_->{title});

if($title=~”$day日”){#明日で、東京の時

if($title=~”雨”){

$sock->send(“r”);

}

elsif($title=~”曇”){

$sock->send(“c”);

}

else{

$sock->send(“s”);

}

}

}

Arduino側

/***

合宿moduleワークショップ用「てるてる坊主」

Serialから”s”/”c”/”r”で晴れ/曇り/雨を受け取り、

対応するLED赤/白/青を光らせる



CPU:ATMEGA816MHz

Compiler:Arduino0007Alpha

Date:2007/3/22

Author:ShoHashimoto

WebSite:http://shokai.org/

***/

charled_pin=13;//LEDonArduinoboard

charled_s=1;//LEDforshiny

charled_c=2;//LEDforrainy

charled_r=3;//LEDforcloudy

charrecvData;//receiveddata

voidsetup()

{

Serial.begin(9600);

pinMode(led_pin,OUTPUT);//LEDmode

pinMode(led_s,OUTPUT);

pinMode(led_c,OUTPUT);

pinMode(led_r,OUTPUT);

digitalWrite(led_pin,HIGH);

}

voidloop()

{

while(Serial.available()){//whenreceivedataviaSerial

recvData=Serial.read();

digitalWrite(led_s,LOW);//initialize

digitalWrite(led_c,LOW);

digitalWrite(led_r,LOW);

switch(recvData){//parsedata

case’s’://shiny

digitalWrite(led_s,HIGH);

break;

case’c’://cloudy

digitalWrite(led_c,HIGH);

break;

case’r’://rainy

digitalWrite(led_r,HIGH);

break;

}

}

}