cronで30ごとに動かすperl(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-11109-cron.pl mod 755 # crontab用のperl # 一部修正し、データを10回採り、平均することとした # 2010/11/28 → 2010/12/10 完成 # 2011/11/05 flora T5500用にディバイス名を変更 cuad0 → cuau0 # 2011/11/05 エラーが出る。数値の合計がうまくとれない??? # 2011/11/08 freebsdのバージョンが8になって、 # シリアルドライバーがsioからuartに変更になった。 # uartはカノニカルモード(canonical mode)になるようだ。 # 根本的な解決はわからないが、当面、非カノニカルモード # にすれば対応可能とのこと。 # open 文のあとにエコーバックをやめる次の一文を追加した。 # system( "stty -f /dev/cuau0 -echo" ) ; # 2011/11/09 完成 デバッグ用のいらない文を削除やコメントアウト # 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" ) ; # 2011/11/8 エコーバックをやめる #print "open serial port COM2 ok\n" ; # ######################### シリアルポート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> #$data2 =~s/\0\n//; # 後ろ\0\nを除去 print COM2 "3"; # アナログポート3 my $data3 = <COM2> #print "data3=" , $data3 ; # debug #$data3 =~s/\0\n//; # 後ろ\0\nを除去しない my $i; # カウンター用 my $data1 ; # 受信データの処理用 $data0 = 0 ; # ゼロクリアー $data2 = 0 ; # ゼロクリアー $data3 = 0 ; # ゼロクリアー for ($i = 1; $i <= 10; $i++) { ; # 10回データー計測し合計をとる ************************************* print COM2 "0\n"; # アナログポート0 $data1 = <COM2> #print "data1=" , $data1 ; $data1 =~s/\0\n//; # 後ろ\0\nを除去 $data0 = $data0 + $data1; print COM2 "2\n"; # アナログポート2 $data1 = <COM2> #print "data2=" , $data1 ; $data1 =~s/\0\n//; # 後ろ\0\nを除去 $data2 = $data2 + $data1; print COM2 "3\n"; # アナログポート3 $data1 = <COM2> #print "data3=" , $data1 ; $data1 =~s/\0\n//; # 後ろ\0\nを除去 $data3 = $data3 + $data1; } ; # 10回修了 $data0 = $data0 / 10 ; # 10回の平均を取る $data2 = $data2 / 10 ; # 10回の平均を取る $data3 = $data3 / 10 ; # 10回の平均を取る close COM2 ; # ########################### 時刻とデータの印字(ファイルへの出力) $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,"\n" ; close LOGFILE ; |