ネットワーク温度計 - ponkan


[グラフ] [はじめに] [ハードウェア] [ソフトウェア] [取り付け] [測定値の傾向]

ソフトウェア

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

前坂たけし<maesaka@ihas.nagoya-u.ac.jp>