【问题标题】:Arduino sending data to XivelyArduino 向 Xively 发送数据
【发布时间】:2014-03-19 10:00:05
【问题描述】:

我有多个温度和湿度传感器连接到 arduino board mega(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*/

有人知道它会出什么问题吗?我真的很感谢任何回复和任何建议。谢谢。

【问题讨论】:

    标签: arduino sensors xively data-stream


    【解决方案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。在兆丰, 硬件 SS 引脚 53 不用于选择 W5100 或 SD 卡,但它必须保留为输出,否则 SPI 接口不会 工作。 http://arduino.cc/en/Main/ArduinoEthernetShield

    因此,接下来要尝试的事情是

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

    那么请回来报告。

    【讨论】:

    • 天哪,谢谢,我根本没有注意到...我应该在调用“DHT22_ERROR_t errorCode = myDHT22.readData();”之后延迟 2 秒吗?或者这个调用不是直接的传感器调用?
    • 我尝试使用局部变量:float temp = myDHT22.getTemperatureC();然后我使用了那个变量,但它仍然没有得到 xively 站点的返回,和我在那里写的一样的问题。
    • Hugo,我开始在这里添加 cmets 但信息太多所以我删除了评论并在上面进行了重大更改。补充请看我的原帖。
    • 谢谢,您认为是正确的。但我的问题不在于读取传感器,问题是我没有从 Xively 收到代码 200 OK。我正在打印传感器的温度和湿度,并且读数正常。当我向 Xively 发布“假”数据时,它总是返回 200,但是当我向 Xively 发布真实数据时,它不会返回任何东西。我也注意到了一些事情,当我在同一个流中发布 3 个真实温度和 7 个“假”温度时,我得到了响应(200),但是当我放置 4 个真实温度和 6 个“假”温度时,又一次,我没有得到回应...
    • 不客气,我的荣幸。我并不是说您在读取传感器时会遇到问题(根据您的评论),而是 引脚 10 上的传感器会干扰以太网通信(您似乎遇到的问题)。请原谅我再次指出它,但您没有在回复中说,所以您是否对连接进行了更改,不再使用引脚 10(并相应地设置引脚 4 和 53)?关于变量范围、全局和堆栈空间,我有不同的建议,但如果您有兴趣,我会等到您回复。也许我们会追根究底。
    猜你喜欢
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多