

以下のif文の中は100ミリ秒に一回だけ実行されるべきですが、200ミリ秒ごとに実行され、二回分の処理が行われています。  
なにがいけないのでしょうか？

[code]

    if (millis() % 100 == 0) {...}
    
[/code]


CC BY-SA 4.0
2022-11-05T15:48:54.387
92020
2022-11-05T16:52:59.253
2022-11-05T16:29:47.167
3060
54273
question
arduino
Attiny85 で millis 関数を使った if 文が意図した通り動かない


そのコードは文字通り「ミリ秒で時刻を取得した際に、それが100で割り切れた時」に動作してます。なので1度割り切れたのちに時間が1ミリ秒も経過しないまま次回が実行されると続けてヒットしますし、逆に運が悪いと1度も割り切れない可能性すらあります。

ですので意図通りに実装するなら、最後に実行した時刻を記録しておき、そこから100ミリ秒以上経過していたら再度実行する、というコードが必要です。いかにその参考コードを示します。

[code]

    static int last = 0;
    
    int now = millis();
    if ((now - last) >= 100) {
        last = now;
        // TODO: ここに100ミリ秒毎に実行したい処理を書く
    }
    
[/code]

このコードは、そのままコピペでは動かない可能性が高いので、適宜書き換えて利用してください。


CC BY-SA 4.0
2022-11-05T16:52:59.253
92021
2022-11-05T16:52:59.253
208
92020
answer