一応 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);
}
|