用例:USB天気観測

POC-メテオ

yoctopuce

USB環境センサー

*用例1/2/3
- POC光センサ100K                   
*用例1
-POC-高度計                       
*用例1
- POC-メテオ                       
*用例1/2/3/4/5/6/7/8
- POC-サーモ               
*用例1/2/3/4
- PT100                       
*用例1
- POC-VOCセンサ               
*用例1/2
 

USB電圧センサー

*用例1
*用例1/2/3/4/5/6/7/8
- POC-Amp           
*用例1/2/3/4
- POC-Knob         
*用例1/2/3/4/5/6/7/8/9/10/11/12/13
*用例1
- POC-PWM-Rx     
*用例1/2
- POC-RS232         
*用例1
- POC-ボルト
- POC-ワット
- POC-ミリボルト-Rx
- POC-ミリボルト-BNC
 

USB位置センサー

*用例1/2/3
-POC-高度計                       
*用例1
 -POC-GPS
*用例1 

USBアクチュエーター

- POC-ブザー
- POC-カラー      
*用例1/2/3/4/5/6/7/8
*用例1/2/3/4/5/6
- POC-マキシIO     
*用例1
*用例1/2/3/4/5
- POC-マキシパワーリレー
*用例1/2
- POC-モーターDC     
*用例1/2/3/4
- POC-PWM—Tx    
*用例1
*用例1/2/3/4/5
*用例1/2/3/4/5/6/7/8/9
- POC-リレー      
*用例1/2/3/4/5/6/7/8/9
- POC-サーボ      
*用例1/2/3/4/5/6
*用例1

 USBディスプレー  

*用例1/2/3/4/5
*用例1/2/3/4/5/6/7
*用例1/2/3/4/5/6/7
*用例1/2/3

 エクステンションとネットワーキング 

- POC-マイクロUSBハブ 
*用例1
*用例1/2/3/4/5/6/7
*用例1/2/3
*用例1/2/3/4/5/6/7/8/9/10/11
*用例1/2/3/4
*用例1

 アクセサリとコネクター

- POC-Board2Board-127  
*用例1

 エンクロージャー 

 
 

POC-メテオを使って天気観測をしましょう。

 

POCUSBセンサーを使って天気のパラメータ(気温と湿度)を記録してみました。特にこれといって変わったことはない標準的なものですが、この基礎的とも言える用例からPHP言語からアクセス可能なUSBモジュールのメリットが分かります。ライブラリがたくさんあるため、すぐにできるはずです。

このプロジェクトのゴールは定められた時間で記録した気温と湿気のリアルタイムなグラフを作ることです。もちろん後で必要になった時のためにデータベースへ残しておくこともゴールの一つです。(下図参照)

 

sample 1
 

POC-湿度を使用し、PHPWebサーバーをインストールしたPCにつなぎます。今回はEasy PHPを使用しましたが、MAC OS XMAMPがより好ましいでしょう。

 

yoctohum 1

POC-湿度:マイクロ気温測定

 

ソフトウェアの側面は2つあります。1つはパラメータを一定期間で計測し、データベースの値を蓄積するコードとオンデマンドでグラフに書き出すコードです。

 

PHPセンサーを読み込むために、コマンドラインの小さなPHPスクリプトから始めました。わざわざPHPを使用する人は少ないかもしれませんが、OS上で動く小さなスクリプトを実行するにはとても便利な言語です。Windowsまたは似通った環境でEasy PHPをインストールした場合、プログラムファイルの下に「php.exe executable」を見つけることができるでしょう。

 

以下、MySQL databaseからセンサーを読み込み、値をストックするスクリプトです。

 

 
<?php
include("yocto_api.php");
include("yocto_temperature.php");
include("yocto_humidity.php");
  1. function mysql_check($what,$retval)
    { if(!$retval) die("MySQL error ($what): ".mysql_error())}

$conn = mysql_connect('localhost','db_username','db_password');
mysql_check('connect', $conn);
$res = mysql_select_db('weather');
mysql_check('select_db', $res);

yRegisterHub('http://127.0.0.1:4444');

while(TRUE) {
    $temp = yFirstTemperature()->get_currentValue();
    $hum  = yFirstHumidity()->get_currentValue();

    Print("Temperature: $temp C\n");
    Print("Humidity:    $hum %RH\n");
    $time = time();
    $time -= $time % 60;
    $res = mysql_query("select * from meteo where timestamp=$time");
    mysql_check('select', $res);
    if(mysql_num_rows($res) == 0) {
        mysql_query("insert into meteo (timestamp,temperature,humidity)".
                    " values ($time,$temp,$hum)");
    }
    sleep(20);
}
?>
 

 

 

 

 
<?php
$conn = mysql_connect('localhost','db_username','db_password');
mysql_check('connect', $conn);
$res = mysql_select_db('weather');
mysql_check('select_db', $res);

// featch measures from the last 48h
$lastday = time() - 2*86400;
$query = "select * from meteo where timestamp>=$lastday order by timestamp";
$res = mysql_query($query);
mysql_check('select', $res);
$time = Array();
$temp = Array();
$hum  = Array();
while ($row = mysql_fetch_array($res)) {
    $time[] = $row['timestamp'];
    $temp[] = $row['temperature'];
    $hum[]  = $row['humidity'];
}

// draw graph
chdir("../jpgraph");
include_once ("jpgraph.php");
include_once ("jpgraph_line.php");
include_once ("jpgraph_date.php");
$tplot = new LinePlot($temp,$time);
$hplot = new LinePlot($hum,$time);
$graph = new Graph(600,350);
$graph->title->Set('Temperature & Humidity');
$graph->SetMargin(60,60,40,50);
$graph->SetMarginColor('white');
$graph->SetScale('datlin',0,100);
$graph->Add($hplot);
$graph->SetY2Scale('lin',0,12);
$graph->AddY2($tplot);
$graph->xaxis->SetLabelAngle(90);
$graph->xaxis->scale->SetDateFormat('H:i');
$graph->yaxis->SetColor('dodgerblue');
$graph->yaxis->title->SetColor('dodgerblue');
$graph->yaxis->title->Set('%RH');
$graph->yaxis->title->SetAngle(90);
$graph->yaxis->title->SetMargin(10);
$graph->y2axis->SetColor('hotpink3');
$graph->y2axis->title->SetColor('hotpink3');
$graph->y2axis->title->Set('°C');
$graph->y2axis->title->SetAngle(90);
$graph->y2axis->title->SetMargin(10);
$graph->Stroke();
?>
 

 

プログラミングは以上で、プロジェクトは完成間近です。あとは、計測器を外に置く場合、悪天候からモジュールを守るシールドが必要です。センサー自体はリボンケーブルを使用することでUSBコントローラから離すことができます。こうすることでハードウェアの最も繊細な部位を保護することができます、今回のプロジェクトでは4mのリボンケーブルを使いました。

 

cable 1

さて、センサー自体を保護できれば良いわけですが、残念ながら熱帯化処理はできません。(湿度計への損傷を伴うため)よって、もっと原始的にエンクロージャーを使用することにしました。

solidworks 1

図 センサー用小型エンクロージャー

inside 1

図 ボックス内のセンサー

 

完成です!

 

outdoor 1
 
天気ステーション