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;
のように書くことができます。個人的にはこの方法が好きですが、理論的にどれがよいのかは、俺にはわかりません (^_^;)

