アフィリエイト広告
アフィリエイト広告

Arduino スケッチ例 / Blink Without Delay

Arduino のスケッチ例「Blink Without Delay」を試してみます。

TUTORIALS Built-In Examples > 02.Digital > BlinkWithoutDelay

回路図では外部に LED を接続するようになっていますが、内蔵 LED を点滅させるので必要はありません。スケッチ例をそのまま IDE にコピーアンドペーストし、Arduino へ書き込めば完成ですね。

スケッチ例はコメントが多くて見にくいので、必要な部分だけ抜き出してみました。

  1. const int ledPin = LED_BUILTIN;
  2. int ledState = LOW;
  3. unsigned long previousMillis = 0;
  4. const long interval = 1000;
  5. void setup() {
  6.   pinMode(ledPin, OUTPUT);
  7. }
  8. void loop() {
  9.   unsigned long currentMillis = millis();
  10.   if (currentMillis - previousMillis >= interval) {
  11.     previousMillis = currentMillis;
  12.     if (ledState == LOW) {
  13.       ledState = HIGH;
  14.     } else {
  15.       ledState = LOW;
  16.     }
  17.     digitalWrite(ledPin, ledState);
  18.   }
  19. }

delay を使わずに、millis() でインターバル時間を超えたかどうかをチェックする方法ですね。

俺が気になったのは、LED の点滅のために ledState を反転させる部分 (16〜20行) です。if() で判定するのはとってもわかりやすいですが、別の方法に変更してみましょう。

  1.     ledState = ~ledState;

ledState を NOT 演算で反転させてみました。この場合は LOW=0 、HIGH=-1 となります。ビットがすべて反転しているということ。LED の点滅は正常に行われていますので、たぶん 1 ビット目の値で制御しているのでしょう。

NOT はビット単位の否定ですが、次の例はブーリアン値で反転させます。

  1.     ledState = !ledState;

出力は 0 と 1 になりました。この場合は、変数をブール型にして値は true – false とするべきなのでしょうね。

次の例は、1 ビット目だけを反転させる方法です。XOR 演算でビット操作しています。

  1.     ledState = ledState^1;

これは複合演算子を使って、

  1.     ledState ^= 1;

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

タイトルとURLをコピーしました