#!/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)); }