Strawberry Linux USB Geiger Counter 測定環境

ストロベリーリナックス社製 USB ガイガーカウンタ 放射能・放射線測定環境

 
測定環境は、WindowsにUSB Geiger Counterを接続しLinuxサーバーのデータベースに測定結果を更新しています。
  Linuxサーバーはページ表示時に最新情報をデータベースより取得して表示している為、動作が遅いです。
  また、インターネット回線及びサーバーのスペックもそれほど高速でない為、アクセス集中による表示不良についてはお許しください。
  サンプルは、会社で使用しているライブラリを含んだままになっていますので、適当に置き換えてください。


  ご自由にリンクして頂いて構いませんが、サーバー及びネットワークの負荷状況に応じてページ構成の変更を行う可能性があります。


Strawberry Linux USB Geiger Counter 測定結果表示サンプル

グラフ表示はpChartを使用しています。以下は表示部分のhtml抜粋となります。

 <h1 class="style1">過去1ヶ月の測定値(1日平均)</h1>
<img src="/Geiger/Graph/DayData.php">
 

実際の表示部分は以下となります。(データベースのアクセスは会社のライブラリを使用しているため、お使いのデータベース環境に置き換えてください。また、その他不要なロジックも含まれていますが、同様に無視してください。
DayData.php
<?php
/*
Example21 : Playing with background
*/

    $include_path = "/home/sample/samplelib";

    require_once ("$include_path/gdb.inc");

// Standard inclusions
    include("$include_path/pChart/pData.class");
    include("$include_path/pChart/pChart.class");

    $d = new DbConnect;
    $con = $d->getConnection();

    $WhereStr = "";
    // $WhereStr = "WHERE yyyy = ";
    // $WhereStr .= date("Y");
    // $WhereStr .= "AND mm = ";
    // $WhereStr .= date("m");
    // $WhereStr .= " AND dd = ";
    // $WhereStr .= date("d");
    // $WhereStr .= " AND hh = ";
    // $WhereStr .= date("h");
    // $WhereStr .= " ";

    $qstr = "SELECT yyyy, mm, dd, Avg(cnt) AS cntAvg, Max(cnt) AS cntMax, Min(cnt) AS cntMin " ;
    $qstr .= "FROM GDB $WhereStr ";
    $qstr .= "GROUP BY yyyy, mm, dd ";
    $qstr .= "ORDER BY yyyy desc, mm desc, dd desc ";
    $qstr .= "offset 0 limit 31 ";

    $rs = pg_query($con,$qstr);
    IF ($rs == false ){
    } else {
        $rows = pg_numrows($rs); // 行数を取得
        if ( $rows > 0 ){
            for ($j = $rows-1;$j >= 0;$j--) {
                $Gdatas[] = pg_result($rs, $j,"cntAvg");
                $Maxdatas[] = pg_result($rs, $j,"cntMax");
                $Mindatas[] = pg_result($rs, $j,"cntMin");
                $Wwstr = sprintf("%02d",pg_result($rs, $j,"mm"));
                $Wwstr .= "/";
                $Wwstr .= sprintf("%02d",pg_result($rs, $j,"dd"));
                $Gtime[] = $Wwstr;
            }
        }
        pg_free_result($rs);
    }
    pg_close($con);


// Dataset definition
    $DataSet = new pData;
    // $DataSet->AddPoint($Maxdatas,"Serie1");
    // $DataSet->AddPoint($Mindatas,"Serie2");
    $DataSet->AddPoint($Gdatas,"Serie3");
    $DataSet->AddPoint($Gtime,"Serie4");
    $DataSet->AddAllSeries();
    $DataSet->SetAbsciseLabelSerie("Serie4");
    // $DataSet->SetSerieName("Minute Max","Serie1");
    // $DataSet->SetSerieName("Minute Min","Serie2");
    $DataSet->SetSerieName("day Average","Serie3");
    $DataSet->SetYAxisName("cpm");
    $DataSet->SetXAxisName("day");

    // Initialise the graph
    $Test = new pChart(700,230);
    $Test->reportWarnings("GD");
    // $Test->setFixedScale(-12,12,5);
    $Test->setFontProperties("$include_path/Fonts/tahoma.ttf",8);
    $Test->setGraphArea(65,30,570,185);
    $Test->drawFilledRoundedRectangle(7,7,693,223,5,240,240,240);
    $Test->drawRoundedRectangle(5,5,695,225,5,230,230,230);
    $Test->drawGraphArea(255,255,255,TRUE);
    $Test->drawScale($DataSet->GetData(),$DataSet->GetDataDescription(),SCALE_NORMAL,150,150,150,TRUE,0,2,TRUE,7);
    $Test->drawGrid(4,TRUE,230,230,230,50);
   
    // Draw the 0 line
    $Test->setFontProperties("$include_path/Fonts/tahoma.ttf",6);
    $Test->drawTreshold(0,143,55,72,TRUE,TRUE);
   
    // Draw the area
    $DataSet->RemoveSerie("Serie4");
    $Test->drawArea($DataSet->GetData(),"Serie1","Serie2",239,238,227,50);
    $DataSet->RemoveSerie("Serie3");
    $Test->drawLineGraph($DataSet->GetData(),$DataSet->GetDataDescription());
   
    // Draw the line graph
    $Test->setLineStyle(1,0);
    $DataSet->RemoveAllSeries();
    $DataSet->AddSerie("Serie3");
    $Test->drawLineGraph($DataSet->GetData(),$DataSet->GetDataDescription());
    // $Test->drawPlotGraph($DataSet->GetData(),$DataSet->GetDataDescription(),3,2,255,255,255);
   
    // Write values on Serie3
    // $Test->setFontProperties("$include_path/Fonts/tahoma.ttf",8);
    // $Test->writeValues($DataSet->GetData(),$DataSet->GetDataDescription(),"Serie3");
   
    // Finish the graph
    $Test->setFontProperties("$include_path/Fonts/tahoma.ttf",8);
    $Test->drawLegend(590,90,$DataSet->GetDataDescription(),255,255,255);
    $Test->setFontProperties("$include_path/Fonts/tahoma.ttf",10);
    $Test->drawTitle(60,22,"Strawberry Linux Co.,Ltd USB Geiger Counter Data(The past one month)",50,50,50,585);
   
    // Add an image
    // $Test->drawFromPNG("Sample/logo.png",584,35);
   
    // Render the chart
    $Test->Stroke();
?>

 


Strawberry Linux USB Geiger Counter 測定結果格納データベースレイアウト

データベースの構成は以下のようになっていますので、必要に応じて様々な集計が可能です。。

DROP TABLE GDB;
CREATE TABLE GDB
(
    yyyy smallint , -- 年
    mm smallint , -- 月
    dd smallint , -- 日
    hh smallint , -- 時
    nn smallint , -- 分
    cnt smallint -- 測定値
    CONSTRAINT GDB_PRIMARY PRIMARY KEY(yyyy,mm,dd,hh,nn)
);
 

 


Strawberry Linux USB Geiger Counter 測定結果更新サンプル

Linuxで作れば理想的だったのですが、時間と環境により、VB6.0からLinuxサーバーのデータベースに測定結果を登録することにしました。
VB6.0サンプル(データベースのアクセスは会社のライブラリを使用しているため、お使いのデータベース環境に置き換えてください。また、その他不要なロジックも含まれていますが、同様に無視してください。
尚、Timer1コントロールのIntervalは100で動作しています。

Option Explicit
''***** 共通環境定義 ********************************
Private MojuNm As String '''エラーログを書き出す場合のモジュール名称
Private init_flg As Integer '''イニシャライズフラグ
Private ret As Integer '''リターンコード
Private SQLTXT As String '''SQL文格納ワークエリア
Private OBJ_ID As String

Private Const MemTanNm = "TEST"
Private Const MemKyouyuDir = "C:\"

''***** データベース関連定義 ********************************
Private cn As ADODB.Connection
Private rs As ADODB.Recordset

Private Const DBName = "GDB"

Private PrApAdo As New PrAdoLib

''***** ワークエリア関連定義 ********************************
Private w_yyyy As Integer
Private w_mm As Integer
Private w_dd As Integer
Private w_hh As Integer
Private w_nn As Integer

Private device As String
Private ToCount As Long
Private ToTime As Long

' GMカウンタの検索
' GMカウンタのデバイス名を返します。デバイスが見つからない場合は""を返します。
Private Declare Function FindUSB Lib "gmlib.dll" Alias "_FindUSB@4" (ByRef index As Long) As String

' カウント値・時間の取得
' カウント値と時間を取得します。このカウント値は液晶にされるものと同じです。
' 時間は液晶に表示されている時間ですが、単位は秒で返します。例)10分は600という数値を返します。
' 一番目の引き数はFundUSBで返したものを渡します。
Private Declare Function GetCountTime Lib "gmlib.dll" Alias "_GetCountTime@12" (ByVal dev As String, ByRef count As Long, ByRef time As Long) As Long

' カウント値・時間のクリア
' GMカウンタのカウント値と時間を0にします。
' クリアと同時にGMキットの液晶表示も0になります
' 一番目の引き数はFundUSBで返したものを渡します。
Private Declare Function Clear Lib "gmlib.dll" Alias "_Clear@4" (ByVal dev As String) As Long

'
'
' バージョン取得
' GMカウンタの内部バージョンを返します。バージョンはYY/MM/DDの日付形式になっています。
' 一番目の引き数はFundUSBで返したものを渡します。
Private Declare Function GetVers Lib "gmlib.dll" Alias "_GetVers@4" (ByVal dev As String) As String

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)


Dim w_ZenTime As Date
Dim w_ZenSec As Integer
' @(f)
'
' 機能 : フォームアクティブ処理
'
' 返り値 : なし
'
' 引き数 : なし
'
' 機能説明: フォームアクティブ処理
'
Private Sub Form_Activate()
    Dim IroCd As String
    Dim ans As Long
    Dim w_ch As String
    Dim I As Integer
    Dim idx As Long

    If init_flg = 0 Then ''フォーム初期表示1回のみ実行する
        init_flg = 1

        device = FindUSB(idx)
        If device = "" Then
            MsgBox "GMカウンタが検出できませんでした"
            Exit Sub
        End If
        Timer1.Enabled = True

        ApDispMSG Me, ""
        Screen.MousePointer = vbDefault

    End If
End Sub


' @(f)
'
' 機能 : FORMロード処理
'
' 返り値 : なし
'
' 引き数 : なし
'
' 機能説明: FORMロード処理
'
Private Sub Form_Load()
    Dim w_KaCd As String

    ToCount = -1
    ToTime = -1


End Sub
'
' 画面メッセージ表示処理
'
'
Sub ApDispMSG(ACTForm As Form, msg As String)

    On Error Resume Next
    ACTForm!ST_Msg.Panels.Item(1) = msg
    ACTForm!ST_Msg.Panels.Item(2) = ACTForm.Name
    ACTForm!ST_Msg.Refresh

End Sub



Private Sub Timer1_Timer()
    MojuNm = "Timer1_Timer"

    Dim count As Long, time As Long
    Dim w_now As Date
    Dim w_Sec As Integer
    w_now = Now

    w_Sec = Val(Format(w_now, "ss"))
    If w_Sec <> 0 Then Exit Sub

    w_yyyy = Val(Format(w_now, "yyyy"))
    w_mm = Val(Format(w_now, "mm"))
    w_dd = Val(Format(w_now, "dd"))
    w_hh = Val(Format(w_now, "hh"))
    w_nn = Val(Format(w_now, "nn"))

    Call GetCountTime(device, count, time)

    Sleep 1500

    If ToCount = -1 Or ToTime = -1 Then
        ToCount = count
        ToTime = time
        Exit Sub
    End If

    LB_Date.Caption = "Date Time : " & Format(w_now, "yyyy/mm/dd hh:nn:ss")
    LB_Cnt.Caption = "Count : " & CStr(count - ToCount) & "cpm"

    ret = PrApAdo.Connection(PGSQLANSI, cn, "192.168.1.1", DBName, 500, "user", "pas", MemTanNm, MojuNm,     MemKyouyuDir, 2)
    If ret <> 0 Then
        Exit Sub
    End If

    SQLTXT = ""
    SQLTXT = SQLTXT & "INSERT INTO GeigerDatas ( yyyy, mm, dd, hh, nn, cnt )"
    SQLTXT = SQLTXT & "VALUES ("
    SQLTXT = SQLTXT & CStr(w_yyyy) & ","
    SQLTXT = SQLTXT & CStr(w_mm) & ","
    SQLTXT = SQLTXT & CStr(w_dd) & ","
    SQLTXT = SQLTXT & CStr(w_hh) & ","
    SQLTXT = SQLTXT & CStr(w_nn) & ","
    SQLTXT = SQLTXT & CStr(count - ToCount)
    SQLTXT = SQLTXT & ")"

    ret = PrApAdo.Execute(cn, rs, SQLTXT, 0, MemTanNm, MojuNm, MemKyouyuDir)
    PrApAdo.rsClose rs, MemTanNm, MojuNm, MemKyouyuDir

    ret = PrApAdo.ConnectionClose(cn, MemTanNm, MojuNm, MemKyouyuDir)
   

    ToCount = count
    ToTime = time

    If count > 2000000000 Or time > 2000000000 Then
        Call Clear(device)
        ToCount = 0
        ToTime = 0
    End If


End Sub
 


Strawberry Linux USB Geiger Counter を持っていた訳

我が家の車は工人舎のSC3KX06GSを取り付けナビやワンセグ等に使っているのですが、2年ほど前にStrawberry Linuxで偶然ガイガーカウンタを発見し、車に取り付け常時測定すると面白そうと思い買ったのですが、仕事や私生活が忙しく放置していたのですが、今回の福島原発事故で測定結果をリアルタイムにグラフで見たくなり公開するに至りました。

 



About Us | c2011 Masakatsu Yamada All rights reserved.