一応 PICNIC は http を喋ることができますが,AD変換の値を取って くるだけの処理に,tcp プロトコルを使用するのも馬鹿馬鹿しいので, udp プロトコルを使用します.コーディングは perl で行いました.
しかし,PICNIC のキットに付属のマニュアル (といっても怪しいコピーが2枚のみ)には,PICNIC を制御するためのプロトコル が記述されておらず,インターネットで調べてみると, 「トランジスタ技術」で一度特集されたらしいということが分かりました. で,図書館でトランジスタ技術のバックナンバーを調べ,ようやくプロトコル が分かった次第です.
まあ,こんな感じでしょうか? とりあえず,エラー処理は省略されています. 実際には,10秒以上応答が無ければ SIGALRM を発生させて,強制終了 するようにしています.
#!/usr/bin/perl # ネットワーク温度計 ponkan 読み出しツール # by msaka@dameningen.org use Socket; # ソケットモジュールを使います &Main(); exit(0); # メインルーチン sub Main{ # 表示 printf "Temperature = %.1f\n", &QueryPonkan(); } # 問い合わせサブルーチン sub QueryPonkan{ my $hostname = 'ponkan'; # ネットワーク温度計のDNS名 my $udpport = 10001; # UDP 接続ポート番号 my $protocol = getprotobyname( 'udp' ); # UDP を使います # ソケットを作成します socket( SOCK, PF_INET, SOCK_DGRAM, $proto ); # ソケットアドレスを取得します my $sockaddr = sockaddr_in( $udpport, inet_aton( $hostname ) ); # バッファリングしない select(SOCK); $|=1; select(STDOUT); # アナログI/Fの1番目のchをAD変換するコマンド my @data = ( 0x04, 0x81, 0x00 ) ; # unsigned char に変換 my $str = pack( 'C*', @data ); # 送信 send( SOCK, $str, 0, $sockaddr ); # 受信 recv( SOCK, $str, 100, 0 ); # 配列へアンパック,AD変換値(0-1023)取得 @data = unpack( 'C*', $str ); my $ad = $data[4]*256 + $data[5]; # 気温に変換し,値を戻す. return( &volt2temp( $ad ) ); } # AD変換値を気温に変換する関数 sub vold2temp{ my( $ad ) = @_; my $temp = ..... ; return($temp); } |