webから温湿度を読むcgi(2011/11/09)

Last update:2011/11/09    Build:2011/11/09

#!/usr/bin/perl -w  
#               -w ワーニングを出す
#           データロガーから読み取るプログラム
#           湿度センサーを使った、温湿度データロガー(2010/11/13製作)
#           /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" ) ; を追加
#
#
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" ; # シリアルポートを入出力可能でオープン

system( "stty -f /dev/cuau0  -echo" ) ; # エコーバックをやめる

#print "open serial port COM2 ok\n" ;



#  #########################  シリアルポートCOM1からデータを取得
#
print COM2 "0\n"; # アナログポート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\n"; # アナログポート2
my $data2 = <COM2>
$data2 =~s/\0\n//;    # 後ろ\0\nを除去

print COM2 "3\n"; # アナログポート3
my $data3 = <COM2>
$data3 =~s/\0\n//;    # 後ろ\0\nを除去

close COM2 ;

my $chs    =0 ;  # 湿度センサー   (2010/11/28変更)
my $lm35_1 =0 ;  # 温度センサー1 (2010/11/28変更)
my $lm35_2 =0 ;  # 温度センサー2 (2010/11/28変更)


$chs    =$data0/1023*2.495/0.01/2 ; # 湿度センサー   (2010/11/28変更)
$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変更)
my $lm35_m =($lm35_1+$lm35_2)/2   ; # 温度センサーの平均 (2010/11/28変更)

my $chsf     = round($chs, 1);      # 小数点以下1桁まで求める subroutine 使用
my $lm35_1f  = round($lm35_1 , 1);  # 小数点以下1桁まで求める subroutine 使用
my $lm35_2f  = round($lm35_2 , 1);  # 小数点以下1桁まで求める subroutine 使用
my $lm35_mf  = round($lm35_m , 1);  # 小数点以下1桁まで求める subroutine 使用





# ########################### 時刻とデータの印字(ファイルへの出力)
$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=Shift_JIS">
	<title>計測中の湿度と温度を表示</title>
</head>
<body>

計測中の湿度と温度<br><br>
計測データ<br><br>

$year/$mon/$mday   $hour:$min:$sec  $data0  $data2  $data3 <br><br><br>

湿度と温度<br>


<table>
	<tr>
		<td>湿度センサー(CHS-UGS)</td>
		<td>$chsf %RH</td>
	</tr>
	<tr>
		<td>温度センサー1(LM35DZ)</td>
		<td>$lm35_1f ℃</td>
	</tr>
	<tr>
		<td>温度センサー2(LM35DZ)</td>
		<td>$lm35_2f ℃</td>
	</tr>
	<tr>
		<td>温度センサー平均(LM35DZ)</td>
		<td>$lm35_mf ℃</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));
}