การควบคุมอุปกรณ์แสดงผล (LED) ด้วยสัญญาณดิจิทัลจาก ESP32 และการเขียนโปรแกรมควบคุมแบบพื้นฐานและแบบลำดับเหตุการณ์


🎯 จุดประสงค์การเรียนรู้

  1. เข้าใจหลักการทำงานของ Digital Output บนไมโครคอนโทรลเลอร์
  2. ต่อวงจรและควบคุม LED ให้เปิด–ปิดได้ด้วยโปรแกรม
  3. ใช้คำสั่ง digitalWrite(), delay(), และ pinMode() ได้ถูกต้อง
  4. สามารถสร้าง “ไฟกระพริบ”, “ไฟวิ่ง”, หรือ “ไฟเตือนสถานะ” ได้
  5. เขียนโปรแกรมประยุกต์ร่วมกับปุ่มกดได้ (LED Control Switch)

🧩 อุปกรณ์ที่ใช้

ลำดับรายการอุปกรณ์จำนวนหมายเหตุ
1บอร์ดไมโครคอนโทรลเลอร์ ICON-32 (ESP32)1ใช้เป็นบอร์ดหลัก
2LED สีแดง / สีเขียว / สีเหลือง3ใช้แสดงสถานะ
3ตัวต้านทาน 220 Ω3จำกัดกระแส LED
4สวิตช์กดติดปล่อยดับ1ใช้เปิด–ปิด LED (แบบฝึกหัดเพิ่มเติม)
5สาย Jumper6–8 เส้นสำหรับต่อ Breadboard

⚙️ 1. หลักการทำงานของ LED

LED (Light Emitting Diode) เป็นไดโอดเปล่งแสง มีขั้ว + (Anode) และ – (Cathode)

สัญลักษณ์คำอธิบาย
Anode (+)ต่อเข้าขา GPIO ผ่านตัวต้านทาน
Cathode (-)ต่อเข้ากับ GND
แรงดันตกคร่อม (Vf)ประมาณ 2.0V (แดง), 3.0V (ขาว/น้ำเงิน)
กระแสใช้งาน (If)ประมาณ 10–20 mA

⚡ ข้อควรระวัง

ห้ามต่อ LED เข้ากับ GPIO โดยตรง ต้องมีตัวต้านทานจำกัดกระแสเสมอ (220Ω–330Ω)


🔌 2. การต่อวงจร (Single LED)

C++
ICON-32 (ESP32)
   GPIO 2 ───[220Ω]──►|─── GND
                      LED

💻 โปรแกรมที่ 1: Blink LED (กระพริบไฟ)

C++
const int led = 2;  // ใช้ GPIO2

void setup() {
  pinMode(led, OUTPUT);  // กำหนดให้ขา led เป็น Output
}

void loop() {
  digitalWrite(led, HIGH);  // เปิดไฟ
  delay(500);               // หน่วงเวลา 0.5 วินาที
  digitalWrite(led, LOW);   // ปิดไฟ
  delay(500);
}

✅ โปรแกรมนี้เป็นพื้นฐานของ Arduino/ESP32 ทุกระบบ
ไฟจะติด–ดับสลับกันทุก 0.5 วินาที


💡 3. โปรแกรมที่ 2: LED Running (ไฟวิ่ง 3 ดวง)

🔌 การต่อวงจร

C++
GPIO 2 ──[220Ω]──►|─── GND
GPIO 4 ──[220Ω]──►|─── GND
GPIO 5 ──[220Ω]──►|─── GND

💻 โค้ดโปรแกรม

C++
int leds[] = {2, 4, 5};
int count = 3;

void setup() {
  for (int i = 0; i < count; i++) {
    pinMode(leds[i], OUTPUT);
  }
}

void loop() {
  for (int i = 0; i < count; i++) {
    digitalWrite(leds[i], HIGH);
    delay(200);
    digitalWrite(leds[i], LOW);
  }
}

🔹 ไฟจะวิ่งจากซ้ายไปขวา ทีละดวง
🔹 ใช้หลัก “Loop + Array” ซึ่งจะถูกใช้บ่อยมากในงานจริง


💡 4. โปรแกรมที่ 3: LED Toggle ด้วยปุ่มกด

🔌 การต่อวงจร

C++
GPIO 4 ── Button ── GND
GPIO 2 ──[220Ω]──► LED ─── GND

💻 โค้ดโปรแกรม

C++
const int button = 4;
const int led = 2;
bool ledState = false;
unsigned long lastPress = 0;

void setup() {
  pinMode(button, INPUT_PULLUP);
  pinMode(led, OUTPUT);
}

void loop() {
  if (digitalRead(button) == LOW && millis() - lastPress > 300) {
    ledState = !ledState;
    digitalWrite(led, ledState);
    lastPress = millis();
  }
}

✅ กดปุ่ม 1 ครั้ง = เปิดไฟ
✅ กดอีกครั้ง = ปิดไฟ
พร้อมระบบ Debounce กันการเด้งของปุ่ม


⚙️ 5. โปรแกรมที่ 4: Pattern Lighting (รูปแบบไฟ)

C++
const int button = 4;
const int led = 2;

int ledState = LOW;
int buttonState = HIGH;
int lastButtonState = HIGH;

unsigned long lastDebounceTime = 0;
long debounceDelay = 50;

void setup() {
  pinMode(button, INPUT_PULLUP);
  pinMode(led, OUTPUT);
  digitalWrite(led, ledState);
}

void loop() {
  int reading = digitalRead(button);
  if (reading != lastButtonState) {
    lastDebounceTime = millis();
  }
  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (reading != buttonState) {
      buttonState = reading;
      if (buttonState == LOW) {
        ledState = !ledState;
        digitalWrite(led, ledState);
      }
    }
  }
  
  lastButtonState = reading;
}

🎶 ใช้สร้างไฟกระพริบ “Running Light” แบบที่ใช้ในโชว์หรือป้ายโฆษณา


🧪 แบบฝึกหัดเพิ่มเติม

1️⃣ เขียนโปรแกรมเปิด–ปิด LED ตามจังหวะ (SOS pattern: … ––– …)
2️⃣ เขียนโปรแกรม “ไฟวิ่งกลับทาง” เมื่อกดปุ่ม
3️⃣ เขียนโปรแกรม “ไฟกระพริบเร็วขึ้นเรื่อย ๆ” ทุกครั้งที่กดปุ่ม
4️⃣ ใช้ LED 3 ดวงแทนไฟจราจร (แดง–เหลือง–เขียว)
5️⃣ แสดงสถานะอุณหภูมิจาก DHT11 ด้วย LED (เช่น ร้อน = สีแดง)


📊 ตารางเปรียบเทียบคำสั่ง Digital Output

คำสั่งหน้าที่ตัวอย่าง
pinMode(pin, OUTPUT)กำหนดขาเป็นขาออกpinMode(2, OUTPUT);
digitalWrite(pin, HIGH)จ่ายสัญญาณ 1 (3.3V)digitalWrite(2, HIGH);
digitalWrite(pin, LOW)จ่ายสัญญาณ 0 (0V)digitalWrite(2, LOW);
delay(ms)หน่วงเวลาdelay(500);
millis()เวลาที่ผ่านไปตั้งแต่เริ่ม (ms)ใช้จับเวลาโดยไม่หยุด Loop

🧠 สรุปแนวคิดสำคัญ

หัวข้อสรุป
Digital Outputการสั่งอุปกรณ์ให้ทำงานโดยส่งสัญญาณ HIGH/LOW
LED Indicatorใช้แสดงสถานะการทำงานของระบบ
pinMode() / digitalWrite()คำสั่งหลักในการควบคุมอุปกรณ์
delay()ใช้หน่วงเวลาเพื่อกำหนดจังหวะการทำงาน
millis()ใช้จับเวลาแบบไม่หยุดการทำงานของ Loop
การประยุกต์ไฟเตือน, ไฟวิ่ง, ไฟแสดงสถานะระบบ, Smart LED Control

📘 ภาพรวมแนวคิด

C++
GPIO ──[220Ω]──►|─── GND

     └── HIGH → LED ON
         LOW  → LED OFF