ArduinoのLEDチカのオブジェクト指向的サンプル | Tamesuke-Goto Maker的Blog

Tamesuke-Goto Maker的Blog

地域ISP管理者だけれど、ここ3年ほどMakerなJobが増えたのでまとめてみたいと思います 旧ハンドル Ringoro

ArduinoでのLチカサンプルはあちこちにありますが、どれもdigitalWriteとdelay()の組み合わせばかりであまり芸がありませんね。

例えば、N個のLEDをバラバラなタイミングで点滅させるとか、どうするか?

LED一個づつdigitalWriteしてdelayでタイミングを取っていたらメチャクチャで汚いコードになってしまいます。プログラムサイズも大きくなって、まあ収拾がつかないのではないか。

 

そこで、少し進んだやり方として構造体を使ったオブジェクト指向的なコードでLチカを書いてみました。ご参考下さい。

 

コードはこちら

===================================

 

/*
    Multi LED Blink  
*/


unsigned long tm;

/*
 * LED object
 */

struct led {
  int pin;   //  PIN No.
  bool on;   // ON/OFF status
  int cont;  // time count
  int ontime; // ON time (msec)
  int intval; // interval time (msec)
};

bool ledblink(struct led);

struct led led1={ 9,0,0, 900,1000};
struct led led2={10,0,0, 700,1100};
struct led led3={11,0,0, 600,1300};
struct led led4={12,0,0, 500,1500}


void setup() {
  pinMode(led1.pin, OUTPUT);
  pinMode(led2.pin, OUTPUT);
  pinMode(led3.pin, OUTPUT);
  pinMode(led4.pin, OUTPUT);
  tm=0;
}

void loop() {
    if(tm > millis()){
      return;
     }
  tm = millis()+1;

  ledblink(&led1);
  ledblink(&led2);
  ledblink(&led3);
  ledblink(&led4);

 

}

/*
 * LED Blink by struct led object
 *
 */

bool ledblink(struct led *myled)
{
  int pin=myled->pin;
  if(myled->cont++ == myled->ontime){
    digitalWrite(pin,false);
    myled->on=false;
    } else if(myled->cont >= myled->intval){
      digitalWrite(pin,true);
      myled->cont=0;
      myled->on=true;
    }
  return myled->on;
}

 

===============================================

動作画像

 

https://youtu.be/R4R1E_tYAYM