4.2 delayを使わず2つのLEDを点滅

§4.1のプログラムを改良し
delayを使わずに2個のLEDの点滅を行わせてみます。

プログラムを以下のようにしてみましょう

#define R_LED RED_LED
#define G_LED GREEN_LED

int RLedStat = LOW;
int GLedStat = LOW;

unsigned long preMillis1 = 0;  
unsigned long preMillis2 = 0;  
unsigned long interval1 = 500;
unsigned long interval2 = 2500;

void setup() {
  pinMode(R_LED, OUTPUT);      
  pinMode(G_LED, OUTPUT);      
}

void loop()
{
  unsigned long curMillis = millis();

  if(curMillis - preMillis1 > interval1) {
    if (RLedStat == LOW) {
       digitalWrite(R_LED, HIGH);
       RLedStat = HIGH;
    }
    else {
       digitalWrite(R_LED, LOW);
       RLedStat = LOW;
    }
    preMillis1 = curMillis;   
  }

  if(curMillis - preMillis2 > interval2) {
    if (GLedStat == LOW) {
       digitalWrite(G_LED, HIGH);
       GLedStat = HIGH;
    }
    else {
       digitalWrite(G_LED, LOW);
       GLedStat = LOW;
    }
    preMillis2 = curMillis;   
  }

}

§4.1のプログラムと比べ緑色のLEDを処理する部分が増えました

そのため赤色のLEDを扱う部分の名前を
LED → R_LED
LedState → RLedStat
preInterval → preInterval1
interval → interval1
とそれぞれ変更しています。

更に、緑色のLEDを扱うための名称や変数として
G_LED     : 緑色LEDのピン
GLedStat   : 緑色LEDの状態
preInterval2  : 緑色LEDの処理を前回行った時刻
interval2    : 緑色LEDの点滅間隔
を使用しています。

プログラムの流れは赤色と緑色で全く同じものを使用しているので
解説は§4.1に戻ってみてください。

今回は赤と緑という2種類のLEDでそれぞれプログラムが動作していますが
「LED」と「センサ」とか
「センサ」と「モーター」とか
別々の部品を扱うプログラムを記述しても
当然、一定時刻毎に各々のif文の中の処理が行われることになります。

0 件のコメント:

コメントを投稿