所以我在最近收购了Arduino Yun之后使用Temboo,但是我在通过组合Choreos来获取和发布数据时遇到了问题。
我正在使用Yahoo GetWeatherByAddress Choreo并尝试将我想要的各个值发布到Xively Feed。我正在使用Xively Write Choreo并以JSON格式输入FeedData。
到目前为止,我已经取得了一些成功,一次发布2个值(湿度和压力)。不幸的是,我想要使用更多,并具有湿度,温度,WeatherConditions(公平,有风等)和面包板的LDR读数。所以它每10秒循环一次,读取所有这些值,然后将它们发布到Xively。如果我没有取消注释温度值,则温度值似乎甚至会打印到串行监视器。它也没有经历整个过程(返回Http 200成功)它发布了值,直接“等待”下一组要检索的值。我在哪里错了?
/*
YahooWeather
This example code is in the public domain.
*/
#include <Bridge.h>
#include <Temboo.h>
#include "TembooAccount.h" // contains Temboo account information
// the address for which a weather forecast will be retrieved
String ADDRESS_FOR_FORECAST = "Plymouth, United Kingdom";
int numRuns = 1; // execution count, so that this doesn't run forever
int maxRuns = 10; // max number of times the Yahoo WeatherByAddress Choreo should be run
String pData;
String qData;
String rData;
String tData;
String cData;
void setup() {
Serial.begin(9600);
// for debugging, wait until a serial console is connected
delay(4000);
while(!Serial);
Bridge.begin();
pinMode(A0, INPUT);
pinMode(13, OUTPUT);
}
void loop()
{
if (numRuns <= maxRuns) {
int sensorValue = analogRead(A0);
if (sensorValue < 100) {
digitalWrite(13,HIGH);
delay(1000);
digitalWrite(13,LOW);
}
// while we haven't reached the max number of runs...
Serial.println("Sensor value: " + String(sensorValue)); }
TembooChoreo WriteDataChoreo;
// Invoke the Temboo client
WriteDataChoreo.begin();
// Set Temboo account credentials
WriteDataChoreo.setAccountName(TEMBOO_ACCOUNT);
WriteDataChoreo.setAppKeyName(TEMBOO_APP_KEY_NAME);
WriteDataChoreo.setAppKey(TEMBOO_APP_KEY);
// print status
Serial.println("Running GetWeatherByAddress - Run #" + String(numRuns++) + "...");
// create a TembooChoreo object to send a Choreo request to Temboo
TembooChoreo GetWeatherByAddressChoreo;
// invoke the Temboo client
GetWeatherByAddressChoreo.begin();
// add your temboo account info
GetWeatherByAddressChoreo.setAccountName(TEMBOO_ACCOUNT);
GetWeatherByAddressChoreo.setAppKeyName(TEMBOO_APP_KEY_NAME);
GetWeatherByAddressChoreo.setAppKey(TEMBOO_APP_KEY);
// set the name of the choreo we want to run
GetWeatherByAddressChoreo.setChoreo("/Library/Yahoo/Weather/GetWeatherByAddress");
// set choreo inputs; in this case, the address for which to retrieve weather data
// the Temboo client provides standardized calls to 100+ cloud APIs
GetWeatherByAddressChoreo.addInput("Address", ADDRESS_FOR_FORECAST);
// add an output filter to extract the name of the city.
GetWeatherByAddressChoreo.addOutputFilter("pressure", "/rss/channel/yweather:atmosphere/@pressure", "Response");
GetWeatherByAddressChoreo.addOutputFilter("humidity", "/rss/channel/yweather:atmosphere/@humidity", "Response");
GetWeatherByAddressChoreo.addOutputFilter("text", "/rss/channel/item/yweather:condition/@text", "Response");
// GetWeatherByAddressChoreo.addOutputFilter("temperature", "/rss/channel/item/yweather:condition/@temp", "Response"); //
// add an output filter to extract the current temperature
// add an output filter to extract the date and time of the last report.
// run the choreo
GetWeatherByAddressChoreo.run();
// parse the results and print them to the serial monitor
while(GetWeatherByAddressChoreo.available()) {
// read the name of the next output item
String name = GetWeatherByAddressChoreo.readStringUntil('\x1F');
name.trim(); // use “trim” to get rid of newlines
// read the value of the next output item
String data = GetWeatherByAddressChoreo.readStringUntil('\x1E');
data.trim(); // use “trim” to get rid of newlines
if (name == "humidity") {
qData = data;
Serial.println("The humidity is " + qData);
}
else if (name == "temperature") {
tData = data;
Serial.println("The temperature is " + tData);
}
else if (name == "pressure") {
rData = data;
Serial.println("The pressure is " + rData);
}
else if (name == "text") {
cData = data;
Serial.println("The code is " + cData);
}
}
WriteDataChoreo.addInput("FeedID", "1508368369");
WriteDataChoreo.addInput("APIKey", "6Z4tvi6jUOC0VhFkgngijR3bZWMXr2NNu1PHl4Js0hHGqE6C");
// WriteDataChoreo.addInput("FeedData", "{\"version\":\"1.0.0\",\"datastreams\":[ {\"id\" : \"Pressure\",\"current_value\" : \"" + rData + "\"} ,{\"id\" : \"Humidity\",\"current_value\" : \"" + qData + "\"} ,{\"id\" : \"Conditions\",\"current_value\" : \"" + cData + "\"}]}");
WriteDataChoreo.addInput("FeedData", "{\"version\":\"1.0.0\",\"datastreams\":[{\"id\":\"Humidity\",\"current_value\":\""+qData+"\"},{\"id\":\"Pressure\",\"current_value\":\""+rData+"\"},{\"id\":\"Conditions\",\"current_value\":\""+cData+"\"},{\"id\":\"Temp\",\"current_value\":\""+tData+"\"}]}");
// Identify the Choreo to run
// Identify the Choreo to run
WriteDataChoreo.setChoreo("/Library/Xively/ReadWriteData/WriteData");
// Run the Choreo; when results are available, print them to serial
WriteDataChoreo.run();
while(WriteDataChoreo.available()) {
char c = WriteDataChoreo.read();
//Serial.print(c);
}
while(GetWeatherByAddressChoreo.available()) {
char c = GetWeatherByAddressChoreo.read();
//Serial.print(c);
}
WriteDataChoreo.close();
GetWeatherByAddressChoreo.close();
Serial.println("");
Serial.println("Waiting...");
Serial.println("");
delay(10000); // wait 30 seconds between GetWeatherByAddress calls
}
答案 0 :(得分:2)
我在Temboo工作。我相信我们已经通过Temboo的支持解决了这个问题,所以我在这里回答这个问题。
通常,如果草图间歇性地工作而您没有更改任何代码,则可能是RAM耗尽(资源受限设备上的常见问题)。当你的电路板没有RAM时,它会导致Choreo输入数据在你的Yún的32U4侧被覆盖和损坏。您的草图可能正好在RAM限制,这解释了为什么它有时工作而不是其他工作,这取决于所涉及的String数据量。
你可以通过将不改变的输入(你的Temboo信用卡,你的Xively信用卡,你正在搜索的地址,任何其他静态字符串)放入存储在Linino端的设置文件中来释放一些RAM。 ,如以下链接所述:
https://temboo.com/arduino/using-settings-files
如果没有足够的内存,您可以通过消除任何不必要的串行或控制台打印语句来释放更多内容。
希望这有助于解决您所看到的问题。如果没有,请告诉我,我们会继续调查。
最后,这里有一些关于如何检查草图使用多少内存的信息:
祝你好运, 科马克