Arduinoでdelayを使って待つプログラムを書いたが他のプログラムを動かしたいときは
TOP > てきとうにこらむ > プログラミング日記 > Arduinoでdelayを使って待つプログラムを書いたが他のプログラムを動かしたいときは
これをまとめた動画を作った。
Arduinoのdelay
Arduinoのdelay関数は、引数にミリ秒単位で数値を入れてあげるとその秒数分待ってくれる関数。
delay(1000); // 1秒待つ
これが次のようなプログラムならdelayで作れる。
- LEDをON
- 1秒待つ
- LEDをOFF
- 1秒待つ
しかし、この間にシリアル通信したいとか、プログラムを追加したいとなるとおかしなことになってしまう。
これを解決する方法はどうしたら良いだろうか。
1つめ millis関数を使って比較する
millis関数は、起動してからの時間をミリ秒単位で返す関数。これを、止める瞬間の時間をmillisで取得して、loop関数ごとに今と止めた時間とを引き算することで経過した秒数を求める。
2つめ threadを使う
Arduinoにはthreadは存在しないけど、それを擬似的に再現しているライブラリがあるので、探してみて使えるライブラリを使う。
今回は、CopyThreadを使ってみた。
これを使うと、delayの使い方でいけるので、すごく便利。
ソースコードは以下。
| #include <Cth.h> | |
| #define LED 13 | |
| void setup() { | |
| // put your setup code here, to run once: | |
| Serial.begin(9600); | |
| pinMode(LED, OUTPUT); | |
| Scheduler.startLoop(ledBlinkLoop); | |
| Scheduler.startLoop(serialPrintLoop); | |
| } | |
| void ledBlinkLoop() { | |
| digitalWrite(LED, HIGH); | |
| Scheduler.delay(1000); | |
| digitalWrite(LED, LOW); | |
| Scheduler.delay(1000); | |
| } | |
| void serialPrintLoop() { | |
| Serial.println("loop"); | |
| Scheduler.delay(3000); | |
| } | |
| void loop() { | |
| // put your main code here, to run repeatedly: | |
| Scheduler.yield(); | |
| } |
| #define LED 13 | |
| // LED timestamp blink timing | |
| unsigned long timestampLED = 0; | |
| int blinkMode = 0; | |
| unsigned long timestampSerialPrint = 0; | |
| void setup() { | |
| Serial.begin(9600); | |
| pinMode(LED, OUTPUT); | |
| } | |
| bool isExpiredTimestampLED(unsigned long ms) { | |
| if (millis() - timestampLED >= ms) { | |
| timestampLED = millis(); | |
| return true; | |
| } | |
| return false; | |
| } | |
| bool isExpiredTimestampSerialPrint(unsigned long ms) { | |
| if (millis() - timestampSerialPrint >= ms) { | |
| timestampSerialPrint = millis(); | |
| return true; | |
| } | |
| return false; | |
| } | |
| void loop() { | |
| if (isExpiredTimestampSerialPrint(3000)) { | |
| Serial.println("loop"); | |
| } | |
| if (isExpiredTimestampLED(1000)) { | |
| blinkMode = (blinkMode + 1) % 2; | |
| } else { | |
| return; | |
| } | |
| if (blinkMode == 0) { | |
| digitalWrite(LED, LOW); | |
| } else { | |
| digitalWrite(LED, HIGH); | |
| } | |
| } |


















