Я недавно построил Tweet A Watt (http://www.ladyada.net/make/tweetawatt/) беспроводной монитор мощности, который использует XBee для передачи данных. Я пытаюсь передать данные Tweet A Watt в процессинг для использования при создании некоторой визуальной энергии прототипы обратной связи. Использование библиотеки API обработки XBee (http://www.faludi.com/code/xbee-api-library-for-processing/),) Я добился определенных успехов, но натолкнулся на препятствие, которое я был бы признателен за любой вклад.
Мой эскиз Эскиза выглядит так:
/*
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(""); }
}
}
Это все работает как положено. XBeeEvent вызывается каждые 2 с и выводит правильные значения для идентификатора API, RSSI и Total Samples (19). Однако при выводе содержимого аналоговых показаний мне кажется, что первый образец повторяется 19 раз. Смотрите этот пример вывода:
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]
Как видите, первый образец повторяется 19 раз. Выполнение оригинального скрипта Python из программного обеспечения Tweet A Watt ( wattcher.py ) приводит к аналогичному чтению пакета XBee, но с 19 различными выборками. Это состояние, в которое я пытаюсь попасть при обработке.
В библиотеке API XBee функции getAnalog () и getAnalog (n) определены следующим образом:
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.
Я использую getAnalog (int n) в цикле для . Проблема в том, что я получаю только один «кадр» данных при вызове XBeeDataFrame data = xbee.getXBeeReading (); ?
Я также пытался читать последовательный пакет напрямую, без использования библиотеки API XBee (со ссылкой на (http://www.tigoe.net/pcomp/code/category/Processing/8), (http://processing.org/reference/libraries/serial/Serial.html), и (http://ssdl.stanford.edu/ssdl/images/stories/AA236/0708A/Lab/Rover/Parts/xbeeproproductmanual.pdf),), но у меня не было опыта в этой области это немного не стартер.
Если кто-то, знакомый с пакетом XBee, библиотекой API XBee или читающий Последовательные данные в Обработке, может помочь, это будет с благодарностью. Я ожидаю, что данные есть, я просто не получаю к ним доступ правильно Я понимаю, что это довольно специфический вопрос, и я разместил его в Adafruit (создатели набора Tweet A Watt - http://forums.adafruit.com/viewtopic.php?f=40&t=16067&sid=4e34727fa59b7c7d589564d2d6b85e46) и Processing (http://processing.org/discourse/yabb2/YaBB.pl?num=1276111549) форумы), но после десятков просмотров я у меня не было никаких ответов, поэтому я решил, что бросил сеть чуть шире.
Если я пропустил что-нибудь полезное, пожалуйста, дайте мне знать. Заранее спасибо за помощь.