Main

32
小型アグリセンサによる農地モニタリングシステムの開発 23 2 ,

description

 

Transcript of Main

Page 1: Main

小型アグリセンサによる農地モニタリングシステムの開発

平成 23年 2月

菅埜,諒介

鶴岡工業高等専門学校

電気電子工学科

Page 2: Main

目 次

第 1章 序論 3

1.1 背景と目的 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

1.2 研究概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

第 2章 ICT農業 5

2.1 ICT農業のメリット . . . . . . . . . . . . . . . . . . . . . . . . . 5

2.2 農業支援システム . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

2.3 モニタリングシステム . . . . . . . . . . . . . . . . . . . . . . . . 7

第 3章 アグリサーバ 8

3.1 アグリサーバの仕様 . . . . . . . . . . . . . . . . . . . . . . . . . 8

3.2 ハイブリッド発電システム . . . . . . . . . . . . . . . . . . . . . . 9

3.3 アグリWebサイト . . . . . . . . . . . . . . . . . . . . . . . . . . 10

3.4 アグリサーバの問題点 . . . . . . . . . . . . . . . . . . . . . . . . 11

第 4章 アグリセンサ 12

4.1 アグリセンサモニタリングシステム . . . . . . . . . . . . . . . . . 12

4.2 ハードウェア . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

4.3 ソフトウェア . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

第 5章 測定 17

5.1 測定結果 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

5.2 アグリセンサの問題点と今後の課題 . . . . . . . . . . . . . . . . . 18

1

Page 3: Main

第 6章 結論 19

参考文献 20

付録 21

2

Page 4: Main

第1章 序論

1.1 背景と目的

近年,農業を取り巻く環境は著しく変化している.農業人口の減少,高齢化や

産地偽装問題など農業が抱える課題は多々ある.それらの課題を解決する方法と

して ICT(InformationandCommunicationTechnology)を活用する研究が進めら

れている.農地の気象,土壌データを解析することにより作物の生育状態を把握

し,作業指示を行う“農業支援システム”の開発などである.これにより,農業

を産業として効率的に行う“営農”という考えが生まれてきた.その考えに基づ

き,ICT農業や農業グリッドと名付けられ研究が進められている.

図 1.1: ICT農業

3

Page 5: Main

1.2 研究概要

本研究で製作したアグリセンサとは,気象データ(気温,雨量など)を測定し,

サーバに送信する機器である.従来の機器では,種々のセンサや無線 LANなど

を搭載するため高価,大型になった.また,屋外の農地に設置するため電源のリ

ソースが制限される上に,消費電力が大きいため大がかりな発電システムも要し

た.今後,普及するためには安価,小型,省電力が必要条件となる.

 本研究では安価,小型,省電力なモニタリングシステムの構築を行った.

4

Page 6: Main

第2章 ICT農業

2.1 ICT農業のメリット

農業の ICT化を行うことは農業従事者,消費者の双方にとってメリットがある.

 消費者は,今自分が手に取っている食品は,“どこで,誰が,どのように生産,

加工されたのか“という情報は知ることができない.そういった情報を消費者に

提供することで安全性をアピールできる.これは,食品にもトレーサビリティと

いう概念が生まれつつあることを示唆している.さらにブランドとして他の品種

との差別化が図れる.それによる付加価値が市場や地域を活性化することにつな

がることが期待されている.

 農家の熟練や技術は伝承するのが非常に困難である.高齢化が進みさらに農業

人口が減少すれば,優れた技術が失われることになる.気象データと対応した作

業データがあれば,その因果関係により最適な作業指示が行えるとされている.

それにより困難とされていた技術の伝承が行える.

5

Page 7: Main

2.2 農業支援システム

農業支援システムは,農地に設置されたセンサから気象データを入力とし,デー

タベース化,表示を行うことで,作物の生育状態を分析,把握し今後の予測に基

づき作業指示を与えるものである.例を挙げると,稲の収穫時期は葉の色づきに

よって判断している.それらを定量的なデータに基づいて行うことができれば,

作業指示の自動化,しいては農業技術の伝承など様々なことが可能になるとされ

てる.

 特に農業支援システムのデータ取得,蓄積,閲覧を担う部分をモニタリングシ

ステムと呼んでいる.

図 2.1: 農業支援システム

6

Page 8: Main

2.3 モニタリングシステム

モニタリングシステムは一般的に農地に設置されたセンサが無線 LANを介し

て農家のネットワーク環境によりサーバにデータを蓄え,外部から閲覧するもの

である.

 モニタリングシステムには気象データなどを測定する機器が必要である.農場

に設置されたサーバ機能を有するセンサネットワークはフィールドサーバ,フィー

ルドセンサなどと名付けられ,実用化に向けて盛んに研究が進められているが,

設置面積や消費電力に課題がある.

図 2.2: モニタリングシステム

7

Page 9: Main

第3章 アグリサーバ

3.1 アグリサーバの仕様

本研究室ではアグリサーバと名付けたセンサを実際に設置した.アグリサーバ

は櫛引町の澤川さんの水田とさくらんぼ畑,伊藤さんのなし園とぶどう畑に計 4

台設置されている.アグリサーバはハイブリッド発電システムより電力を供給さ

れる.15分おきに各種気象,土壌データを無線 LANを通じて送信する.消費電

力の問題から夜間の動作は停止している.

仕様

風向,風速計,カメラ,気温,湿度計,照度計,雨量計,土壌水分計

無線 LAN

図 3.1: アグリサーバ外観

8

Page 10: Main

3.2 ハイブリッド発電システム

実際に設置される農地では,アグリサーバを駆動する電源がない.よって太陽

光や風力といった,自然エネルギーによる発電システムが必要である.ハイブリッ

ドコントローラにより高効率でバッテリに充電を行うことができる.風力発電機,

太陽電池モジュールの電力は日照時間やハイブリッドコントローラの効率など多

くのパラメータにより算出した値である.バッテリ容量は 3日間充電できなくと

も動作する容量としている.

仕様

風力発電機(50W)

太陽電池モジュール(125W,50W)

鉛蓄電池(200Ah)

ハイブリッドコントローラ

図 3.2: ハイブリッド発電システム

9

Page 11: Main

3.3 アグリWebサイト

アグリサーバから送られたデータは“産直あぐり”を通じて本校のサーバへ送ら

れる.当初は”産直あぐり”のネットワーク環境を通して送信していたが,ネット

ワークの負荷などの問題から,現在はFOMAの通信端末を使用している.FOMA

端末も帯域に制限があり問題となっている.送られた気象データはRubyスクリ

プトによりデータベース化され.PHPスクリプトで表示を行っている.プログ

ラムに関しては三重大学の亀岡教授からいただいたものを使用している.ホーム

ページは現在,関係者のみに公開している.

図 3.3: アグリWebサイト

10

Page 12: Main

3.4 アグリサーバの問題点

今回,実際に設置してみた結果,さまざまな問題点が浮上した.

問題点

・大型であること

・システムが高価であること(約十~百万円)

・消費電力が大きいこと(20W)

 大型であれば農作業の邪魔になる.設置コストは農家が負担しなければならず,

複数台でシステムを構築するため 1台あたりのコストを下げる必要がある.消費

電力に比例した発電システムが必要となるので消費電力を抑えることが小型化,

低コスト化の重要な点だと考える.以上の問題により“小型・安価・低消費電力

なアグリセンサ”の開発が必要となった.また,寒冷地での動作が初めてであり,

その影響についても検討していかなければならない.農業支援システムの実現お

よび消費者に情報公開するシステムを目標にしているが,現在はデータを表示す

るにとどまっている.今後,公開に向けた改良が必要である.また,安定動作し

継続的にデータ収集できる信頼性が最も重要である.

11

Page 13: Main

第4章 アグリセンサ

4.1 アグリセンサモニタリングシステム

ネットワーク構成を図 2に示す.アグリセンサは各気象パラメータをセンサで

測定する.測定したデータをXBeeを用いて親機に無線送信する.親機はネット

ワークに接続する基板(Ethernetシールド)を介して,研究室内のサーバにデー

タを送信する.サーバは送られたデータを PHPスクリプトによりテキストファ

イルに保存する.この処理を 15分ごとに行う.サーバのデータはWebブラウザ

からアクセスすることで閲覧できる.テキストデータとしてだけでなくグラフ表

示も可能である.グラフ表示はGoogleのサービスを用いることにより利便性を

高めている.

図 4.1: アグリセンサモニタリングシステム

12

Page 14: Main

4.2 ハードウェア

製作したアグリセンサの外観写真を図に示す.マイコンボードにはArduinoを

用いた.無線モジュールには XBee(DigiInternational製)を用いた.プログラ

ム上で個別の IDを振ることで ID別にデータを取得できる.太陽光発電システム

を内蔵することで小型化を行った.太陽電池モジュールで発電した電力を,ソー

ラー充電コントローラによって鉛蓄電池に充電を行う.

Arduino,XBee RFモジュール

風向,風速,雨量,気温,湿度

太陽電池モジュール 12V170mA,鉛蓄電池 12V5Ah,ソーラー充電コントローラ

図 4.2: アグリセンサ外観

13

Page 15: Main

Arduinoとは,単純な入出力を備えた基板と Processing/Wiring言語を実装し

た開発環境から構成されるシステム全体を指す.AtmelAVRマイクロコントロー

ラが実装されているマイコンボードはオープンソースハードウェアにつき,設計

情報のEAGLEファイルはArduinoのwebサイトにて無料で公開されている.ま

た統合開発環境のソースコードと基板上のライブラリも公開されている.

 Arduinoの特徴として以下の点が挙げられる。

・安価で入手性がよい

・シールドと呼ばれる基板でハードウェアの追加が容易である

・多くのライブラリが公開されている

以上より,誰でも開発できるプラットフォームであるといえる.

図 4.3: Arduino

14

Page 16: Main

XBeeとは,DigiInternational製の以下のような特徴を持つ無線通信モジュー

ルである.

・ISMバンド (2.4GHz帯)

・IEEE802.15.4に準拠

・Zigbee対応のものが存在

・通信距離は 30[m] 1.5[km]

・免許が不要

・省電力・安価 ・小型

 上記からも分かるように非常に高性能な通信モジュールである.特筆すべきは

省電力という点である.乾電池で 2年以上も動作するため,組み込むシステムの

省電力化に大きく貢献する.モジュールには複数の種類があり,アンテナの形状

や通信距離が異なる.日本の電波法により出力が制限されるが,屋外の通信距離

は最大で 1.5[km]となっている.注意すべきは屋内で使用する場合は通信距離が

落ちること.また,無線 LANと同じ帯域で通信を行うため,干渉しないように

設定を行う必要があること.

図 4.4: XBeeRFモジュール

15

Page 17: Main

4.3 ソフトウェア

サーバはFedoracore13によって構築したサーバであり,PHPはApacheの環境

を用いた.

  PHPスクリプトは Arduino からGET送信されたセンサの値を受け取り,テ

キストデータに書き込む.

 日時の取得には date関数を用いた.date関数とは,実行したときの時刻を取

得する関数である.今回は実行して取得した日時データを温度データと共に書き

込むことで,日時の判別を行う仕様とした.しかし,date関数から取得した時間

とArduinoが測定した時間が異なるという問題点があるので,現在はNTPサー

バから取得する方法を検討している.GPSモジュールよりハードウェア的に取得

することも可能ではあるが,ハードウェアはリソースが制限され,コストがかか

る上に保守性も悪いので今回は行わない.

 このプログラムを cronによって自動的に実行を行った.cronとは,決まった時

間や一定の時間ごとに処理を行うサービスである.今回は一定の時間ごとにPHP

スクリプトを実行するという目的で利用する.PHPスクリプトはwhileによって

ループすることで常に実行することが可能である.しかし,その方法は推奨され

ない.なぜならサーバへの負荷が大きいためである.常に実行する必要がないも

のは,決まった時間に実行することでサーバへの負荷を軽減することにつながる.

PHPのデフォルトの設定で 30秒以上経過するとタイムアウトエラーになるのも

負荷軽減のためである.

16

Page 18: Main

第5章 測定

5.1 測定結果

実際に屋外の気温と湿度の測定を行った.図に測定結果を示す.テキストデータ

をPHPスクリプトで処理し,データを閲覧したい日付を入力することでGoogle

のサービスを用いてグラフの表示を行うことができる.またWebブラウザ機能

を持つ端末であれば,端末に依存せずに閲覧できる.

図 5.1: 測定結果

17

Page 19: Main

5.2 アグリセンサの問題点と今後の課題

作製したアグリセンサには問題点や課題がある.以下に示す.

・センサの種類が少ない

・測定データの精度が悪い

・XBeeの通信の安定性

・電源のリソース

・システムが閉鎖的である

 今後はセンサの増設を考えている.農業において最も重要な情報はカメラによ

る画像である.JPEGカメラの実装を視野に入れている.また,正確な時刻の取

得にGPSモジュールもしくはRTCモジュールの実装が必要だ.

 センサはアナログ出力のものを用いており,精度はArduinoのA/Dコンバー

タとリファレンス電圧に依存するため精度が落ちる.今後は I2Cバスや SPIバス

を用いた高精度の計測の検討している.また,測定条件も不十分であり,正確な

気温を測定するためにも外気を取り込むファンを取り付けるなど工夫が必要であ

 無線通信に用いたXBeeは小型,安価,低消費電力であるが,安定性という点

においては信頼性が低い.今後は無線 LANもしくは携帯端末を使用することが

望ましい.

 小型化するために太陽電池モジュールの出力電力とバッテリ容量がトレードオ

フになってしまう.省電力なハードウェアを実装したが,安定した動作をするた

めにも電源の問題は依然として残る.

 このシステムは外部には公開できておらず,閉鎖的である.公開するためにも

Pachebeや twitterなど外部のサービスとの提携が必須である.

18

Page 20: Main

第6章 結論

モニタリングシステムに必要な基本的な機能を実装できた.目的としていた安

価,小型,低消費電力なシステムが構築できた.以下の図に示すように多きな削

減率を実現することができた.

 このようなモニタリングシステムは多くの研究機関で構築され,企業もセン

サを開発しているが,最も重要なことは取得したデータの活用法である.アグリ

サーバもアグリセンサもデータの利活用はできていない.今後 ICT農業を実現

するためにはデータの活用は不可欠である.モニタリングシステムは目的ではな

く,ICT農業を実現する手段に過ぎない.しかしながら,安定して動作し,連続

的に気象,土壌データを取得できるモニタリングシステムが開発されていないの

も事実である.そういったことも含め,これからも多くの試行錯誤が必要な分野

である.

図 6.1: 従来型との比較

19

Page 21: Main

参考文献

[1] 農業グリッドが目指すもの 二宮正士

[2] Arduino.cc  http://arduino.cc/

[3] ディジ インターナショナル  http://www.digi-intl.co.jp/

20

Page 22: Main

付録

 本研究で作成したプログラムとサーバの設定を下記に示す。

アグリセンサプログラム/**serverphp_node_5*templreture*humiditry*BYTE*ID*/

////変数宣言//ここから/////////////////////////////////////////////////////int AT_inPin = 0; // 温度センサ入力ピン番号int AT_val; // 温度センサ入力値 (0?1023)int AH_inPin = 1; // 湿度センサ入力ピン番号int AH_val; // 湿度センサ入力値 (0?1023)int outputTerm = 10; // 計測結果出力ターム(10秒ごとに平均摂氏値を出力する)float v = 5; // 基準電圧値 ( V )int tempC = 0; // 摂氏値 ( ℃ )int hih = 0; // 湿度 (%)float tempCPlus = 0; // 10秒ごとの合計摂氏値 ( ℃ )int hinplus = 0; // 10秒ごとの合計湿度 ( % )int ID = 1; // センサ ID(任意の値)/////////////////////////////////////////////////////変数宣言//ここまで//初期化関数//ここから/////////////////////////////////////////////////void setup(){

Serial.begin(9600);}////////////////////////////////////////////////初期化関数//ここまで////メイン関数//ここから/////////////////////////////////void loop(){

//温度センサ//ここから/////////////////////////////////////////////// 1秒に一回、10秒間分温度計測for (int i = 0; i < outputTerm; i++ ) {// アナログピンから計測値を取得 (0~1023)

AT_val = analogRead( AT_inPin );

21

Page 23: Main

// 摂氏に換算tempC = ((v * AT_val) / 1024) * 100;// 現 for文ループ内で使わなくなった変数は解放AT_val = 0;// 平均値を取得するために 1秒ごとの値を 10秒分合計しておくtempCPlus += tempC;// 現 for文ループ内で使わなくなった変数は解放tempC = 0;// 1秒間ストップdelay(1000);

}// 10秒間の平均摂氏値tempC = tempCPlus / outputTerm;// 現 loop()ループ内で使わなくなった変数は解放tempCPlus = 0;/////////////////////////////////////////////////////温度センサ//こ

こまで//湿度センサ//ここから////////////////////////////////////////////////for (int i = 0; i < outputTerm; i++ ) {// アナログピンから計測値を取得 (0~1023)

AH_val = analogRead( AH_inPin );// 湿度に換算hih = map(AH_val,6,777,0,100);// 平均値を取得するために 1秒ごとの値を 10秒分合計しておくhinplus += hih;// 現 for文ループ内で使わなくなった変数は解放hih = 0;// 1秒間ストップdelay(1000);

}// 10秒間の平均摂氏値hih = hinplus / outputTerm;// 現 loop()ループ内で使わなくなった変数は解放hinplus = 0;///////////////////////////////////////////////////湿度センサ//ここ

まで//送信部分Serial.print(ID);Serial.print(tempC,BYTE);Serial.print(hih,BYTE);//Serial.print(tempC);//Serial.print(hih);Serial.print("0");//ディレイ部分delay(880000UL);

}/////////////////////////////////////メイン関数//ここまで

22

Page 24: Main

アグリセンサ親機プログラム/**agrisensor_host*/#include <Client.h>#include <Ethernet.h>#include <Server.h>#include <SPI.h>////////////////////////////////////////////////////////////////////////int temp = 0; // 摂氏値 ( ℃ )int hih = 0 ; // 湿度( % )int ID ;int a[4];int i;///////////////////////////////////////////////////////////////////////////* サーバのポート番号を定義 */#define PORT 80//////////////////////////////////////////////////////////////////////////byte mac[] = { //Ethernetシールドの macアドレス

0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX };byte ip[] = { //IPあど

160, 18, 8, 158 };byte server[] = {

160,18,8,156 }; // 接続先の IPアドレス// 指定した IPアドレスとポートに接続するクライアントを生成Client client = Client(server, PORT);//////////////////////////////////////////////////////////////////////void setup(){

//weitdelay(1000);Serial.begin(9600);// Ethernetライブラリとネットワーク設定を初期化Ethernet.begin(mac, ip); //Ethernetに引き渡す

}////////////////////////////////////////////////////////////////////////void loop(){

//バッファが4のとき読み込むif(Serial.available()>=4){

for(i=0;i<4;i++){a[i]=Serial.read();Serial.print("a[");Serial.print(i);Serial.print("]=");Serial.println(a[i]);

}//チェックビット a[3]が 0のとき処理if(a[3] == 48){

ID = a[0]-48 ;temp = a[1]-60 ;hih = a[2] ;Serial.print("ID=");Serial.println(ID);Serial.print("temp=");Serial.println(temp);Serial.print("hih=");Serial.println(hih);

23

Page 25: Main

// 指定した webサーバへの接続開始// 成功if (client.connect()) {

Serial.println("connected");// 指定の webサーバの PHPスクリプトに GET送信// ’temp’という名前で計測した温度値を送信client.write("GET /readdata.php?ID=");client.print(ID, DEC);client.write("&temp=");client.print(temp, DEC);client.write("&hih=");client.print(hih, DEC);client.write(" HTTP/1.1\n");client.write("HOST:160.18.8.156\n\n");// 接続を終了client.stop();// 失敗

}else {

Serial.println("connection failed");client.stop();

}}else{

//チェックビットが違ったら初期化Serial.flush();for(i=0;i<4;i++){

a[i]=0;}

}}

}///////////////////////////////////////////////////////////////////////

24

Page 26: Main

Xbeeの設定  XBeeの設定を行う.パソコンに専用ケーブルにより接続し,ハイパーターミナルやTeraTermなどの通信ソフトを使って設定を行う.また,digiinternationalより XBeeの設定を行う”X-CTU”というソフトウェアが無償で提供されている.X-CTUを用いることで簡易に設定できるので,今回はそれを用いて設定を行う.X-CTUを用いて以下のように設定する .親機 CoordinatorPAN ID 3332(親と子で同じ値)DH 0DL FFFF子機 Router/END Devide ATPAN ID 3332 (親と子で同じ値)DH 親機の SHの値(固有値)DL 親機の SLの値(固有値) 今回用いた XBeeのバージョンは Zigbee対応のものであるため,Zigbeeの規格に準拠した設定を行う.Zigbeeでは,親機Coordinatorと子機Router/ENDDevideATの関係を設定する必要がある.PANIDは親と子で同一の値とする.PANIDが違うXBee同士では通信は行われない.親機は Coordinatorに設定する.DHを 0,DLを FFFFとする。これにより broadcastの設定となり,同じ PANIDの XBeeすべてに信号を送る設定となる.子機は Router/ENDDevideATに設定する.DHは親機の SHの値,DLは親機の SLの値とする.SHと SLは MACアドレスのようにそれぞれのモジュールで固有の値である.END Deviceは親機にのみ通信を行う設定とする.また,Routerは自分宛て以外の信号を受信した場合に信号の中継を行う設定である.

25

Page 27: Main

サーバ(Apache)設定 デフォルトの設定ではエラーが表示されない。よって設定を変更する。端末を起動し以下のコマンドを打ち込む.[root@lucen /]vi /etc/php.ini このコマンドにより viエディタが起動し、php.iniの内容をテキストエディタを使わずに編集することができる。この php.iniは apacheの設定ファイルである.error_reporting = E_ALLdisplay_errors = On このように表記を変更し、上書き保存する。viエディタの操作方法についてはリファレンスを参考にした.[root@lucen /]/usr/sbin/apachectl restart  Apacheを再起動する。これによって phpファイルを実行したときにエラーが表示されるようになる.

26

Page 28: Main

データ処理PHPスクリプト<?php//readdata.phpdate_default_timezone_set(’Asia/Tokyo’);print(date(’Y/m/d H:i:s ’).’<br>’);$Y = date("Y");$m = date("m");$d = date("d");$H = date("H");$i = date("i");

//GET送信がないならエラー//if(empty($_GET))//echo "No GET variables";//Arduino から GET送信された温度の値を受け取る//else$strID = 0;$strTempVal = 0;$strhihVal = 0;

$strID = $_GET[’ID’];$strTempVal = $_GET[’temp’];$strhihVal = $_GET[’hih’];echo "$strID";echo "$strID";echo "$strID";//日付と温度データを配列に入れる$str = $Y.",".$m.",".$d.",".$H.$i.",".$strID.",".$strTempVal.",".$strhihVal."\n";// データを保存するテキストファイルの相対パス$strDataFilePath = "data/data$strID.txt";// データを保存するテキストファイルを追記モードでオープン$fp = fopen($strDataFilePath, "a");// 送信された値をテキストファイルに書き込みfwrite($fp, $str);// ファイルポインタをクローズfclose($fp);?>

27

Page 29: Main

サーバ(cron)設定実行中であるか確認# /etc/rc.d/init.d/crond status2-5まで ONであればよい# chkonfig ?list crond実行ファイルの権限ls ? al | grep testリスト表示crontab -ecronの書式以下に示す.今回は 15分おきに PHPスクリプトを実行する.以下に示す.分 時 日 月 曜日 コマンド(例 9:30に実行30  9 * * * /アドレス/ファイル15分おきに write_temp.php実行*/15 * * * * /var/html/www/readdata.php  cronは readdata.phpを実行するだけで,phpスクリプト自体の処理に関与するわけではないので注意. 実行されない場合は,以下のコマンドでログを表示することで確認できる.# vi /var/log/cron

28

Page 30: Main

サーバデータ表示PHPスクリプト<html><head><title>output.php</title><meta http-equive="Content-Type" content="text/html; charset=JIS" /></head><?php//データの受け取り//ポストで受け取り代入$year = $_POST[’year’];$month = $_POST[’month’];$day = $_POST[’day’];$ID = $_POST[’ID’];//表示print ("$ID $year / $month / $day");//テキストを配列に代入//ファイルのパス$file = "data/data$ID.txt";//ファイルを開く$fd = fopen ($file, "r");//開けたらwhile(!feof($fd)){$line= fgets($fd, 4096);while (preg_match_all("/\"/", $line, $matches) % 2 and !feof($fd)){//1行取得$line= fgets($fd, 4096);}//,で分割$row =explode(",",$line);//dataに代入$data[] = $row;}//表示echo "<pre>";//print_r($data);echo "</pre>";//ファイルを閉じるfclose ($fd);//受け取った値を配列から探す//配列の大きさの取得$datasize = count($data);//表示//print($datasize);$j=0;for($i=0;$i<$datasize;$i++){if($data[$i][0]==$year){if($data[$i][1]==$month){if($data[$i][2]==$day){$time[] = $data[$i][3];$temp[] = $data[$i][5];$hih[] = $data[$i][6];$j=$j+1;}}}}

29

Page 31: Main

for($j=$j;$j<95;$j++){$time[$j] = 0;$temp[$j] = 0;$hih[$j] = 0;}//print_r($time);$datas = array(

"chxr" =>"0,-10,100|1,0,2400","chxt" =>"y,x","chs" =>"440x220","cht" =>"lxy","chco" =>"FF0000,0000FF","chds" =>"0,2400,-10,100,0,2400,-10,100","chd" =>"t:$time[0],$time[1],$time[2],$time[3]…,temp[0],$temp[1],$temp[2],$temp[3]

…|time[0],$time[1],$time[2],$time[3]…$hih[0],$hih[1],$hih[2],$hih[3],","chdl" =>"tempreture|humidity","chdlp" =>"t","chg" =>"25,9","chls" =>"0,5,16|0,5,16","chma" =>"5,5,10,25","chm" =>"s,FF0000,0,-1,5|s,0000FF,1,-1,5","chtt" =>"weather"

);//print_r($datas);

//グラフの URIを作成$graph = createUri($datas);//グラフの URIを組み立てる関数function createUri($datas){//Google Chart APIのアドレス

$uri = ’http://chart.apis.google.com/chart?’;// クエリの初期化$query = "";//クエリを作成foreach($datas as $key => $val){

if( strcmp($query, "") != 0 ){$query .= "&amp;";

}$query .= "$key=$val";

}$uri .= $query;return $uri;

}

?>

<body>

<img src="<?= $graph ?>" alt="" /></body></html>

30

Page 32: Main

トラブルシューティング 実行できない原因として以下のことが考えられる.・アクセス権限がない・ファイルを操作できない以上のことを解決するために変更を加える.端末から以下のコマンドを打ち込む.chown apache /var/….data.txt  chownはファイルやディレクトリの所有者を設定するコマンドである。たとえば rootで作成されたファイルなどは root権限を持つユーザーにしか操作できない.よって,/var/www/html/dataディレクトリの所有者,または data.txtの所有者を apacheに変更する.chmod R 777 /var/…..data.txt  chmodはファイルやディレクトリのアクセスを設定するコマンドである.たとえば 777に設定すると実行可能,読み込み可能,書き込み可能という設定になる.ただし,あまりにセキュリティを緩く設定すると動作しなくなることもあるので注意が必要である.コマンドについてはリファレンスを参考にしてほしい.

31