Arduino зависает при попытке использовать Xively(Cosm) и Pusher

Я строю пульт кондиционера с питанием от Arduino. У меня есть фактический инфракрасный дистанционный триггер, работающий с pusher.com, но теперь я хочу добавить xively каналы для температуры в комнате и текущего состояния блока переменного тока (включено или выключено, считывание с индикатора питания с помощью фоторезистора)

Когда я добавляю код Xively в эскиз и загружаю его, arduino зависает. Я сузил его до int ret = xivelyclient.put(feed, xivelyKey); которая вызывает функцию put из библиотеки xively. Если вы прокомментируете эту строку, материал-толкач работает как обычно.

Как сделать так, чтобы толчок и сосуществование сосуществовали? Они конкурируют за соединения на сетевом экране? (Я думал, что я прочитал, что экран Ethernet может обрабатывать 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
}

2 ответа

Решение

Скорее всего, ваш Arduino просто не хватает оперативной памяти, вы должны измерить его

В качестве альтернативы вы могли бы:

  • отправлять данные в Xively без использования библиотеки (примеры можно найти в Arduino IDE
    в разделе Файл - "Примеры -" Ethernet - "(CosmClient, CosmClientString)
    они устарели, но все равно должны работать, вы можете заменить Cosm на Xively

  • прекратить использование толкателя и просто использовать ws://api.xively.com:8080/ что должно дать вам очень
    аналогичные функции публикации / подписки для каналов или каналов всего устройства

Второе решение потребует немного больше работы и парсера JSON. Однако есть еще один вариант использования MQTT, для которого вы можете использовать библиотеку PubSub, которая поставляется с IDE Arduino начиная с версии не ниже 1.0. В отличие от конечной точки WebSoket, для моста MQTT Xively не требуется анализатор JSON, и с ним можно использовать формат данных CSV. Затем вы можете очень легко использовать WebSocket в приложении JavaScript, если только вы не реализовали много вещей на Predher, я бы порекомендовал просто использовать MQTT для Xively/Arduino.

Если вы все еще сталкиваетесь с какой-то проблемой с памятью, вы должны измерить использование с помощью самого простого примера для каждой библиотеки, которую вы включили. Для быстрого и легкого решения вы всегда можете попробовать использовать Arduino Due, надеюсь, у него будет больше возможностей для роста.

Вам также следует подумать об использовании http://devicehub.net/, у них сейчас действительно очень простой HTTP API http://devicehub.net/about/api, а платформа - с открытым исходным кодом, а не с xively.

Другие вопросы по тегам