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;//receiveddatavoidsetup()
{
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;
}
}
}