// โปรแกรมควบคุมขา Digital INPUT 04
//
int sw  = 16;			  	//ประกาศตัวแปรชื่อ sw มีค่าเท่ากับ  GP16
int led1 = 21;			  //ประกาศตัวแปรชื่อ led มีค่าเท่ากับ GP21
int led2 = 19;			  //ประกาศตัวแปรชื่อ led มีค่าเท่ากับ GP19
int led3 = 18;			  //ประกาศตัวแปรชื่อ led มีค่าเท่ากับ GP18
int flag1 = 0;        //ประกาศตัวแปรชื่อ flag1 มีค่าเท่ากับ "0"
int step = 1;         //ประกาศตัวแปรชื่อ step มีค่าเท่ากับ "1"
void setup()
{
  pinMode(sw, INPUT); 		//กำหนดขา GP16 เป็น Input
  pinMode(led1,OUTPUT); 	//กำหนดขา GP21 เป็น Output
  pinMode(led2,OUTPUT); 	//กำหนดขา GP19 เป็น Output
  pinMode(led3,OUTPUT); 	//กำหนดขา GP18 เป็น Output
  Serial.begin(9600); 		//คำสั่งเริ่มการสื่อกับคอมพิวเตอร์ผ่าน USB ด้วยความถี่ 9600
}
void loop(){
//put your main code here, to run repeatedly:
  if(digitalRead (sw)==LOW){
    delay(50);
    while(digitalRead(sw)==LOW){delay(50);}
    flag1 = !flag1;
    Serial.print("flag1=");
    Serial.println(flag1);
  }
 delay(500);
  if(flag1 == 1){
    switch(step){
		case 1:digitalWrite(led1, HIGH);
			   digitalWrite(led2, LOW);
			   digitalWrite(led3, LOW);
			   step=2;
			   break;
		case 2:digitalWrite(led1, LOW);
			   digitalWrite(led2, HIGH);
			   digitalWrite(led3, LOW);
			   step=3;
			   break;
		case 3:digitalWrite(led1, LOW);
			   digitalWrite(led2, LOW);
 			   digitalWrite (led3, HIGH);
			   step=1;
			   break;
  			}
  		}
}
/*
### อธิบายการทำงานของโค้ด:switch-case
1. **เริ่มต้น:**
   - ตัวแปร `step` ถูกกำหนดค่าเริ่มต้นเป็น `1` ซึ่งหมายความว่าในตอนแรกจะเข้าไปใน `case 1` ของ `switch`.
2. **`case 1`:**
   - เมื่อ `step == 1`:
     - LED 1 (`led1`) จะถูกเปิด (ตั้งค่าเป็น `HIGH`)
     - LED 2 (`led2`) และ LED 3 (`led3`) จะถูกปิด (ตั้งค่าเป็น `LOW`)
     - จากนั้นตัวแปร `step` จะถูกเปลี่ยนเป็น `2`
   - เมื่อทำงานใน `case 1` เสร็จแล้ว โปรแกรมจะหยุดทำงานในบล็อกนี้และออกไป (ด้วยคำสั่ง `break`).
3. **`case 2`:**
   - เมื่อ `step == 2` (จากการที่ใน `case 1` เราได้เปลี่ยนค่า `step` เป็น `2`):
     - LED 1 (`led1`) จะถูกปิด (ตั้งค่าเป็น `LOW`)
     - LED 2 (`led2`) จะถูกเปิด (ตั้งค่าเป็น `HIGH`)
     - LED 3 (`led3`) จะถูกปิด (ตั้งค่าเป็น `LOW`)
     - จากนั้นตัวแปร `step` จะถูกเปลี่ยนเป็น `3`
   - เมื่อทำงานใน `case 2` เสร็จแล้ว โปรแกรมจะหยุดทำงานในบล็อกนี้และออกไป (ด้วยคำสั่ง `break`).
4. **`case 3`:**
   - เมื่อ `step == 3` (จากการที่ใน `case 2` เราได้เปลี่ยนค่า `step` เป็น `3`):
     - LED 1 (`led1`) จะถูกปิด (ตั้งค่าเป็น `LOW`)
     - LED 2 (`led2`) จะถูกปิด (ตั้งค่าเป็น `LOW`)
     - LED 3 (`led3`) จะถูกเปิด (ตั้งค่าเป็น `HIGH`)
     - จากนั้นตัวแปร `step` จะถูกเปลี่ยนเป็น `1` เพื่อกลับไปเริ่มที่ `case 1`
   - เมื่อทำงานใน `case 3` เสร็จแล้ว โปรแกรมจะหยุดทำงานในบล็อกนี้และออกไป (ด้วยคำสั่ง `break`).
### ผลลัพธ์:
- เมื่อโปรแกรมเริ่มทำงาน มันจะเริ่มที่ `step = 1`, เปิด LED 1 และปิด LED 2 และ LED 3.
- หลังจากนั้น `step` จะเปลี่ยนเป็น `2`, LED 1 จะปิด, LED 2 จะเปิด, และ LED 3 จะปิด.
- จากนั้น `step` จะเปลี่ยนเป็น `3`, LED 1 และ LED 2 จะปิด, LED 3 จะเปิด.
- เมื่อถึง `step = 3`, ค่า `step` จะเปลี่ยนกลับเป็น `1`, และวงรอบจะเริ่มใหม่ (กลับไปที่ `case 1`).
### สรุป:
โค้ดนี้ทำการสลับเปิดปิด LED 3 ดวงในลำดับที่กำหนดไว้:
- LED 1 → เปิด, LED 2 และ LED 3 → ปิด (เมื่อ `step = 1`)
- LED 1 → ปิด, LED 2 → เปิด, LED 3 → ปิด (เมื่อ `step = 2`)
- LED 1 และ LED 2 → ปิด, LED 3 → เปิด (เมื่อ `step = 3`)
การทำงานของ `step` จะวนลูปไปเรื่อยๆ ทำให้ LED สลับการเปิด-ปิดในลำดับที่กำหนด.
*/ ความต้านทานต่อ LED = 470 Ω 
 ความต้านทานต่อ switch = 1 kΩ