ふわふわ光る
単純な点滅ならもう怖くない、というところまで来たかなぁ、と思います。
ではもう一歩踏み込んでみましょう。ちょっと凝った点灯方法、ふわ~っと点灯、ふわ~っと消灯させてみましょうか。
まずは1個ふわふわ
最後には複数でふわふわしてもらいますが、まずは一個だけ、これは何も考えずシングルタスクで行ってみましょう。
//Program 1.1
const int LED1 = 11;
void setup() {
pinMode(LED1, OUTPUT);
}
void loop() {
for (int bright = 0; bright < 256; bright++) {
analogWrite(LED1, bright);
delay(4); // 4ms*256=約1秒かけてじわじわ点灯
}
delay(500);
for (int bright = 255; bright >= 0; bright--) {
analogWrite(LED1, bright);
delay(4); // 約1秒かけてじわじわ消灯
}
delay(500);
}
これでふわふわ光ります。では、これを2個のLEDで、別々の周期で光らせてみましょう。
今まで同じように100ミリ秒毎にloop()を回して...としようとしても、今回は
for (int bright = 0; bright < 256; bright++) {
analogWrite(LED1, bright);
delay(4); // 4ms*256=約1秒かけてじわじわ点灯
}
このループに入ってから抜けるまで約1秒かかってしまいます。そうするともう1個のLEDはその間なにもできない...なので、このループもバラバラに分解しなければいけません。
このループはどういう動作をしているか考えてみましょう。
最初、brightに0を設定して
LEDにbrightの輝度を設定して
4ミリ秒待って
brightを1増やして
LEDにbrightの輝度を設定して
4ミリ秒待って
brightを1増やして
LEDにbrightの輝度を設定して
4ミリ秒待って
これを256回繰り返して
最大輝度のまま
4ミリ秒待って
4ミリ秒待って
これを500ミリ秒分だから125回繰り返して
brightに255を設定して
LEDにbrightの輝度を設定して
4ミリ秒待って
brightを1減らして
LEDにbrightの輝度を設定して
4ミリ秒待って
これを256回繰り返して
輝度0のまま
4ミリ秒待って
これを500ミリ秒分だから125回繰り返して
ということになります。 待ち時間が共通で4ミリ秒、これまでのパターンに持ち込めそうです。
// Program 1.2
const int LED1 = 11;
void setup() {
pinMode(LED1, OUTPUT);
}
int bright;
int count;
void loop() {
if (count++ == 0) {
bright = 0;
} else if (count < 255) {
bright++;
} else if (count < 255 + 125) {
bright = 255;
} else if (count < 255 + 125 + 255) {
bright--;
} else if (count < 255 + 125 + 255 + 125) {
bright = 0;
} else {
count = 0;
}
analogWrite(LED1, bright);
delay(4);
}
では2個に
ここまでくれば、2個目のLEDの追加も今までと同じパターンですね。
// Program 1.3
const int LED1 = 11;
const int LED2 = 10;
void setup() {
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
}
int bright1, bright2;
int count1, count2;
void loop() {
if (count1++ == 0) {
bright1 = 0;
} else if (count1 < 255) {
bright1++;
} else if (count1 < 255 + 125) {
bright1 = 255;
} else if (count1 < 255 + 125 + 255) {
bright1--;
} else if (count1 < 255 + 125 + 255 + 125) {
bright1 = 0;
} else {
count1 = 0;
}
if (count2++ == 0) {
bright2 = 0;
} else if (count2 < 255) {
bright2++;
} else if (count2 < 255 + 200) {
bright2 = 255;
} else if (count2 < 255 + 200 + 255) {
bright2--;
} else if (count2 < 255 + 200 + 255 + 200) {
bright2 = 0;
} else {
count2 = 0;
}
analogWrite(LED1, bright1);
analogWrite(LED2, bright2);
delay(4);
}
ちょっとした応用だけでしたので、今回はこんな感じで...というか、そろそろネタ切れ連載?終わりかなぁ。
あとは、マルチタスクとは直接には関係のないテクニックをちょっと紹介してシメにしましょうか
投稿者の人気記事
-
thkana
さんが
2022/05/03
に
編集
をしました。
(メッセージ: 初版)
ログインしてコメントを投稿する