ブログパーツ レンタルCGI
TAKAさんの毎日が発見・ブログ
アマチュア無線の機器製作を中心にした日常の活動記録です (by Taka JA2GRC、このブログはFC2_BLOGを使わせていただいてます。)
≪05月   2017年06月   07月≫
1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  
Munin・その7
 シリアル接続切り替え器も動いて、Xivelyアップローダも元通り動く様になったので、いよいよ、ガイガーカウンタデータのアップロードをMunin対応に書き換えてみました。
 前に作った温度センサーのアップローダを参考に、Arduino側のスケッチと、Munin側(実験ではRaspberry Pi B)のスクリプトを修正してみました。 何せ、慣れないスクリプトを「見よう見まね」で「それらしき所」を修正した物ですので、問題が残っているかもしれません。

 まずはArduino側のスケッチを修正して、ガイガーカウンタからのシリアル出力データを取り込んで、アップロードする必要なデータを整形してWebページに表示する様にしてみます。

160409_munin_29.jpg

 とりあえず、動いているスケッチはこちらです。 ガイガーカウンタから来るデータは、必要以外のデータも含んでいますが、とりあえず一旦読み込んで、Webページに表示する時に取捨選択しています。

#include <Ethernet.h>

// assign a MAC address for the ethernet controller.
byte mac[] = { 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX };
// assign an IP address for the controller:
IPAddress ip(192,168,0,33);
IPAddress gateway(192,168,0,3);	
IPAddress subnet(255, 255, 255, 0);
// Initialize the Ethernet server library with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);

boolean stringComplete = false;         // whether the string is complete
int inStrPos = 0;
String inputString = "";                // a string to hold incoming data

String strDate = "2016/12/31";
String strTime = "23:59";
String strCPM = "9999";
String strDose = "99.9999";
String strVcc = "5.00";
String strHV = "400.0";
String strTemp = "20.00";
String strPressure = "1013.00";
String strGpsStatus = "1";
String strSatNo = "08";
String strLatitude = "3451.9312";
String strLongitude = "13541.4951";

void setup() {
  Serial.begin(9600);
  // reserve 200 bytes for the inputString:
  inputString.reserve(200);
  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  // give the sensor and Ethernet shield time to set up:
  delay(3000);
  Serial.println("");
  Serial.println("Start Geiger Web Client");
  Serial.println("");
}

void loop() { 
  // listen for incoming Ethernet connections:
  listenForEthernetClients();
  if(stringComplete){
    Serial.println("Recieved from Serialport");
    Serial.println(inputString);

    inStrPos = 0;
    strDate = readStringUntil(inputString, ',');  // Date
    strTime = readStringUntil(inputString, ',');  // Time
    strCPM = readStringUntil(inputString, ',');  // CPM
    strDose = readStringUntil(inputString, ',');  // Dose
    strVcc = readStringUntil(inputString, ',');  // Vcc
    strHV = readStringUntil(inputString, ',');  // HV
    strTemp = readStringUntil(inputString, ',');  // Temp
    strPressure = readStringUntil(inputString, ',');  // Pressure
    strGpsStatus = readStringUntil(inputString, ',');  // GpsStatus
    strSatNo = readStringUntil(inputString, ',');  // SatNo
    strLatitude = readStringUntil(inputString, ',');  // Latitude
    strLongitude = readStringUntil(inputString, ',');  // Longitude

    inputString = ""; 
    stringComplete = false;
  }
}

void listenForEthernetClients() {
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("Got a client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        // if you've gotten to the end of the line (received a newline character)
        // and the line is blank, the http request has ended, so you can send a reply
        if (c == '\n' && currentLineIsBlank) {

          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          // print the current readings, in HTML format:
          client.print("CPM.value ");
          Serial.println("");
          Serial.println("Set to Web Page");
          Serial.print("CPM : ");
          client.print(strCPM);  // CPM
          Serial.println(strCPM);

          client.print("
"); client.print("Dose.value "); Serial.print("Dose : "); client.print(strDose); // Dose Serial.println(strDose); client.print("
"); client.print("Vcc.value "); Serial.print("Vcc : "); client.print(strVcc); // Vcc Serial.println(strVcc); client.print("
"); client.print("HV.value "); Serial.print("HV : "); client.print(strHV); // HV Serial.println(strHV); client.print("
"); client.print("Temp.value "); Serial.print("Temp : "); client.print(strTemp); // Temp Serial.println(strTemp); client.print("
"); client.print("Pressure.value "); Serial.print("Pressure : "); client.print(strPressure); // Pressure Serial.println(strPressure); break; } if (c == '\n') { // you're starting a new line currentLineIsBlank = true; } else if (c != '\r') { // you've gotten a character on the current line currentLineIsBlank = false; } } } // give the web browser time to receive the data delay(1000); // close the connection: client.stop(); } } String readStringUntil(String inStr, char sep){ char inChar; String str = ""; while(1){ inChar = inStr.charAt(inStrPos); inStrPos++; if(inChar != sep && inChar != '\r' && inChar != '\n'){ str += inChar; // just read in the next char } else{ break; } } return str; } //----------------------------------------------------------------------------------------------+ // Get serial data from Geiger kit //----------------------------------------------------------------------------------------------+ /* SerialEvent occurs whenever a new data comes in the hardware serial RX. This routine is run between each time loop() runs, so using delay inside loop can delay response. Multiple bytes of data may be available. */ void serialEvent() { while (Serial.available()) { // get the new byte: char inChar = (char)Serial.read(); // add it to the inputString: inputString += inChar; // if the incoming character is a newline, set a flag // so the main loop can do something about it: if (inChar == '\n') { stringComplete = true; } } }

 更に、Raspberry Pi B 側のスクリプトを修正してみます。 こちらも本当に「見よう見まね」です。

#!/usr/bin/perl
=head1 NAME
arduinoGeiger - Munin plugin to receive CPM and others from an Arduino running a webserver.

=head1 CONFIGURATION
ln -s /usr/share/munin/plugins/arduinoGeiger /etc/munin/plugins/arduinoGeiger

Set the $ipAddress variable below.
Set the $tempx variables below to give each temp a graph title.

=cut

use LWP::Simple;

# URL to use.
$address = "http://192.168.0.33/";
# Don't use spaces in the array below.
# Name the sensors in order in the array.
@tempName = ("CPM","Dose","Vcc","HV","Temp","Pressure");

if($ARGV[0] eq "config"){
	# Configuration for the individual graphs.
	print "multigraph CPM\n";
	print "graph_title CPM\n";
	print "graph_vlabel cpm\n";
	print "graph_category geigercounter\n";
	print "CPM.label CPM\n\n";

	print "multigraph Dose\n";
	print "graph_title Dose\n";
	print "graph_vlabel uSv/h\n";
	print "graph_category geigercounter\n";
	print "Dose.label Dose\n\n";

	print "multigraph Vcc\n";
	print "graph_title Vcc\n";
	print "graph_vlabel V\n";
	print "graph_category geigercounter\n";
	print "Vcc.label Vcc\n\n";

	print "multigraph HV\n";
	print "graph_title HV\n";
	print "graph_vlabel V\n";
	print "graph_category geigercounter\n";
	print "HV.label HV\n\n";

	print "multigraph Temp\n";
	print "graph_title Temp\n";
	print "graph_vlabel degrees\n";
	print "graph_category geigercounter\n";
	print "Temp.label Temp\n\n";

	print "multigraph Pressure\n";
	print "graph_title Pressure\n";
	print "graph_vlabel hPa\n";
	print "graph_category geigercounter\n";
	print "Pressure.label Pressure\n\n";

	exit;
}

# Get the data
$geigercounterDatum = get($address);

# Parse the data
@geigercounterData = split /
/, $geigercounterDatum; # Print the individual graph. print "multigraph CPM\n"; print "$geigercounterData[0]\n"; print "multigraph Dose\n"; print "$geigercounterData[1]\n"; print "multigraph Vcc\n"; print "$geigercounterData[2]\n"; print "multigraph HV\n"; print "$geigercounterData[3]\n"; print "multigraph Temp\n"; print "$geigercounterData[4]\n"; print "multigraph Pressure\n"; print "$geigercounterData[5]\n"; print "\n";

 これで、パソコンからRaspberry Pi B のWebサーバーにアクセスしてみると、上手く表示できる様になりました。

160409_munin_30.jpg

 上手く取り込めた様なので、Muninの監視周期を変えてみました。 デフォルトでは5分周期ですが、ガイガーカウンタからのデータ周期である1分にしてみました。 正確には、それぞれの周期は微妙に違っていますが、ずれた所は、一つデータが抜けるか、同じデータが重なるかになるだけなので、大きな問題にはならないでしょう。

160409_munin_31.jpg

 ここで、Raspberry Pi B のCPU使用率を見てみましたら、結構な負荷になっています。 やっぱり、5分周期→1分周期になると、かなりな負担ですね。 まあ、でもこれぐらいなら、Raspberry Pi 2またはpcDunoなら、大丈夫そうな感じがします。 ちなみに、不要になったセンサー用のグラフ3つを削除してみたら、少し改善されています。 念のため、元の5分周期にしたら、CPU 使用率は10%程度に下がります。

160409_munin_32.jpg
コメント
この記事へのコメント
URL :
コメント :
パスワード :
管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
Template designed by アクセラと+αな生活

Powered by まとめ .