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