J'ai récemment construit un moniteur d'alimentation sans fil Tweet A Watt (http://www.ladyada.net/make/tweetawatt/), qui utilise XBee pour le transfert de données. J'essaye d'obtenir les données de Tweet A Watt dans le traitement pour la création de certains prototypes de retour d'énergie visuelle. En utilisant la bibliothèque d'API XBee pour le traitement (http://www.faludi.com/code/xbee-api-library-for-processing/), j'ai fait quelques progrès, mais je me suis heurté à un obstacle que j'apprécierais.Lecture des données XBee en traitement
esquisse Mon traitement ressemble à ceci:
/*
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(""); }
}
}
Tout cela fonctionne comme prévu. L'événement xBeeEvent est appelé toutes les 2 secondes et génère les valeurs correctes pour l'ID API, RSSI et Total Samples (19). Cependant, lors de la sortie du contenu des lectures analogiques, il me semble que le premier échantillon est répété 19 fois. Voir cet exemple de sortie:
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]
Comme vous pouvez le voir, le premier échantillon est répété 19 fois. L'exécution du script Python d'origine à partir du logiciel Tweet A Watt ( wattcher.py) génère une lecture similaire du paquet XBee, mais avec 19 échantillons distincts. C'est l'état que j'essaye d'obtenir dans le traitement.
Dans l'API XBee Library, les fonctions getAnalog() et getAnalog (n) sont définis comme suit:
getAnalog() – returns an array of integers that represents the current state of each analog channel with -1 indicating that the channel is not configured for analog. Use this when there is only one sample per frame. getAnalog(int n) – returns the nth sample of analog data as an array of integers with -1 indicating that the channel is not configured for analog.
J'utilise getAnalog (int n) dans la boucle. Est le problème que je reçois seulement un "cadre" de données, dans l'appel à XBeeDataFrame data = xbee.getXBeeReading();?
J'ai aussi essayé de lire le paquet de série directement sans utiliser l'API XBee Library (en référence à (http://www.tigoe.net/pcomp/code/category/Processing/8), (http://processing.org/reference/libraries/serial/Serial.html), et (http://ssdl.stanford.edu/ssdl/images/stories/AA236/0708A/Lab/Rover/Parts/xbeeproproductmanual.pdf), mais mon manque d'expérience dans ce domaine en fait un peu de
Si quelqu'un connaissant le paquet XBee, la bibliothèque d'API XBee, ou lisant des données de série dans le traitement peut vous aider, ce serait très apprécié Je m'attends à ce que les données soient là, je ne suis pas Je me rends compte que c'est une question assez spécifique, et je l'ai posté dans les forums Adafruit (fabricants du kit Tweet A Watt - http://forums.adafruit.com/viewtopic.php?f=40&t=16067&sid=4e34727fa59b7c7d589564d2d6b85e46) et Processing (http://processing.org/discourse/yabb2/YaBB.pl?num=1276111549), mais après des dizaines de points de vue je n'ai pas eu tout re des plis, alors je me suis dit que je devrais jeter le filet un peu plus large.
Si j'ai oublié quelque chose qui pourrait vous être utile, s'il vous plaît faites le moi savoir. Merci d'avance pour votre aide.