1

いくつかのarduinoコードに問題があります。私が見つけたイーサネットチュートリアルコードと私が見つけたいくつかのIRエミッターとレシーバーコードを使用していて、それらを組み合わせようとしています。

http://www.ladyada.net/learn/sensors/ir.html

http://g33k.blogspot.com/2010/09/arduino-data-webserver-sample-web.html

どちらのコードもそれ自体で正常に機能します。

コードはコンパイルされますが、次のvoid IRDetector()を呼び出すと、機能しません。私はそれをデバッグしましたが、これまでのところ、変数uint8_tまたはuint16_tを使用すると見つかりました(これらをintとlongに置き換えてみました)。uint8_tを使用するには、ライブラリをインポートする必要がありますか?何かご意見は?

どんな助けでもいただければ幸いです。

 uint16_t pulses[100][2];  // pair is high and low pulse 
   uint8_t currentpulse = 0; // index for pulses we're storing

    uint8_t highpulse, lowpulse;  // temporary storage timing

      void IRDetectCode(void)
   {
    while(true){

highpulse = lowpulse = 0; // start out with no pulse length

while (IRpin_PIN & (1 << IRpin)) {
  // pin is still HIGH

  // count off another few microseconds
  highpulse++;
  delayMicroseconds(RESOLUTION);

  // If the pulse is too long, we 'timed out' - either nothing
  // was received or the code is finished, so print what
  // we've grabbed so far, and then reset
  if ((highpulse >= MAXPULSE) && (currentpulse != 0)) {
     Serial.print(" usec, ");
  //  printpulses();
    //currentpulse=0;
    return;
  }
}
// we didn't time out so lets stash the reading
pulses[currentpulse][0] = highpulse;

// same as above
while (! (IRpin_PIN & _BV(IRpin))) {
  // pin is still LOW
   Serial.print(" usec, ");
  lowpulse++;
  delayMicroseconds(RESOLUTION);
  if ((lowpulse >= MAXPULSE)  && (currentpulse != 0)) {
  //  printpulses();
  //  currentpulse=0;
    return;
  }
}
//pulses[currentpulse][1] = lowpulse;

          // we read one high-low pulse successfully, continue!
       currentpulse++;
  }
    }

  void printpulses(void) {
        Serial.println("\n\r\n\rReceived: \n\rOFF \tON");
         for (uint8_t i = 0; i < currentpulse; i++) {
            Serial.print(pulses[i][0] * RESOLUTION, DEC);
            Serial.print(" usec, ");
            Serial.print(pulses[i][1] * RESOLUTION, DEC);
            Serial.println(" usec");
           }

         // print it in a 'array' format
     Serial.println("int IRsignal[] = {");
     Serial.println("// ON, OFF (in 10's of microseconds)");
         for (uint8_t i = 0; i < currentpulse-1; i++) {
             Serial.print("\t"); // tab
             Serial.print(pulses[i][1] * RESOLUTION / 10, DEC);
             Serial.print(", ");
            Serial.print(pulses[i+1][0] * RESOLUTION / 10, DEC);
           Serial.println(",");
        }
          Serial.print("\t"); // tab
     Serial.print(pulses[currentpulse-1][1] * RESOLUTION / 10, DEC);
      Serial.print(", 0};");
        }
4

1 に答える 1

4

uint8_t は 8 ビットの符号なし整数です。Arduino では「バイト」と呼ばれるので、次のように使用できます。

for (byte i = 0; i < currentpulse; i++) {....

ATmega328 は 8 ビットであるため、Arduino の「int」型 (== int16_t) または「unsigned int」 (== uint16_t) を使用するよりもはるかに優れています。そのため、8 ビットの var を処理する方が高速です (大幅に)。

お役に立てば幸いです。

于 2012-05-30T12:06:41.087 に答える