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.