質問のArduinoのコードは本当に動かしたものですか? イメージだけならそう明記して頂いたほうが悩まなくていいかな、と思うのですけど。最も一般的なArduino UNOであれば、SerialのTXとpin 1は共用(切り替え)ですから、pin1にLEDを繋ぎつつSerial.write()は成り立ちません。
delay処理でプログラムを止めない方法
delayはプログラムの動作を止める命令(関数)ですので、この時点で言っていることが滅茶苦茶です。
でも、例えば、1000msを待つのに1000ms一回ではなく10ms待ちを200回、という手段もあるわけです。1000ms連続で眠り込んでしまえばその間なにもできませんが、10ms毎に目を覚ませば、その間になにかしら作業を行うことはできます。
それを用いて、「起動後1秒間だけLEDが点灯する」というプログラムを考えるなら
Arduino
1const int DLY=10;
2const int PERIOD=1000;
3const int LEDPIN=13;
4
5int count;
6int ledStat=1;
7
8void setup(){
9 pinMode(LEDPIN,OUTPUT);
10 count=PERIOD/DLY;
11}
12
13void loop(){
14 if(count > 0){
15//この処理がcountが0になるまで、PERIOD/DLY回行われる。結果、1秒間LEDが点灯
16 ledStat = 1;
17 count--;
18 delay(DLY);
19 }else{
20 ledStat = 0;
21 }
22 digitalWrite(LEDPIN,ledStat);
23}
では、シリアルで'1'を受信してから1秒間点灯してみましょうか。
Arduino
1const int DLY = 10;
2const int PERIOD = 1000;
3const int LEDPIN = 13;
4
5int count;
6int ledStat = 1;
7
8void setup() {
9 Serial.begin(9600);
10 pinMode(LEDPIN, OUTPUT);
11 count = PERIOD / DLY;
12}
13
14void loop() {
15 byte var = Serial.read();
16 switch (var) {
17 case '1':
18 count = PERIOD / DLY; //countに1秒間動作を設定
19 break;
20 default:
21 break;
22 }
23 if (count > 0) {
24 ledStat = 1;
25 count--;
26 delay(DLY);
27 } else {
28 ledStat = 0;
29 }
30 digitalWrite(LEDPIN, ledStat);
31}
これだと、1を連続受信するとそこから1秒間点灯します。
もし最初に1を受信してから1秒間で消灯したいなら、カウントダウン中はカウンタに新しい設定をしなければいいわけで、
Arduino
1//loop()関数のみ変更
2void loop() {
3 byte var = Serial.read();
4 switch (var) {
5 case '1':
6 if (count <= 0) { //カウントダウン中でないときだけ
7 count = PERIOD / DLY; //1秒間動作開始
8 }
9 break;
10 default:
11 break;
12 }
13 if (count > 0) {
14 ledStat = 1;
15 count--;
16 delay(DLY);
17 } else {
18 ledStat = 0;
19 }
20 digitalWrite(LEDPIN, ledStat);
21}
あるいは、'1'を受信したときだけ10msLEDを点灯、その後1秒間'1'に反応させないととしたら
Arduino
1//loop()関数のみ変更
2void loop() {
3 byte var = Serial.read();
4 ledStat=0; //基本LEDは消灯
5 switch (var) {
6 case '1':
7 if (count <= 0) {
8 count = PERIOD / DLY;
9 ledStat=1; //1DLY周期だけLED点灯
10 }
11 break;
12 default:
13 break;
14 }
15 if (count > 0) {
16 count--;
17 delay(DLY);
18 }
19 digitalWrite(LEDPIN, ledStat);
20}
これに'2'とか'3'への対応を盛り込んでみれば、こんなところでしょうか。
Arduino
1const int DLY = 10;
2const int PERIOD = 1000;
3const int LEDPIN[3] = {2, 3, 4};
4
5int count;
6int ledStat;
7
8void setup() {
9 Serial.begin(9600);
10 for( int pin : LEDPIN){ //LEDPINの各要素について
11 pinMode(pin, OUTPUT);
12 }
13 count = PERIOD / DLY;
14}
15
16void loop() {
17 byte var = Serial.read();
18 ledStat = 0; //基本はLED消灯
19 switch (var) {
20 case '1':
21 if (count <= 0) {
22 count = PERIOD / DLY;
23 ledStat = 1; //LED1を点灯
24 }
25 break;
26 case '2':
27 //カウントダウン中でもおかまいなし
28 count = 1; //カウントダウン回数1
29 ledStat = 2; //LED2を点灯
30 break;
31 case '3':
32 count = 1;
33 ledStat = 3; //LED3を点灯
34 break;
35 default:
36 break;
37 }
38 if (count > 0) {
39 count--;
40 delay(DLY);
41 }
42 digitalWrite(LEDPIN[0], ledStat==1);
43 digitalWrite(LEDPIN[1], ledStat==2);
44 digitalWrite(LEDPIN[2], ledStat==3);
45}