【问题标题】:Arduino freezes when trying to use Xively(Cosm) AND Pusher尝试使用 Xively(Cosm) AND Pusher 时,Arduino 冻结
【发布时间】:2013-06-28 06:14:00
【问题描述】:

我正在构建一个由 arduino 驱动的空调遥控器。我有与 pusher.com 合作的实际 IR 远程触发器,但现在想为房间温度和 AC 单元的当前状态添加 xively 馈送(打开或关闭,使用光敏电阻从电源 LED 读取)

当我将 Xively 代码添加到草图并上传时,arduino 冻结。我把它缩小到 int ret = xivelyclient.put(feed, xivelyKey);它从 xively 库中调用 put 函数。如果您将此行注释掉,则推送程序将照常运行。

如何让 pusher 和 xively 共存?他们是否在争夺以太网屏蔽上的连接? (我以为我读到以太网屏蔽可以同时处理 4 个连接)

代码如下:

#include <SPI.h>
#include <Ethernet.h>
#include <PusherClient.h>
#include <HttpClient.h>
#include <Xively.h>

byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEE };


PusherClient client;

 char xivelyKey[] = "myxivelykeyhere"; 
#define xivelyFeed 1454201282



int IRledPin =  8;    
int sensorPin = 0;



// Define the strings for our datastream IDs
char sensorId[] = "temp";
XivelyDatastream datastreams[] = {
  XivelyDatastream(sensorId, strlen(sensorId), DATASTREAM_FLOAT),
};

// Finally, wrap the datastreams into a feed
XivelyFeed feed(15552, datastreams, 1 /* number of datastreams */);
EthernetClient Eclient;
XivelyClient xivelyclient(Eclient);



void setup() {
  pinMode(IRledPin,OUTPUT);



  Serial.begin(9600);

  Serial.println("I'm Alive");

  if (Ethernet.begin(mac) == 0) {
    Serial.println("Init Ethernet failed");
    for(;;)
      ;
  }

  if(client.connect("336b1e021d66c95fad49")) {
    client.bind("togglePower", togglePower);

    client.subscribe("ac");
    Serial.println("Connected!");
  }
  else {
    while(1) {
    }
    Serial.println("Can't connect!!");
  }
}

void loop() {
  if (client.connected()) {
    client.monitor();
  }

  int reading = analogRead(sensorPin);  
  float voltage = reading * 5.0;
  voltage /= 1024.0; 
  float temperatureC = (voltage - 0.5) * 100 ;

 float temperatureF = (temperatureC * 9.0 / 5.0) + 32.0;
 Serial.print(temperatureF); Serial.println(" degrees F");


  datastreams[0].setFloat(temperatureF);
   Serial.println("Uploading it to Xively");
  int ret = xivelyclient.put(feed, xivelyKey);
  Serial.print("xivelyclient.put returned ");
//  Serial.println(ret);
  delay(8000);


}


void togglePower(String data) {
  Serial.println("togglePower() was triggered");  
  pulseIR(8860);
  delayMicroseconds(4360);
  pulseIR(600);
  delayMicroseconds(1580);
  pulseIR(600);
  delayMicroseconds(500);
  pulseIR(600);
  delayMicroseconds(480);
  pulseIR(600);
  delayMicroseconds(500);
  pulseIR(600);
  delayMicroseconds(480);
  pulseIR(600);
  delayMicroseconds(500);
  pulseIR(600);
  delayMicroseconds(500);
  pulseIR(580);
  delayMicroseconds(1600);
  pulseIR(600);
  delayMicroseconds(480);
  pulseIR(600);
  delayMicroseconds(1600);
  pulseIR(600);
  delayMicroseconds(1580);
  pulseIR(600);
  delayMicroseconds(500);
  pulseIR(580);
  delayMicroseconds(520);
  pulseIR(580);
  delayMicroseconds(1600);
  pulseIR(600);
  delayMicroseconds(1580);
  pulseIR(600);
  delayMicroseconds(500);
  pulseIR(600);
  delayMicroseconds(1580);
  pulseIR(600);
  delayMicroseconds(500);
  pulseIR(580);
  delayMicroseconds(500);
  pulseIR(600);
  delayMicroseconds(500);
  pulseIR(600);
  delayMicroseconds(500);
  pulseIR(580);
  delayMicroseconds(500);
  pulseIR(600);
  delayMicroseconds(500);
  pulseIR(580);
  delayMicroseconds(1600);
  pulseIR(580);
  delayMicroseconds(520);
  pulseIR(580);
  delayMicroseconds(1600);
  pulseIR(600);
  delayMicroseconds(1600);
  pulseIR(520);
  delayMicroseconds(1660);
  pulseIR(520);
  delayMicroseconds(1660);
  pulseIR(520);
  delayMicroseconds(1680);
  pulseIR(580);
  delayMicroseconds(1600);
  pulseIR(520);
  delayMicroseconds(580);
  pulseIR(520);
  delayMicroseconds(41480);
  pulseIR(8840);
  delayMicroseconds(2200);
  pulseIR(540);
  delayMicroseconds(28564);
  pulseIR(8880);
  delayMicroseconds(2140);
  pulseIR(560);

}
void pulseIR(long microsecs) {
  // we'll count down from the number of microseconds we are told to wait

  cli();  // this turns off any background interrupts

  while (microsecs > 0) {
    // 38 kHz is about 13 microseconds high and 13 microseconds low
    digitalWrite(IRledPin, HIGH);  // this takes about 3 microseconds to happen
    delayMicroseconds(10);         // hang out for 10 microseconds
    digitalWrite(IRledPin, LOW);   // this also takes about 3 microseconds
    delayMicroseconds(10);         // hang out for 10 microseconds

    // so 26 microseconds altogether
    microsecs -= 26;
  }

  sei();  // this turns them back on
}

【问题讨论】:

    标签: arduino pusher cosm xively


    【解决方案1】:

    您的 Arduino 很可能内存不足,您应该 measure it

    您也可以:

    • 在不使用库的情况下将数据发送到 Xively(示例可在 Arduino IDE
      文件 –» 示例 –» 以太网 –»(CosmClient、CosmClientString)下找到
      那些已经过时了,但应该仍然可以正常工作,你可能想用 Xively 替换 Cosm

    • 停止使用推送器,只使用ws://api.xively.com:8080/,这应该会为您提供非常
      类似的频道或整个设备供稿的发布/订阅功能

    第二个解决方案需要更多的工作和一个 JSON 解析器。但是,还有另一个选项 to use MQTT,您可以使用至少 v1.0 以来随 Arduino IDE 一起提供的 PubSub 库。与 WebSoket 端点不同,Xively 的 MQTT 桥不需要 JSON 解析器,并且可以使用 CSV 数据格式。然后,您可以非常轻松地在 JavaScript app 中使用 WebSocket,除非您已经在 Pusher 上实现了很多东西,否则我建议您仅将 MQTT 用于 Xively/Arduino。

    如果您仍然遇到一些内存问题,您应该使用包含的每个库的最基本示例来衡量使用情况。要获得快速简便的解决方案,您可以尝试使用Arduino Due,希望它也有更大的增长空间。

    【讨论】:

      【解决方案2】:

      您还应该考虑使用 http://devicehub.net,他们现在有一个非常简单的 HTTP api http://devicehub.net/about/api#api-guide,并且该平台是开源的,而不是 xively

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-30
        相关资源
        最近更新 更多