1

入力の値をシリアルモニターに出力する光センサーがあります。これはほとんどトリップ ワイヤですが、オブジェクトが邪魔になると、1 ミリ秒ごとに値が出力されます。遅延を追加すると、遅延が完了するまで 2 番目のセンサーがトリガーされません。他のセンサーを妨害したり干渉したりすることなく、一度だけ印刷するにはどうすればよいですか?

void loop() {
  if (analogRead(sensor1) == 0) {     
    timer.start ();
    tStop = false;
    //Serial.println (timer.elapsed());
    Serial.println ("Start Time = 0");
  }
4

3 に答える 3

1

これは非常に興味深い問題です。通常のコンピューターの世界では、スレッド化によってこれを解決します。ただし、OS なしで実行しているため、コルーチン (OS を使用しない偽のスレッド) を実装するか、非同期コードと割り込みを使用するかのいずれかを行う必要があります。

私の理解では、オブジェクトが最初にセンサーの邪魔になったときに何かを印刷するということです.arduinoのunoは、当然のことではなく、コルーチンを実装するのが簡単ではないため、割り込みルートを試します.

まず、このライブラリに興味があるでしょうhttp://playground.arduino.cc/Code/Timer1 タイマーで実行する割り込みサービス ルーチンを追加できます。これには、ライブラリの attachInterrupt(function, period) 関数を使用します。

割り込みサービス ルーチンでは、センサーをチェックし、センサーが最後にトリガーされてからの経過時間を変数に設定し、必要に応じてメッセージを出力します。これは、メイン ループが他のコードを完全に自由に実行でき、他のセンサーをブロックしないことを意味します。

例えば:

void TimFun()
{
    static int LastRead;
    if(LastRead && (0 == analogRead(sensor1))
    {
        Serial.println("SensorTrip");
    }
    LastRead = analogRead(sensor1);
}

void loop()
{
    // Do other stuff here
}

void setup()
{
    Timer1.initialize(100000);
    Timer1.attachInterrupt(TimFun);
    // Rest of setup Here
}
于 2014-04-30T13:51:48.180 に答える
0

おそらく、2 回以上実行されないループのif代わりにを使用する必要があります。while

bool tripped = false;

void setup(){
    //setup stuff here
}

void loop() {
    if ( analogRead(sensor1) == 0 ) 
    {     
        timer.start ();
        tStop = false;

        if ( tripped == false ) 
        {
            Serial.println ("Start Time = 0");
            tripped = true;
        }
    }
}
于 2014-05-01T18:59:26.713 に答える
0

void セットアップの前になんとか int を作成し、while ループを使用しました。if ステートメントで。

int i = 1;

if (analogRead(sensor1) == 0) {     
  timer.start ();
  tStop = false;

while (i == 1) {
  Serial.println ("Start Time = 0");
  i++;
 }    
}
于 2014-05-01T10:39:04.740 に答える