Arduino отправляет данные в Xively

у меня есть несколько датчиков температуры и влажности, подключенных к плате arduino mega (DHT22, DS18b20,...). В моей программе я получаю температуру от датчиков, помещаю их в поток данных и отправляю в Xiviely, и здесь возникает проблема. Когда я помещаю в поток поддельное число с плавающей запятой (например, число с плавающей запятой 100.12), я получаю ответ клиента «xivelyclient.put return 200», ведь это нормально, но когда я помещаю реальные данные (температура или влажность) с датчиков в поток данных, я не получить ответ от Xively. (на этом программа останавливается и иногда через несколько минут Xively возвращает -3 или что-то в этом роде).

Код, который отлично работает:

/*OUTSIDE ANY METHOD*/
XivelyDatastream datastreamsRekuperator[] = {
XivelyDatastream("01-T-zunanji", strlen("01-T-zunanji"), DATASTREAM_FLOAT),
XivelyDatastream("02-T-notranji", strlen("02-T-notranji"), DATASTREAM_FLOAT),
XivelyDatastream("03-T-odvod", strlen("03-T-odvod"), DATASTREAM_FLOAT),
XivelyDatastream("04-T-vpih", strlen("04-T-vpih"), DATASTREAM_FLOAT),
XivelyDatastream("05-T-kanal", strlen("05-T-kanal"), DATASTREAM_FLOAT),
XivelyDatastream("06-V-zunanji", strlen("06-V-zunanji"), DATASTREAM_FLOAT),
XivelyDatastream("07-V-notranji", strlen("07-V-notranji"), DATASTREAM_FLOAT),
XivelyDatastream("08-V-odvod", strlen("08-V-odvod"), DATASTREAM_FLOAT),
XivelyDatastream("09-V-vpih", strlen("09-V-vpih"), DATASTREAM_FLOAT),
XivelyDatastream("10-V-kanal", strlen("10-V-kanal"), DATASTREAM_FLOAT),
};

XivelyFeed rekuperatorFeed(XXXXXXXXX, datastreamsRekuperator, 10/* number of datastreams */);

/*IN LOOP METHOD*/
datastreamsRekuperator[0].setFloat(100.12);
datastreamsRekuperator[1].setFloat(100.12);
datastreamsRekuperator[2].setFloat(100.12);
datastreamsRekuperator[3].setFloat(100.12); 
datastreamsRekuperator[4].setFloat(100.12);
datastreamsRekuperator[5].setFloat(100.12);
datastreamsRekuperator[6].setFloat(100.12);
datastreamsRekuperator[7].setFloat(100.12); 
datastreamsRekuperator[8].setFloat(100.12);
datastreamsRekuperator[9].setFloat(100.12);

Serial.println("Uploading it to Xively");
int retRekuperator = xivelyclient.put(rekuperatorFeed, xivelyKey);
Serial.print("xivelyclient.put returned ");
Serial.println(retRekuperator);

Код, который не работает:

/*OUTSIDE ANY METHOD*/
XivelyDatastream datastreamsRekuperator[] = {
XivelyDatastream("01-T-zunanji", strlen("01-T-zunanji"), DATASTREAM_FLOAT),
XivelyDatastream("02-T-notranji", strlen("02-T-notranji"), DATASTREAM_FLOAT),
XivelyDatastream("03-T-odvod", strlen("03-T-odvod"), DATASTREAM_FLOAT),
XivelyDatastream("04-T-vpih", strlen("04-T-vpih"), DATASTREAM_FLOAT),
XivelyDatastream("05-T-kanal", strlen("05-T-kanal"), DATASTREAM_FLOAT),
XivelyDatastream("06-V-zunanji", strlen("06-V-zunanji"), DATASTREAM_FLOAT),
XivelyDatastream("07-V-notranji", strlen("07-V-notranji"), DATASTREAM_FLOAT),
XivelyDatastream("08-V-odvod", strlen("08-V-odvod"), DATASTREAM_FLOAT),
XivelyDatastream("09-V-vpih", strlen("09-V-vpih"), DATASTREAM_FLOAT),
XivelyDatastream("10-V-kanal", strlen("10-V-kanal"), DATASTREAM_FLOAT),
};

XivelyFeed rekuperatorFeed(XXXXXXXXX, datastreamsRekuperator, 10/* number of datastreams */);

/*IN LOOP METHOD*/
datastreamsRekuperator[0].setFloat(getTemperatureDHT22(6));
datastreamsRekuperator[1].setFloat(getTemperatureDHT22(7));
datastreamsRekuperator[2].setFloat(getTemperatureDHT22(8));
datastreamsRekuperator[3].setFloat(getTemperatureDHT22(9)); 
datastreamsRekuperator[4].setFloat(getTemperatureDHT22(10));
datastreamsRekuperator[5].setFloat(getHumidityDHT22(6));
datastreamsRekuperator[6].setFloat(getHumidityDHT22(7));
datastreamsRekuperator[7].setFloat(getHumidityDHT22(8));    
datastreamsRekuperator[8].setFloat(getHumidityDHT22(9));
datastreamsRekuperator[9].setFloat(getHumidityDHT22(10));

Serial.println("Uploading it to Xively");
int retRekuperator = xivelyclient.put(rekuperatorFeed, xivelyKey);
Serial.print("xivelyclient.put returned ");
Serial.println(retRekuperator);

Метод getTemperature (по такому же принципу создается getHumidity):

float getTemperatureDHT22(int DHT22_PIN){
  DHT22 myDHT22(DHT22_PIN);
  delay(2000); //DHT22 can be read every 2s
  DHT22_ERROR_t errorCode = myDHT22.readData();
  if(errorCode==DHT_ERROR_NONE){
      Serial.print("Pin ");
      Serial.print(DHT22_PIN);
      Serial.print(" ");
      Serial.println(myDHT22.getTemperatureC());
      return myDHT22.getTemperatureC();
  }
  else{
      Serial.print("Pin ");
      Serial.print(DHT22_PIN);
      Serial.println(" No data");
      return 0.0;
  }
}

Единственная разница в коде заключается в том, что «100.12» заменяется на «getTemperatureDHT22 (PIN)» или «getHumidityDHT22 (PIN)».

Ответ из рабочего кода:

Uploading it to Xively
xivelyclient.put returned 200

Ответ от нерабочего кода:

Pin 6 17.40
Pin 7 20.70
Pin 8 19.90
Pin 9 16.40
Pin 10 19.10
Pin 6 50.10
Pin 7 52.50
Pin 8 51.20
Pin 9 44.00
Pin 10 45.20
Uploading it to Xively
/*HERE THE PROGRAM STOPS*/

Кто-нибудь знает, что может пойти не так? Я действительно был бы благодарен за любой ответ и любое предложение. Спасибо.


person Hugo    schedule 19.03.2014    source источник


Ответы (1)


Я вижу, что внутри твоего

float getTemperatureDHT22(int DHT22_PIN) {

функции, вы знаете, что DHT22 требует ожидания 2 секунды перед выполнением последовательных чтений, и вы учитываете это в начале процедуры. Однако в нижней части

if(errorCode==DHT_ERROR_NONE) {

блок, вы выполняете два последовательных чтения DHT22 без задержки:

  ...
  Serial.println(myDHT22.getTemperatureC());
  return myDHT22.getTemperatureC();
}

Либо сделайте один вызов, сохранив возвращаемое значение в локальной переменной, либо распечатайте и верните эту переменную, либо просто закомментируйте Serial.println(myDHT22.getTemperatureC()); и посмотрите, как у вас получится.

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ:

===============

Требуется некоторое пояснение, потому что это может зависеть от библиотеки. В версии библиотеки DHT22, которую я использую, единственным вызовом, который фактически опрашивает датчик для приведенного выше кода, будет

      DHT22_ERROR_t errorCode = myDHT22.readData();

Требование 2-секундной задержки между последовательными вызовами относится к вызовам этого метода. Напротив, вызовы getTemperatureC() и getHumidity() возвращают только переменные класса DHT22. Эти вызовы не опрашивают датчик и не требуют задержки, опять же в той библиотеке, которую я сейчас использую.

Проверьте свою версию библиотечного файла DHT22.cpp, чтобы быть абсолютно уверенным. Если getTemperatureC() ничего не делает, кроме return _lastTemperature;, то последовательные вызовы getTemperatureC() и getHumidity() не требуют дополнительных задержек. Просто помните, что они не будут обновлены до следующего вызова readData().

===============

Соображения по поводу экрана Ethernet и выбора контактов DHT22:

Следующее, что я заметил, это то, что вы используете контакт 10 для одного из ваших датчиков. Вы заявили, что используете Mega. Хотя вы не указываете, я предполагаю, что вы используете Rev 3 Mega и Ethernet-шилд Arduino (проводной) на основе Ethernet-чипа Wiznet W5100 (надеюсь, это предположение верно, поскольку следующее применимо к это оборудование). Требования к защитному экрану Ethernet на Uno и Mega 2560 R3:

На обеих платах контакт 10 используется для выбора W5100, а контакт 4 — для SD-карты. Эти выводы нельзя использовать для общего ввода-вывода. На Mega аппаратный контакт SS, 53, не используется для выбора ни W5100, ни SD-карты, но его необходимо оставить в качестве выхода, иначе интерфейс SPI не будет работать. http://arduino.cc/en/Main/ArduinoEthernetShield

Поэтому следующее, что нужно попробовать, это

  1. Сдвиньте DHT22 с контакта 10.
  2. Установите контакт 53 в качестве выхода
  3. Если вы используете указанный выше экран Ethernet и не используете SD-карту, установите контакт 4 на выход и запишите его высоким уровнем (см. ссылку выше).

Тогда, пожалуйста, отчитайтесь.

person avr6130    schedule 24.03.2014
comment
Омг, спасибо, я вообще этого не заметил... Должен ли я задержать 2 секунды после вызова DHT22_ERROR_t errorCode = myDHT22.readData(); или этот вызов не является напрямую сенсорным вызовом? - person Hugo; 26.03.2014
comment
Я пытался использовать локальную переменную: float temp = myDHT22.getTemperatureC(); а затем я использовал эту переменную, но она по-прежнему не возвращает xively site, та же проблема, о которой я писал там. - person Hugo; 26.03.2014
comment
Хьюго, я начал добавлять комментарии здесь, но у меня было слишком много информации, поэтому я удалил комментарий и внес существенные изменения выше. Пожалуйста, смотрите мой оригинальный пост для дополнений. - person avr6130; 28.03.2014
comment
Спасибо, вы полагаете правильно. Но моя проблема не в считывании датчиков, проблема в том, что я не получаю код 200 OK от Xively. Я распечатываю температуру и влажность с датчиков, и показания идут хорошо. Когда я отправляю поддельные данные в Xively, он всегда возвращает мне 200, но когда я отправляю настоящие данные в Xively, он мне ничего не возвращает. И еще я заметил кое-что, когда я публикую 3 реальных температуры и 7 фальшивых в одном потоке, я получаю ответ (200), но когда я помещаю 4 реальных температуры и 6 фальшивых, то опять же, я не получаю отклик... - person Hugo; 02.04.2014
comment
Не за что, с удовольствием. Я не предполагаю, что у вас возникнут проблемы со считыванием показаний датчиков (из вашего комментария), скорее, датчик на контакте 10 будет мешать связи Ethernet (проблема, с которой вы столкнулись). Простите меня за то, что я снова указал на это, но вы не сказали в своем ответе, поэтому вы внесли изменения в свои соединения, больше не используя контакт 10 (и соответственно установили контакты 4 и 53)? У меня есть другое предложение относительно области видимости переменных, глобального пространства и пространства стека, но я подожду, пока вы не ответите, если вам это интересно. Может, мы докопаемся до сути. - person avr6130; 02.04.2014
comment
Привет, во-первых, извините за такую ​​задержку. Я сделал то, что вы предложили в предыдущем посте (DHT22 с контакта 10 переместился на контакт 5, установил контакты 53 и 4 в качестве выходных), и это сработало, поэтому, очевидно, контакт 10 мешал Ethernet, большое спасибо! - person Hugo; 25.04.2014
comment
Теперь мне нужно решить еще одну проблему: когда я подключаю еще 8 датчиков DS18b20 к контакту 3, он получает адреса датчиков и печатает их, просто все температуры, которые я получаю, равны 4095,94 (что не может быть реальным). Также, когда я отправляю эти значения в Xively, я получаю сообщение об ошибке -403. Есть идеи? - person Hugo; 25.04.2014
comment
Хьюго. Рад, что ваша первоначальная проблема решена. Что я с уважением предлагаю вам сделать, так это проголосовать за ответ и отметить эту тему как решенную (не знаю, являются ли это двумя разными действиями). Таким образом будущие посетители увидят, что информация является точной и полезной. Если возможно, вы также можете изменить исходный вопрос и добавить слова Mega и Ethernet Shield (что-то вроде Arduino Mega, Ethernet Shield и отправка данных в Xively, потому что это была ваша реальная проблема — и решение ... Это опять же поможет будущим посетителям. - person avr6130; 28.04.2014
comment
Поскольку ваш следующий вопрос совершенно не связан с этим, я предлагаю вам начать новую тему, задав вопрос об использовании нескольких датчиков DS18B20, потому что ваша проблема, вероятно, не связана с Xively. В противном случае мало кто найдет его похороненным в комментариях. И чтобы вы начали, я предлагаю вам сначала заставить работать один, а затем добавить один или два. Эти датчики - самые чувствительные устройства для Arduino, которые я лично использовал - пока взорвал два из них :-). На самом деле я перешел на термисторы. - person avr6130; 28.04.2014
comment
Еще раз спасибо, я проверил ответ как правильный, я здесь новичок, поэтому я не знал, что должен это делать :) Я уже подключил 15 датчиков DS18b20 на той же плате, и они работают нормально, просто эти 8 возвращают такую ​​забавную температуру :) ок, еще раз спасибо, я попытаюсь решить это самостоятельно, и если я не успею, я опубликую новый вопрос. - person Hugo; 28.04.2014