0

arduinoボードメガ(DHT22、DS18b20、...)に接続された複数の温度センサーと湿度センサーがあります。私のプログラムでは、センサーから温度を取得し、それらをデータストリームに入れてXivielyに送信します。ここで問題が発生します。偽の浮動小数点数 (浮動小数点数 100.12 など) をストリームに入れると、クライアントから「xivelyclient.put が 200 を返しました」という応答が返されました。ザイブリーから回答を得る。(プログラムはそこで停止し、数分後に 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*/

何がうまくいかないのか誰か知っていますか?返信や提案に本当に感謝しています。ありがとうございました。

4

1 に答える 1

1

私はあなたの中にそれを見ます

float getTemperatureDHT22(int DHT22_PIN) {

DHT22 は連続して読み取る前に 2 秒間待機する必要があることを認識しており、手順の開始時にそれを考慮します。ただし、一番下には

if(errorCode==DHT_ERROR_NONE) {

ブロックすると、遅延なしで DHT22 の 2 つの連続した読み取りが行われます。

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

呼び出しを 1 回行い、戻り値をローカル変数に保存し、その変数を出力して返すか、単にコメント アウトして、Serial.println(myDHT22.getTemperatureC());どうなるかを確認します。

うまくいけば、それは役に立ちます。

編集:

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

これはライブラリに依存する可能性があるため、明確化が必要です。私が使用している DHT22 ライブラリのバージョンでは、上記のコードについて実際にセンサーに問い合わせる唯一の呼び出しは次のようになります。

      DHT22_ERROR_t errorCode = myDHT22.readData();

連続する呼び出し間の 2 秒の遅延要件は、そのメソッドの呼び出しに関連しています。対照的に、 と の呼び出しは、getTemperatureC()DHT22getHumidity()クラス変数のみを返します。これらの呼び出しはセンサーに問い合わせているわけではなく、私が現在使用しているライブラリでも遅延を必要としません。

DHT22.cpp ライブラリ ファイルのバージョンを確認して、確実に確認してください。が と を連続して呼び出すgetTemperatureC()以外に何もしない場合、追加の遅延は必要ありません。次の への呼び出しまで更新されないことに注意してください。return _lastTemperature;getTemperatureC()getHumidity()readData()

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

イーサネット シールドと DHT22 ピンの選択に関する考慮事項:

次に気付いたのは、センサーの 1 つにピン 10を使用していることです。あなたはメガを使用していると述べました。特定はしませんが、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 を出力に設定し、ハイに書き込みます (上記のリンクを参照)。

その後、ご報告ください。

于 2014-03-24T08:13:04.170 に答える