Processingで受信データをグラフ化する

M5Stackからのデータを視覚化するのに、一番手軽に使えそうなツールだと思うProcessingでM5StackからUDPで送られてくる温度データを時系列でグラフ化してみました。Bluetoothで送るのは接続不安定でストレスになるから、簡単に送れるUDPを使います。電池寿命とか関係ないし、

<M5Stackから送られるメッセージ形式>

日時(秒まで)と温度データ

<Processingのコード>

メッセージから、温度部分を抜き出して表示しています。Processingの画像処理は専用のAPIになっています。正規化処理もJavaとは別物ですが、

receive()メソッドは、UDPリッスンで受信データがあれば起動されるでしょうが、drawの読み出し(val)と書き込みが競合すれば値は不定になる可能性はありそうですが、視覚的なものなので排他制御をするまでもないでしょう。

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             

import hypermedia.net.*;
import controlP5.*;

UDP udp;
final String IP = "0.0.0.0";

ControlP5 cp5;
Chart chart_tmp;
final int NUM_GRAPH_DATA = 200;

PFont myFont;

float val;

void setup() {

  size(650, 700);
  myFont = createFont("Arial", 30); 
  
  udp = new UDP(this, 3002);
  udp.listen( true );

  frameRate(10);
  cp5 = new ControlP5(this);
  
  chart_tmp = cp5.addChart("tmp sensor");
  chart_tmp.setView(Chart.LINE)                             
            .setRange(20, 22)                         
            .setSize(600, 200)                               
            .setPosition(10, 250)                           
            .setColorCaptionLabel(color(0,0,255))          
            .setStrokeWeight(1.5)                            
            .getColor().setBackground(color(224, 224, 224))  
            ;
  chart_tmp.addDataSet("temp");
  chart_tmp.setData("temp", new float[NUM_GRAPH_DATA]);
  chart_tmp.setColors("temp", color(0, 0, 192), color(255,255,128));

}

void draw() {
  
  background(255);
  fill(0);

  chart_tmp.unshift("temp", val);
}

void receive( byte[] data, String ip, int port ) {
  String message = new String( data );
  println( "received : \""+message+"\" from "+ip+" on port "+port );
  
  String[] matchedTexts = match(message, "[0-9|-]*.[0-9]*$");

  if (matchedTexts != null) {
    println(matchedTexts[0]);
    val = float(matchedTexts[0]);
  }

}

動画はこちらを参照ください、グラフ下端が20℃、上端が22℃で範囲を拡大して見やすくしています。

processing – SD 480p

 

admin