Arduino のスケッチ例「Blink Without Delay」を試してみます。
TUTORIALS > Built-In Examples > 02.Digital > BlinkWithoutDelay
回路図では外部に LED を接続するようになっていますが、内蔵 LED を点滅させるので必要はありません。スケッチ例をそのまま IDE にコピーアンドペーストし、Arduino へ書き込めば完成ですね。
スケッチ例はコメントが多くて見にくいので、必要な部分だけ抜き出してみました。
-
const int ledPin = LED_BUILTIN;
-
int ledState = LOW;
-
unsigned long previousMillis = 0;
-
const long interval = 1000;
-
void setup() {
-
pinMode(ledPin, OUTPUT);
-
}
-
void loop() {
-
unsigned long currentMillis = millis();
-
if (currentMillis - previousMillis >= interval) {
-
previousMillis = currentMillis;
-
if (ledState == LOW) {
-
ledState = HIGH;
-
} else {
-
ledState = LOW;
-
}
-
digitalWrite(ledPin, ledState);
-
}
-
}
delay を使わずに、millis() でインターバル時間を超えたかどうかをチェックする方法ですね。
俺が気になったのは、LED の点滅のために ledState を反転させる部分 (16〜20行) です。if() で判定するのはとってもわかりやすいですが、別の方法に変更してみましょう。
-
ledState = ~ledState;
ledState を NOT 演算で反転させてみました。この場合は LOW=0 、HIGH=-1 となります。ビットがすべて反転しているということ。LED の点滅は正常に行われていますので、たぶん 1 ビット目の値で制御しているのでしょう。
NOT はビット単位の否定ですが、次の例はブーリアン値で反転させます。
-
ledState = !ledState;
出力は 0 と 1 になりました。この場合は、変数をブール型にして値は true – false とするべきなのでしょうね。
次の例は、1 ビット目だけを反転させる方法です。XOR 演算でビット操作しています。
-
ledState = ledState^1;
これは複合演算子を使って、
-
ledState ^= 1;
のように書くことができます。個人的にはこの方法が好きですが、理論的にどれがよいのかは、俺にはわかりません (^_^;)