ようこそNICのホームページへ(なが〜い試運転中 from 2004年)
  • @nifty atnifty-ddns ddo.jp dip.jp   HP パソコン 健康 落語 海外 思うまま 電子工作

  • Last update:2018/04/21    Build:2018/04/21
  •  
    #!/usr/bin/perl -w  
    #               -w ワーニングを出す
    #           データロガーから読み取るプログラム
    #           湿度センサーを使った、温湿度データロガー(2010/11/13製作)
    #           ハード pic 12f683 rs232c
    #
    #           /home/datalgr/datalgr-htm-rs232c-180417.cgi mod 755 xs36v4用
    #           /home/datalgr/datalgr-htm-rs232c-151115.cgi mod 755 xs36v4用
    #           /home/datalgr/datalgr-htm-rs232c-111109.cgi mod 755
    #           2010/11/28 → 2010/12/08 完成
    #           2011/11/05  flora T5500用にディバイス名を変更 cuad0 → cuau0
    #           2011/11/09  ディバイスドライバー変更 sio  → uart に伴う
    #            非カノニカルモードに変更するシステムコマンド追加
    #            system( "stty -f /dev/cuau0  -echo" ) ; を追加
    #           2015/11/15  shuttle xs36v4 用に変更
    #            /dev/cuau0 ---> /dev/ttyS0
    #
    #           2018/04/17  センサー数の変更 温度センサー 2-->1 湿度センサー 1-->2
    #             ハードウェアもセンサーの付け替え必要
    #             10回計測の平均をとるように変更
    #
    
    use strict; # 宣言した変数以外を使えなくする
    
    $| = 1;   # ゼロ以外が代入されると出力をバッファリングしなくなる。
    
    my $file="/home/datalgr/log-data.txt";
    my $sec;
    my $min;
    my $hour;
    my $mday;
    my $mon;
    my $year;
    my $wday;
    my $yday;
    my $isdst;
    my $tt;
    my $null="";
    
    # 読み込み書き込みファイルオープン
    #                 読み取り 書き込み 追加 新規作成 上書き 
    #   <     filename ○         ×      ×     ×      × 
    #   <     filename ×         ○      ×     ○      ○ 
    #   >>    filename ×         ○      ○     ○      × 
    #   +<    filename ○         ○      ×     ×      × 
    #   +>    filename ○         ○      ×     ○      ○ 
    #   +>>   filename ○         ○      ○     ○      × 
    
    #open (COM2, "+</dev/cuad0") or die "ERROR /dev/cuad0 not open\n" ; # シリアルポートを入出力可能でオープン
    #open (COM2, "+</dev/cuau0") or die "ERROR /dev/cuau0 not open\n" ; # シリアルポートを入出力可能でオープン
    open  (COM2, "+</dev/ttyS0") or die "ERROR /dev/ttyS0 not open\n" ; # シリアルポートを入出力可能でオープンxs36v4用
    
    #system( "stty -f /dev/cuau0  -echo" ) ; # エコーバックしない(非カノニカルモード)
    system( "stty -F /dev/ttyS0  -echo" ) ; # エコーバックしない xs36v4用
    
    
    #  #########################  シリアルポートCOM2からデータを取得 ダミーです
    #
    print COM2 "0"; # アナログポート0
    my $data0 = <COM2>;
    
    #$data0 =~s/\0\n//;    # 後ろ\0\nを除去
    
    #print COM2 "1\n";  # アナログポート1 # Vrefに使用するためアナログポート使用不可(2010/11/28変更)
    #my $data1 = <COM2>;# Vrefに使用するためアナログポート使用不可(2010/11/28変更)
    #$data1 =~s/\0\n//; # 後ろ\0\nを除去  # Vrefに使用するためアナログポート使用不可(2010/11/28変更)
    
    print COM2 "2"; # アナログポート2
    my $data2 = <COM2>;
    
    print COM2 "3"; # アナログポート3
    my $data3 = <COM2>;
    
    my $i;    # カウンター用
    my $data1 ; # 受信データの処理用
    
    $data0 = 0 ;  # ゼロクリアー
    $data2 = 0 ;  # ゼロクリアー
    $data3 = 0 ;  # ゼロクリアー
    
    for ($i = 1; $i <= 10; $i++) {  ;  #   10回データー計測し合計をとる *************************
    
    print COM2 "0\n";   # アナログポート0
    $data1 = <COM2>;
    $data1 =~s/\0\n//;  # 後ろ\0\nを除去
    $data0 = $data0 + $data1;
    
    print COM2 "2\n";   # アナログポート2
    $data1 = <COM2>;
    $data1 =~s/\0\n//;  # 後ろ\0\nを除去
    $data2 = $data2 + $data1;
    
    print COM2 "3\n";   # アナログポート3
    $data1 = <COM2>;
    $data1 =~s/\0\n//;  # 後ろ\0\nを除去
    $data3 = $data3 + $data1;
    
    } ; # 10回修了
    
    $data0 = $data0 / 10 ;  # 10回の平均を取る
    $data2 = $data2 / 10 ;  # 10回の平均を取る
    $data3 = $data3 / 10 ;  # 10回の平均を取る
    
    close COM2 ;
    
    my $chs    =0 ;    # 湿度センサー1   (2010/11/28変更)
    my $chs_2  =0 ;    # 湿度センサー2      (2018/04/17 追加)
    my $lm35_1 =0 ;    # 温度センサー1   (2010/11/28変更)
    # my $lm35_2 =0 ;  # 温度センサー2   (2010/11/28変更)(2018/4/17削除)
    
    $chs    =$data0/1023*2.495/0.01/2 ;   # 湿度センサー1   (2010/11/28変更)
    $chs_2  =$data3/1023*2.495/0.01/2 ;   # 湿度センサー2      (2018/04/17 追加)
    $lm35_1 =$data2/1023*2.495/0.01/6 ;   # 温度センサー1   (2010/11/28変更)
    # $lm35_2 =$data3/1023*2.495/0.01/6 ; # 温度センサー2   (2010/11/28変更) 2018/4/17 削除
    # my $lm35_m =($lm35_1+$lm35_2)/2   ; # 温度センサーの平均 (2010/11/28変更) 2018/4/17 削除
    
    my $chsf     = round($chs, 1);      # 小数点以下1桁まで求める subroutine 使用
    my $chs_2f  = round($chs_2, 1);     # 小数点以下1桁まで求める subroutine 使用 (2018/04/17 追加)
    my $lm35_1f  = round($lm35_1 , 1);  # 小数点以下1桁まで求める subroutine 使用
    # my $lm35_2f  = round($lm35_2 , 1);# 小数点以下1桁まで求める subroutine 使用 2018/4/17 削除
    # my $lm35_mf  = round($lm35_m , 1);# 小数点以下1桁まで求める subroutine 使用 2018/4/17 削除
    
    # ########################### 時刻とデータの印字(ファイルへの出力)
    $tt=time();
    ($sec, $min, $hour, $mday, $mon, $year,
        $wday, $yday, $isdst) = localtime($tt);
    $year=$year+1900;
    $mon=$mon+1;
    
    # ファイルへの出力は使用しない
    #open (LOGFILE,">>$file") or die "ERROR output file not open$!\n" ; # 出力ファイルをオープン
    #print LOGFILE  $year,"/",$mon,"/",$mday,"   ",$hour,":",$min,":",$sec,"  ",$data0,$data2,$data3 ;
    
    #close LOGFILE ;
    
    # ########################### ここからHTML出力へ
    
    print "Content-type: text/html\n\n";
    print <<EOM;
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html lang="ja">;
    <head>;
    	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">;
    	<title>計測中の湿度と温度を表示</title>;
    </head>;
    <body>;
    
    計測中の湿度と温度<br><br>;
    計測データ 湿度1 湿度2 温度<br><br>;
    
    $year/$mon/$mday   $hour:$min:$sec  $data0  $data3  $data2 <br><br><br>;
    
    湿度と温度<br>;
    
    
    <table>;
    	<tr>;
    		<td>湿度センサー1(CHS-UGS)</td>;
    		<td>$chsf %RH</td>;
    	</tr>;
    	<tr>;
    		<td>湿度センサー2(CHS-UGS)</td>;
    		<td>$chs_2f %RH</td>;
    	</tr>;
    	<tr>;
    		<td>温度センサー(LM35DZ)</td>;
    		<td>$lm35_1f ℃</td>;
    	</tr>;
    </table>;
    
    <br><br><br>;
    <a href="/pic/keisoku-onsitsudo.html" target="MAIN">温度や湿度の呼び出し画面へ戻る</a><br><br>;
    
    </body>;
    </html>;
    
    EOM
    
    
    # ######################  sub routine  ######################
    # $num を四捨五入して小数点以下 $decimals桁にする
    
    sub round {
      my ($num, $decimals) = @_;
      my ($format, $magic);
      $format = '%.' . $decimals . 'f';
      $magic = ($num > 0) ? 0.5 : -0.5;
      sprintf($format, int(($num * (10 ** $decimals)) + $magic) /
                       (10 ** $decimals));
    }
    

    電子工作へ     HomePage     このページのトップ