■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
トラックバック

■calendar

S M T W T F S
  12345
6789101112
13141516171819
20212223242526
2728293031  
<< October 2019 >>

■search this site.

■recommend

毎日貯まるポイントサイト ECナビ

■recommend

* 楽天ROOM *

■Twitter

■recommend

■recommend

■selected entries

■categories

■archives

■recent comment

■recent trackback

■links

■profile

■others

■mobile

qrcode

■powered

無料ブログ作成サービス JUGEM