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;
}
===============================================
動作画像