Arduino将数据发送到Xively

时间:2014-03-19 10:00:05

标签: arduino sensor xively data-stream

我有多个温度和湿度传感器连接到arduino板巨型(DHT22,DS18b20,...)在我的程序中,我从传感器获得温度,我把它们放入数据流并发送到Xiviely,这里来了问题。当我把假浮动数放入流中时(例如浮点数100.12)我得到客户回复“xivelyclient.put返回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*/

有人知道它可能出错吗?我真的很感谢任何回复和任何建议。谢谢。

1 个答案:

答案 0 :(得分: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()之前,它们不会更新。

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

以太网屏蔽和DHT22引脚选择的注意事项:

接下来我注意到你正在使用 Pin 10 作为你的一个传感器。你说你正在使用Mega。虽然您没有指定,但我将假设您正在使用Mega的Rev 3和基于Wiznet W5100以太网芯片的Arduino以太网屏蔽(有线)(希望这个假设是正确的,因为以下适用于那个硬件)。 Uno和Mega 2560 R3上以太网屏蔽的要求是:

  

在两块板上,引脚10用于选择W5100和引脚4   SD卡。这些引脚不能用于通用I / O.在Mega上,   硬件SS引脚53不用于选择W5100或SD   卡,但它必须保持为输出或SPI接口不会   工作。   http://arduino.cc/en/Main/ArduinoEthernetShield

因此,下一步要尝试的是

  1. 将DHT22从引脚10移开
  2. 将引脚53设置为输出
  3. 如果使用上述以太网屏蔽,并且您没有使用SD卡,请将引脚4设置为输出并将其写入高电平(参见上面的链接)
  4. 然后请回报。