ループ内の他の条件とそのコードが一定時間後に実行されなかった場合、ループ内で関数を実行するには何を使用できますか? 遅らせることはできますか、それとも他の機能がありますか?
9 に答える
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
}
}
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
}
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に保存して取得します。
私の友人であるdelay()とdelayMicroseconds()は、あなたのすべての助けになります。
他の回答に関する限り。
mills() - Arduino ボードが現在のプログラムの実行を開始してからのミリ秒数を返します。この数は、約 50 日後にオーバーフローします (ゼロに戻ります)。
参照:http ://arduino.cc/en/Reference/millis
同様に、
micros () - Arduino ボードが現在のプログラムの実行を開始してからのマイクロ秒数を返します。参照: http://arduino.cc/en/Reference/Micros
あなたのケースでうまくいくには、これら2つに少し取り組む必要があると思います。
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/
以下のサンプルコードを使用できます。ここでは、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();
}
定期的な時間指定イベントを実行できるMetro ライブラリを試してみてください。必要に応じて、ループ内でタイマーの頻度を変更できます。
これがあなたが探しているものだと思います
これらのタイマー ルーチンには多くのバージョンがありますが、いずれも、タイムアウトに達したかタイムアウトを超えた場合に、ミリス() からタイマー変数をリセットすることを前提としています。違う。忙しくてタイムスロットを過ぎてしまった場合はどうなるでしょうか。
では、50ms ごとに何かをしたいとしましょう。遅延が発生し、最後のチェックから 55 ミリ秒経過したとしましょう。確認します... タイマー変数を上書きして、50 ミリ秒で一致することを確認します。しかし、今は 5 ミリ秒遅れています。遅れたことを補う必要があり、この時点でオーバーフローが発生した場合はどうなりますか....