2016-12-01 3 views
1

일부 센서가 연결된 Arduino의 경우 Processing 및 controlp5를 사용하여 인터페이스를 구축하고 있습니다. 많은 센서를 갖고 싶습니다. 그래서 인터페이스를 모듈 방식으로 구축하려고합니다. 따라서 센서가있는만큼 많은 컨트롤 패널을 인스턴스화하고, 하드웨어가 원격 측정 패킷을 보낼 때 모든 패널을 한 번에 업데이트 할 수 있습니다.처리에서 클래스 내에서 controlp5 위젯 사용

나는 위젯을 그리며 작동하지만 콜백 함수가 트리거되지 않은 것처럼 보입니다. 예를 들어, 아래 코드의 버튼 중 하나를 누르면 해당 직렬 출력이 표시되지 않습니다. 우연히 있다. 또한 메인 스케치의 println(channelOne.currentGain);은 게인 슬라이더가 무엇을 하든지간에 항상 0을 인쇄합니다.

나는 많은 자바를 사용하지 않으므로 클래스와 변수가 어떻게 선언되는지에 대한 기본적인 내용을 여기에서 놓치고 있다고 확신한다. 올바르게 설정하는 방법에 대한 조언을 많이 주시면 감사하겠습니다! 여기

내 주요 프로그램 :

import processing.core.PApplet; 

SensorChannel channelOne; 

void setup() 
{ 
    size(800, 450); 
    smooth(); 

    channelOne = new SensorChannel(this, 30, 30); 
} 

void draw() 
{ 
    background(0); 

    println(channelOne.currentGain); 
    delay(20); 
} 

그리고 여기 SensorChannel의 클래스 정의입니다 :

향상시킬 수 몇 가지가 있습니다
import processing.core.PApplet; 
import controlP5.*; 

class SensorChannel { 
    PApplet app; 
    ControlP5 cp5; 

    //Moving line graph 
    Chart chart; 

    //CheckBox buttons; 
    boolean triggered; 
    boolean manualOverride; 
    boolean calibrateBaseline; 
    boolean calibrateGain; 
    boolean calibrateTrigger; 
    boolean selfControl; 

    //Sliders 
    int currentGain; 
    int currentBalance; 
    int currentReading; 
    int currentTrigger; 

    SensorChannel(PApplet papp, int x, int y) 
    { 

    app = papp; 
    cp5 = new ControlP5(papp); 

    println("hello!"); 

    //Line graph 
    chart = cp5.addChart("sensorChart") 
    .setPosition(x+0, y+0) 
    .setSize(306, 220) 
    .setRange(0, 1024) 
    .setView(Chart.LINE) // use Chart.LINE, Chart.PIE, Chart.AREA, Chart.BAR_CENTERED 
    .setStrokeWeight(1.5) 
    .setColorCaptionLabel(color(40)) 
    ; 

    chart.addDataSet("sensorReading"); 
    chart.setData("sensorReading", new float[100]); 
    chart.setColors("sensorReading", color(240)); 

    chart.addDataSet("sensorReading"); 
    chart.setData("sensorReading", new float[100]); 
    chart.setColors("sensorReading", color(140)); 

    //Reading (10bits) 
    //Trigger point (10bits) 

    //Balancing digipot setting (1 byte) 
    cp5.addSlider("currentBalance") 
    .setLabel("Balance Pot") 
    .setPosition(x+0,y+284) 
    .setSize(306,20) 
    .setRange(0,255) 
    ; 
    //Gain setting (1 byte) 
    cp5.addSlider("currentGain") 
    .setLabel("Gain") 
    .setPosition(x+0,y+263) 
    .setSize(306,20) 
    .setRange(0,255) 
    ; 

    //Current Sensor Reading (1 byte) 
    cp5.addSlider("currentReading") 
    .setLabel("Sensor Reading") 
    .setPosition(x+0,y+221) 
    .setSize(306,20) 
    .setRange(0,255) 
    ; 

    //Trigger Point (1 byte) 
    cp5.addSlider("currentTrigger") 
    .setLabel("Trigger Point") 
    .setPosition(x+0,y+242) 
    .setSize(306,20) 
    .setRange(0,255) 
    ; 

    //Misc. Settings Toggles 
    cp5.addToggle("triggered") 
    .setLabel("Trigger") 
    .setPosition(x+0,y+305) 
    .setSize(50,20) 
    ; 

    cp5.addToggle("manualOverride") 
    .setLabel("Override") 
    .setPosition(x+51,y+305) 
    .setSize(50,20) 
    ; 

    cp5.addToggle("calibrateBaseline") 
    .setLabel("C. Baseline") 
    .setPosition(x+102,y+305) 
    .setSize(50,20) 
    ; 

    cp5.addToggle("calibrateGain") 
    .setLabel("C. Gain") 
    .setPosition(x+153,y+305) 
    .setSize(50,20) 
    ; 

    cp5.addToggle("calibrateTrigger") 
    .setLabel("C. Trig") 
    .setPosition(x+204,y+305) 
    .setSize(50,20) 
    ; 

    cp5.addToggle("selfControl") 
    .setLabel("S. Control") 
    .setPosition(x+255,y+305) 
    .setSize(50,20) 
    ; 

    } 

    void triggered(boolean theFlag) 
    { 
    println("Trigger status: " + theFlag); 
    } 

    void manualOverride(boolean theFlag) 
    { 
    println("Manual Override status: " + theFlag); 
    } 

    void calibrateBaseline(boolean theFlag) 
    { 
    println("Calibrate Baseline status: " + theFlag); 
    } 

    void calibrateGain(boolean theFlag) 
    { 
    println("Calibrate Gain status: " + theFlag); 
    } 

    void calibrateTrigger(boolean theFlag) 
    { 
    println("Calibrate Trigger status: " + theFlag); 
    } 

    void selfControl(boolean theFlag) 
    { 
    println("Self Control status: " + theFlag); 
    } 

} 
+0

내 솔루션에 문제가 있습니까? –

답변

0

:

  • 없음 delay()으로 전화해야합니다. draw()은 초당 약 60 회 호출되지만, frameRate() (예 : framerate(50);)을 사용하여 쉽게 제어 할 수 있습니다.
  • SensorChannel에서 cp5를 인스턴스화합니다. 아마도 기본 스케치에서 단일 ControlP5 인스턴스를 만들고 SensorChannel에 대한 참조를 전달할 수 있습니다 (여러 개의 향후 채널에 인스턴스를 다시 사용).

값을 탭하는 데는 여러 가지 방법이 있습니다. 예> 기증 라이브러리> ControlP5> 사용

직선적 인 한 가지 방법은 컨트롤러 plugTo() 메서드를 사용하는 것입니다. 당신은에 컨트롤러를 연결하는 개체를 전달하고 한 객체는 컨트롤러와 동일한 이름의 속성이로는 값의 설정합니다 :

import controlP5.*; 

SensorChannel channelOne; 
ControlP5 cp5; 

void setup() 
{ 
    size(800, 450); 
    smooth(); 
    cp5 = new ControlP5(this); 
    channelOne = new SensorChannel(this,cp5, 30, 30); 
} 

void draw() 
{ 
    background(0); 

    text("currentGain:"+channelOne.currentGain,10,15); 
} 

class SensorChannel{ 
    PApplet app; 
    ControlP5 cp5; 

    //Moving line graph 
    Chart chart; 

    //CheckBox buttons; 
    boolean triggered; 
    boolean manualOverride; 
    boolean calibrateBaseline; 
    boolean calibrateGain; 
    boolean calibrateTrigger; 
    boolean selfControl; 

    //Sliders 
    int currentGain; 
    int currentBalance; 
    int currentReading; 
    int currentTrigger; 

    SensorChannel(PApplet papp, ControlP5 cp5,int x, int y) 
    { 

    app = papp; 
    this.cp5 = cp5; 

    println("hello!"); 

    //Line graph 
    chart = cp5.addChart("sensorChart") 
    .setPosition(x+0, y+0) 
    .setSize(306, 220) 
    .setRange(0, 1024) 
    .setView(Chart.LINE) // use Chart.LINE, Chart.PIE, Chart.AREA, Chart.BAR_CENTERED 
    .setStrokeWeight(1.5) 
    .setColorCaptionLabel(color(40)); 

    chart.addDataSet("sensorReading"); 
    chart.setData("sensorReading", new float[100]); 
    chart.setColors("sensorReading", color(240)); 

    chart.addDataSet("sensorReading"); 
    chart.setData("sensorReading", new float[100]); 
    chart.setColors("sensorReading", color(140)); 

    //Reading (10bits) 
    //Trigger point (10bits) 

    //Balancing digipot setting (1 byte) 
    cp5.addSlider("currentBalance") 
    .setLabel("Balance Pot") 
    .setPosition(x+0,y+284) 
    .setSize(306,20) 
    .setRange(0,255) 
    .plugTo(this) 
    ; 
    //Gain setting (1 byte) 
    cp5.addSlider("currentGain") 
    .setLabel("Gain") 
    .setPosition(x+0,y+263) 
    .setSize(306,20) 
    .setRange(0,255) 
    .plugTo(this); 
    ; 

    //Current Sensor Reading (1 byte) 
    cp5.addSlider("currentReading") 
    .setLabel("Sensor Reading") 
    .setPosition(x+0,y+221) 
    .setSize(306,20) 
    .setRange(0,255) 
    .plugTo(this) 
    ; 

    //Trigger Point (1 byte) 
    cp5.addSlider("currentTrigger") 
    .setLabel("Trigger Point") 
    .setPosition(x+0,y+242) 
    .setSize(306,20) 
    .setRange(0,255) 
    .plugTo(this) 
    ; 

    //Misc. Settings Toggles 
    cp5.addToggle("triggered") 
    .setLabel("Trigger") 
    .setPosition(x+0,y+305) 
    .setSize(50,20) 
    .plugTo(this) 
    ; 

    cp5.addToggle("manualOverride") 
    .setLabel("Override") 
    .setPosition(x+51,y+305) 
    .setSize(50,20) 
    .plugTo(this) 
    ; 

    cp5.addToggle("calibrateBaseline") 
    .setLabel("C. Baseline") 
    .setPosition(x+102,y+305) 
    .setSize(50,20) 
    .plugTo(this) 
    ; 

    cp5.addToggle("calibrateGain") 
    .setLabel("C. Gain") 
    .setPosition(x+153,y+305) 
    .setSize(50,20) 
    .plugTo(this) 
    ; 

    cp5.addToggle("calibrateTrigger") 
    .setLabel("C. Trig") 
    .setPosition(x+204,y+305) 
    .setSize(50,20) 
    .plugTo(this) 
    ; 

    cp5.addToggle("selfControl") 
    .setLabel("S. Control") 
    .setPosition(x+255,y+305) 
    .setSize(50,20) 
    .plugTo(this) 
    ; 

    } 

} 

이 하나 개의 제안입니다. 컨트롤러 이벤트 및 값에 대한 다른 ControlP5 예제를 자유롭게 탐색 해보십시오.