0

我正在建造一个由 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
}
4

2 回答 2

1

很可能您的 Arduino 刚刚用完 RAM,您应该对其进行测量

或者,您可以:

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

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

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

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

于 2013-05-30T20:52:22.557 回答
0

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

于 2013-06-27T22:14:00.467 回答