Lesen XBee-Daten in Processing

Ich habe vor kurzem eine Tweet-A-Watt (http://www.ladyada.net/make/tweetawatt/) die drahtlose Energie-monitor, der verwendet XBee die Daten übertragen werden. Ich bin versucht, den Tweet-A-Watt-Daten-in-Verarbeitung für die Verwendung in einigen visual energy feedback-Prototypen. Über das XBee-API-Bibliothek für die Verarbeitung (http://www.faludi.com/code/xbee-api-library-for-processing/), ich habe einige Fortschritte, aber haben sich gegen ein Hindernis, das ich würde schätzen, dass jede Eingabe auf.

Meinem Processing-sketch sieht wie folgt aus:

/*
XBee Communication Prototype
XBee API Library by Daniel Shiffman and Rob Faludi: http://www.faludi.com/code/xbee-api-library-for-processing/
Sample XBee communication code adapted from Tom Igoe: http://www.tigoe.net/pcomp/code/category/Processing/148
*/

//import the xbee and serial libraries:
import xbee.*;
import processing.serial.*;

//set up Xbee parameters:
Serial port;
XBeeReader xbee;
int rssi = 0;     //received signal strength
int address = 0;     //sender's address
int samples = 0;     //total number of samples
int[] analog;     //values from the analog I/O pins

void setup() {
  //set up xbee
  port = new Serial(this, Serial.list()[0], 9600);
  xbee = new XBeeReader(this, port);
  xbee.startXBee();  
}

void draw() {}    

//called every time an XBee event is received: every 2s in the case of the Tweet A Watt
public void xBeeEvent(XBeeReader xbee) {    
   //Grab a frame of data
   XBeeDataFrame data = xbee.getXBeeReading();   

  println("");
  println("LOOP " + hour() + ":" + minute() + ":" + second());

    //Get the transmitter address
    address = data.getAddress16();
    println("API ID: " + address);    

    //Get the RSSI
    rssi = data.getRSSI();
  println("RSSI: " + rssi);      

  //Get total number of samples
  samples = data.getTotalSamples();   
  println("Total Samples: " + samples);    

  //Output the Analog readings for each sample     
  //ONLY GETS FIRST SAMPLE - How do I access all samples?
  for (int i=0; i < samples; i++) {
   analog = data.getAnalog(i);
   print("[");
   for (int j=0; j < analog.length; j++) {
    print(analog[j]);
    if (j < analog.length - 1) { print(", "); }
   }
   print("]");
   if (i < samples - 1) { print(", "); }
   else { println(""); }
  }
}

Diesem funktioniert alles wie erwartet. Die xBeeEvent aufgerufen wird jedes 2s und gibt die richtigen Werte für den API-ID, RSSI, und die Proben Insgesamt (19). Jedoch, wenn er den Inhalt der analogen Messwerte, die ich zu sein scheinen immer das erste Beispiel wiederholt sich 19 mal. Siehe dieses Beispiel-Ausgabe:

LOOP 10:37:57
API ID: 1
RSSI: -61
Total Samples: 19
[512, -1, -1, -1, 688, -1], [512, -1, -1, -1, 688, -1], [512, -1, -1, -1, 688, -1], [512, -1, -1, -1, 688, -1], [512, -1, -1, -1, 688, -1], [512, -1, -1, -1, 688, -1], [512, -1, -1, -1, 688, -1], [512, -1, -1, -1, 688, -1], [512, -1, -1, -1, 688, -1], [512, -1, -1, -1, 688, -1], [512, -1, -1, -1, 688, -1], [512, -1, -1, -1, 688, -1], [512, -1, -1, -1, 688, -1], [512, -1, -1, -1, 688, -1], [512, -1, -1, -1, 688, -1], [512, -1, -1, -1, 688, -1], [512, -1, -1, -1, 688, -1], [512, -1, -1, -1, 688, -1], [512, -1, -1, -1, 688, -1]

LOOP 10:38:59
API ID: 1
RSSI: -61
Total Samples: 19
[503, -1, -1, -1, 561, -1], [503, -1, -1, -1, 561, -1], [503, -1, -1, -1, 561, -1], [503, -1, -1, -1, 561, -1], [503, -1, -1, -1, 561, -1], [503, -1, -1, -1, 561, -1], [503, -1, -1, -1, 561, -1], [503, -1, -1, -1, 561, -1], [503, -1, -1, -1, 561, -1], [503, -1, -1, -1, 561, -1], [503, -1, -1, -1, 561, -1], [503, -1, -1, -1, 561, -1], [503, -1, -1, -1, 561, -1], [503, -1, -1, -1, 561, -1], [503, -1, -1, -1, 561, -1], [503, -1, -1, -1, 561, -1], [503, -1, -1, -1, 561, -1], [503, -1, -1, -1, 561, -1], [503, -1, -1, -1, 561, -1]

Wie Sie sehen können, das erste Beispiel wiederholt sich 19 mal. Mit der original-Python-Skript aus dem Tweet-A-Watt software (wattcher.py) gibt eine ähnliche Lesung des XBee-Paket, aber mit 19 verschiedene Proben. Dies ist der Zustand, den ich versuche zu bekommen, um in der Verarbeitung.

In die XBee-API-Bibliothek, die getAnalog() und getAnalog(n) Funktionen sind wie folgt definiert:

getAnalog() – liefert ein array von ganzen zahlen repräsentiert den aktuellen Zustand der einzelnen analogen Kanal mit -1, der anzeigt, dass der Kanal nicht konfiguriert für analog. Verwenden Sie diese, wenn es nur ein sample pro frame. 

getAnalog(int n) liefert das N-te sample von analog-Daten als ein array von ganzen zahlen mit -1, der anzeigt, dass der Kanal nicht konfiguriert für analog.

Ich bin mit getAnalog(int n) in der für Schleife. Das Problem ist, dass ich nur immer einen "Rahmen" von Daten, der Aufruf von XBeeDataFrame data = xbee.getXBeeReading(); ?

Habe ich auch versucht, das Lesen der Seriellen Pakete direkt ohne Verwendung der XBee-API-Bibliothek (mit Verweis auf (http://www.tigoe.net/pcomp/code/category/Processing/8), (http://processing.org/reference/libraries/serial/Serial.html), und (http://ssdl.stanford.edu/ssdl/images/stories/AA236/0708A/Lab/Rover/Parts/xbeeproproductmanual.pdf), aber meine mangelnde Erfahrung in diesem Bereich macht dies ein bisschen ein non-starter.

Falls jemand vertraut mit der XBee-Paket, das XBee-API-Bibliothek oder das Lesen von Seriellen Daten bei der Verarbeitung helfen kann, es würde sehr geschätzt werden. Ich erwarte, dass die Daten vorhanden sind, ich bin nur nicht der Zugriff korrekt. Ich weiß, das ist eine ziemlich spezifische Frage, und ich habe es in der Adafruit (Macher des Tweet-A-Watt-kit - http://forums.adafruit.com/viewtopic.php?f=40&t=16067&sid=4e34727fa59b7c7d589564d2d6b85e46) und Verarbeitung (http://processing.org/discourse/yabb2/YaBB.pl?num=1276111549) Foren, aber nachdem Dutzende von Ansichten, ich habe keine Antworten, daher dachte ich mir, warf das Netz ein wenig breiter.

Wenn habe ich ausgelassen, das wäre hilfreich, bitte lassen Sie mich wissen. Vielen Dank im Voraus für Ihre Hilfe.

Schreibe einen Kommentar