12

ループ内の他の条件とそのコードが一定時間後に実行されなかった場合、ループ内で関数を実行するには何を使用できますか? 遅らせることはできますか、それとも他の機能がありますか?

4

9 に答える 9

13

Arduinoには内部クロックがないため、実装できないと思います。

EDIT : millis()関数を 使用して、ボードの開始からの時間を計算することができます。

unsigned long previousMillis = 0; // last time update
long interval = 2000; // interval at which to do something (milliseconds)

void setup(){
}

void loop(){
  unsigned long currentMillis = millis();

  if(currentMillis - previousMillis > interval) {
     previousMillis = currentMillis;  

     // do something
  }
}
于 2012-05-27T11:05:21.430 に答える
6

Arduinoタイマー割り込みを試してください。プロセッサは 16 MHz のクロックと見なすことができるため、外部ライブラリや追加のハードウェアは必要ありません。

#include <avr/io.h>
#include <avr/interrupt.h>

void setup ()
{

  // INITIALIZE TIMER INTERRUPTS
  cli(); // disable global interrupts

  TCCR1A = 0; // set entire TCCR1A register to 0
  TCCR1B = 0; // same for TCCR1B

  OCR1A = 15624; // set compare match register to desired timer count. 16 MHz with 1024 prescaler = 15624 counts/s
  TCCR1B |= (1 << WGM12); // turn on CTC mode. clear timer on compare match

  TCCR1B |= (1 << CS10); // Set CS10 and CS12 bits for 1024 prescaler
  TCCR1B |= (1 << CS12);

  TIMSK1 |= (1 << OCIE1A); // enable timer compare interrupt

  sei(); // enable global interrupts

}

// TIMER VECTOR, gets called once a second (depends on prescaler and match register)
ISR(TIMER1_COMPA_vect)
{
  // do your timeing based stuff here
}

割り込みに関する詳細情報が必要ですか?

于 2013-08-16T13:14:24.143 に答える
1

millis()arduinoの再起動後もタイムアウトを維持したい場合を除いて、この関数は通常、これに対して十分に機能します。

some_condition最後に会った時間を追跡するTimerクラスを実装します。

class Timer
{
public:
    Timer(void);
    void set_max_delay(unsigned long v);
    void set(void);
    boolean check(void);
private:
    unsigned long max_delay;
    unsigned long last_set;
};

Timer::Timer(void)
{
    max_delay = 3600000UL; // default 1 hour
}

void Timer::set_max_delay(unsigned long v)
{
    max_delay = v;
    set();
}

void Timer::set()
{
    last_set = millis();
}

boolean Timer::check()
{
    unsigned long now = millis();
    if (now - last_set > max_delay) {
        last_set = now;
        return true;
    }
    return false;
}

Timer timer;

void setup()
{
   timer.set_max_delay(60000); // 1 minute
}

void loop()
{
   boolean some_condition = false;
   if (some_condition) {
       timer.set();
   }
   if (timer.check()) {
      // nothing happened for a long time
   }
   delay(500);
}

some_condition満たされない限りlast_set、タイマーの値は更新されません。最終的にはcheck()が返されます(値を設定するときtrueに、間隔ごとに1回)check()last_set

チェックがプロセッサのリセット後も存続する必要がある場合は、バッテリバックアップ(リアルタイム)クロックを必要としlast_set、EEPROMに保存して取得します。

于 2012-05-31T18:51:08.910 に答える
1

私の友人であるdelay()delayMicroseconds()は、あなたのすべての助けになります。

他の回答に関する限り。

mills() - Arduino ボードが現在のプログラムの実行を開始してからのミリ秒数を返します。この数は、約 50 日後にオーバーフローします (ゼロに戻ります)。

参照:http ://arduino.cc/en/Reference/millis

同様に、

micros () - Arduino ボードが現在のプログラムの実行を開始してからのマイクロ秒数を返します。参照: http://arduino.cc/en/Reference/Micros

あなたのケースでうまくいくには、これら2つに少し取り組む必要があると思います。

于 2013-04-18T07:06:18.103 に答える
1

Arduino の再起動後も存続するタイマーは、外部部品なしでは実装できません。問題は、リセットがトリガーされた時間を把握する手段がないことです。さらに、ブートローダーは再起動中に不明な時間を消費する場合があります。したがって、外部リアルタイム クロックが必要になります。

イベントの期間実行に関して、私のお気に入りは msTimer2 ライブラリです。私の例のいくつかについては、ここを参照してください。

http://blog.blinkenlight.net/experiments/basic-effects/persistence-of-vision/

http://blog.blinkenlight.net/experiments/removing-flicker/heartbeat/

http://blog.blinkenlight.net/experiments/basic-effects/lighthouses/

于 2013-02-04T18:09:19.283 に答える
1

以下のサンプルコードを使用できます。ここでは、1msごとにステップを繰り返します。

#include <SimpleTimer.h>

// the timer object
SimpleTimer timer;

// a function to be executed periodically
void repeatMe() 
{
  Serial.print("Uptime (s): ");
  Serial.println(millis() / 1000);
}

void setup()
{
  Serial.begin(9600);
  timer.setInterval(1000, repeatMe);
}

void loop() 
{
  timer.run();
}
于 2014-01-08T12:42:48.067 に答える
1

定期的な時間指定イベントを実行できるMetro ライブラリを試してみてください。必要に応じて、ループ内でタイマーの頻度を変更できます。

于 2012-05-29T17:43:30.537 に答える
1

これがあなたが探しているものだと思います

http://playground.arduino.cc/Code/time

于 2013-01-07T15:28:30.543 に答える
1

これらのタイマー ルーチンには多くのバージョンがありますが、いずれも、タイムアウトに達したかタイムアウトを超えた場合に、ミリス() からタイマー変数をリセットすることを前提としています。違う。忙しくてタイムスロットを過ぎてしまった場合はどうなるでしょうか。

では、50ms ごとに何かをしたいとしましょう。遅延が発生し、最後のチェックから 55 ミリ秒経過したとしましょう。確認します... タイマー変数を上書きして、50 ミリ秒で一致することを確認します。しかし、今は 5 ミリ秒遅れています。遅れたことを補う必要があり、この時点でオーバーフローが発生した場合はどうなりますか....

于 2012-06-25T13:02:23.897 に答える