さて、シリアルモニタに温度を表示させるだけではつまらないので、現在動いている自宅サーバにログを取って、その結果をweb上からグラフにして表示させてみることにします。
Kenji.Yさんが構築された素晴らしいシステムには遠く及びませんが、とにかく頑張りましょう。Ethernetシールドを使用してHTTP Getメソッドでサーバにデータをcsv形式で記録し、それを基にグラフ作成です。グラフの描写はhighstockで行うことにしました。
サーバ側のコードはphpで書きました。これは、Mapo堂さんの記事を参考にさせていただきました、ありがとうございます。現在私のところのPHPは Version 5.3です。
tempera_log.php
[PHP]
[/PHP]
動作確認のためにブラウザから
http://サーバアドレス/パス/tempera_log.php?tempera=1234.5
などとアドレス欄に入力してtempera_log.csvが作成され、数値が記録されるか確かめます。私の場合データの投稿はLAN内からのアクセスですので、外部からこのファイルにアクセスできないようにアクセス制限を掛けておきました。もし将来仮に、インターネット側からデータを送らなければいけないときは、安全性を考慮して別の手立てをしなければならないでしょう。
ログファイルの置かれているディレクトリはwebサーバを動かしているユーザーから書き込む事ができるようにアクセス権を設定します。私はいつもこのことで失敗してしまいます。(学習能力がまるで無い)
続いて、先日作成したRx_data.inoにwebサーバアクセス用のコードを付け加えます。 Arduino 1.0 の Examplesにあるwebclientスケッチを元に作成しました。
Rx_data_log.ino ( Rx_log_data.zip )
Rx_data.ino スケッチの冒頭に追加します
[C]
#include
// Ethernet configration
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //ほとんどの場合macアドレスはこのままで大丈夫です
byte ip[] = { 192, 168, 1, 201 }; //イーサネットシールドのIPアドレス:LAN環境に合わせて設定変更が必要です
byte gateway[] = { 192,168,1,1 }; //デフォルトゲートウエイアドレス: 同上
byte subnet[] = { 255, 255, 255, 0 }; //サブネットマスク: 同上
IPAddress Logging_server(192,168,1,100); //logを記録するwebサーバのIPアドレス
EthernetClient client; // イーサーネットクライアントライブラリ をイニシャライズ
[/C]
void loop(void)内の最後に追加します
[C]
// start the Ethernet connection:
Ethernet.begin(mac, ip ,subnet,gateway ); //subnet,gatewayの順番はArduino1.0のためのものです(バグ?)
delay(1000); // イニシャライズの為のディレイです
if (client.connect(Logging_server, 80)) {
Serial.println(“connected to Logging server”);
client.print(“GET /cgi-bin/tempera_log.php?tempera=”); // /cgi-bin/tempera_log.phpへ HTTP GETリクエストです:
client.print( got_data);
client.println(” HTTP/1.0″);
client.println();
}
else {
Serial.println(“Logging server connection failed”);
}
client.stop();
[/C]
さて最後に一番手こずったのがグラフ描写です。今回試したhighstockは以前使ったRRDtoolsとは違いJavaScriptで書かれていて、クライアント側でグラフを描くものです。
Highsoft社が開発元で、個人利用であればフリーで使うことができます。また、姉妹版のhighchartsというライブラリもあって、豊富な種類かつ表現豊かなグラフを描くことができます。highstockは時系列のデータに対して相性が良いようです。
こちらからライブラリをダウンロードして適切なディレクトリに解凍して設置します。
ドキュメントを参考にしてプログラムを組んだのですが、CSVファイルの取り込みがどうしてもうまくいかなくて苦労しました。サポートフォーラムの中を必死に探してようやく動かすことができました。でも、ひょっとすると、もっと根本的な恥ずかしい間違いを犯しているかもしれません。
このソフトに関しては日本語の資料があまりなく、へっぽこメモさんのwebに助けていただきました。ありがとうございます。
highstock.jsとtempera_log.csvのファイルのパスに注意します。文字コードセットをUTF8で保存します。
temperature.html
var chart1; // globally available $(document).ready(function() {
$.get('tempera_log.csv', function(data) { // Split the lines var lines = data.split('\n'); var mydata = [];
// Iterate over the lines and add categories or series $.each(lines, function(lineNo, line) { var items = line.split(','); if(parseInt(items[0],10)) mydata.push([parseInt(items[0])*1000+32400000,parseFloat(items[1])]); });
var options = {
chart: { renderTo: 'container' , zoomType: 'x' }, xAxis: { type: 'datetime', range: 12*3600 * 1000 // 12 hour
},
yAxis: { title: { text: '気温 (°C)' } },
series:[ { data: mydata, // data: [[1330064589000, 29.9],[1330064609000, 71.5],[1330064629000, 106.4],[1330064649000, 129.2],[1330064669000, 144.0],[1330064689000, 176.0]], name: '室温', tooltip: { valueDecimals: 1, valueSuffix: '°C' } } ] }; var chart1 = new Highcharts.StockChart(options); // var chart1 = new Highcharts.Chart(options); });
});
こちらにグラフサンプル
いえいえ、管理人さんのデザインの方がセキュリティも考慮されていて、完成度が高いです。。。。
highstock、よさそうですね。表示幅まで指定できるので、こちらほうがいいかもしれません。dygraphsから乗り換えようかな。
Kenji.Yさんこんにちは。お褒めの言葉ありがとうございます。
先日見せて頂いたdygraphsのグラフがとても良かったので刺激になりました。
心配なのはhighstockでデータの数が多くなった時ちゃんと表示できるかどうかです。
(こちらに表示しているデータは20秒毎に記録した温度データでして、個数が12373 , 大きさが209Kbyteです)
5分間隔でデータを取ったとしても、一日で288個、1年で105,120個になってしまいます。
時系列データの保存はいつも問題ですね。やはり、決められた期間になった過去データは、平均なんらかの方法で、データを圧縮していくしかないです。
highstockのように詳細期間のズームアップ機能がある場合、可能であるなら、それを動的にアクセスできるような仕組みがサーバー側に必要になってくると思います。その場合は、単純にCSVファイルでアクセスというわけにはいかなくて、ミドルウェア、もしくは簡単なDB、本格的にいくなら時系列データ専用DBを構築していくしかないですね。
簡単にWebサーバーに設置できる方法がないか、私も考えてみます。
Kenji.Yさんこんにちは。やはりそうですか、今回経験してみて初めてデータの量にびっくりしました。 普段は考えもしませんでしたが、いろいろな技術が必要なのですね。 勉強になりました。