สวัสดีครับนักศึกษาทุกคน ในบทที่แล้วเราได้ทดสอบบอร์ดด้วยโปรแกรมไฟกระพริบง่ายๆ ไปแล้ว วันนี้เราจะมาลงมือ “ต่อวงจรจริง” กันครับ

การเรียน IoT นั้น สิ่งที่ต้องแม่นยำคือความเข้าใจเรื่อง Input และ Output ในบทนี้เราจะโฟกัสที่ Digital Output หรือการสั่งให้ขาของ ESP32 จ่ายไฟออกมาเพื่อควบคุมอุปกรณ์ภายนอก เช่น หลอด LED, รีเลย์ หรือส่งสัญญาณไปทริกเกอร์วงจรอื่น ๆ พร้อมกับเรียนรู้โครงสร้างภาษา C++ ว่า void setup กับ void loop ต่างกันอย่างไร


1. โครงสร้างพื้นฐานของ Arduino Sketch (C++)

เวลาเราเขียนโปรแกรมใน Arduino IDE ไฟล์งานของเราจะเรียกว่า “Sketch” ซึ่งต้องประกอบด้วยฟังก์ชันบังคับ 2 ส่วนเสมอ คือ:

1. void setup()

  • ทำหน้าที่อะไร: เป็นส่วน “เตรียมความพร้อม” เช่น กำหนดว่าขาไหนเป็น Input ขาไหนเป็น Output หรือเริ่มการเชื่อมต่อ WiFi
  • ทำงานตอนไหน: ทำงาน “แค่ครั้งเดียว” ตอนเริ่มจ่ายไฟเข้าบอร์ด หรือตอนกดปุ่ม Reset

2. void loop()

  • ทำหน้าที่อะไร: เป็นส่วน “การทำงานหลัก” ที่บรรจุคำสั่งต่างๆ
  • ทำงานตอนไหน: ทำงาน “วนซ้ำไปเรื่อยๆ ไม่มีวันจบ” (Loop) จนกว่าจะถอดปลั๊ก

ตัวอย่างการเปรียบเทียบ:

ถ้าเปรียบกับการเปิดร้านอาหาร setup() คือการจัดโต๊ะ เปิดไฟ เตรียมครัว (ทำครั้งเดียวตอนเช้า) ส่วน loop() คือการรับออเดอร์ ทำอาหาร เสิร์ฟ (ทำวนไปเรื่อยๆ ตลอดทั้งวัน)


2. คำสั่งสำคัญสำหรับ Digital Output

ในการควบคุมอุปกรณ์ เราจะใช้ 3 คำสั่งหลัก:

  1. pinMode(pin, mode);
    • ใช้ใน setup() เพื่อบอกว่าขา Pin นี้จะใช้ทำอะไร
    • pin = หมายเลขขา (เช่น 23)
    • mode = OUTPUT (ส่งไฟออก) หรือ INPUT (รับค่าเข้า)
  2. digitalWrite(pin, value);
    • สั่งให้ขา Pin จ่ายไฟหรือไม่จ่ายไฟ
    • value = HIGH (จ่ายไฟ 3.3V = ไฟติด) หรือ LOW (หยุดจ่ายไฟ 0V = ไฟดับ)
  3. delay(ms);
    • สั่งให้โปรแกรม “หยุดรอ” หน่วยเป็นมิลลิวินาที (1000 ms = 1 วินาที)

3. ปฏิบัติการ: ต่อวงจรควบคุม LED ภายนอก

PinDescription
1First pin
2Second pin
ชื่อคำอธิบาย
ขา AAnode (ขาบวก)
ขา CCathode (ขาลบ)

เราจะมาลองต่อ LED สีแดง 1 ดวง เข้ากับขา GPIO 23 ของ ESP32 กันครับ

อุปกรณ์ที่ต้องใช้:

  1. บอร์ด ESP32
  2. โฟโต้บอร์ด (Breadboard)
  3. หลอด LED (สีใดก็ได้)
  4. ตัวต้านทาน (Resistor) ขนาด 220Ω หรือ 330Ω
  5. สาย Jumper

ทำไมต้องมีตัวต้านทาน? (สำคัญมากสำหรับเด็กอิเล็กฯ) ขา GPIO ของ ESP32 จ่ายไฟออกมา 3.3V แต่หลอด LED สีแดงทั่วไปต้องการแรงดันตกคร่อมเพียงแค่ประมาณ 1.8V – 2.0V ถ้าเราต่อตรงๆ กระแสไฟจะไหลเกิน (Over Current) ทำให้ LED ขาด หรือแย่กว่านั้นคือ ขา GPIO ของ ESP32 อาจจะไหม้ได้

สูตรคำนวณ: R = (Vsource – Vled) / I R = (3.3V – 2.0V) / 0.015A ≈ 86Ω ในการใช้งานจริง เราใช้ค่า 220Ω หรือ 330Ω เพื่อความปลอดภัยและหาง่ายครับ

ผังการต่อวงจร:

  1. ขาบวก (Anode) ของ LED → ต่อเข้ากับตัวต้านทาน → ต่อเข้ากับขา GPIO 23 (หรือขา D23)
  2. ขาลบ (Cathode) ของ LED → ต่อลง GND ของบอร์ด ESP32

4. เขียนโค้ดควบคุม

คัดลอกโค้ดนี้ลงใน Arduino IDE แล้ว Upload ดูผลลัพธ์ครับ

C++
// กำหนดชื่อขาให้เรียกง่ายๆ (Best Practice)
const int ledPin = 23; 

void setup() {
  // กำหนดให้ขา ledPin เป็น Output เพื่อจ่ายไฟ
  pinMode(ledPin, OUTPUT);
}

void loop() {
  digitalWrite(ledPin, HIGH);  // จ่ายไฟ 3.3V (ไฟติด)
  delay(500);                  // รอ 0.5 วินาที
  digitalWrite(ledPin, LOW);   // หยุดจ่ายไฟ 0V (ไฟดับ)
  delay(500);                  // รอ 0.5 วินาที
}

5. โจทย์ท้าทาย (Challenge)

เพื่อทดสอบความเข้าใจ ให้นักศึกษาลองดัดแปลงวงจรและโค้ดดังนี้:

  1. ต่อ LED เพิ่มอีก 2 ดวง (รวมเป็น 3 ดวง: แดง, เหลือง, เขียว) ที่ขา 23, 22, 21
  2. เขียนโปรแกรมให้ไฟวิ่งเป็นลำดับเหมือน “สัญญาณไฟจราจร”
    • แดงติด 5 วินาที -> ดับ
    • เขียวติด 5 วินาที -> ดับ
    • เหลืองติด 2 วินาที -> ดับ
    • วนลูปกลับไปที่แดง

สรุปท้ายบท

วันนี้เราได้เรียนรู้โครงสร้างพื้นฐานของโปรแกรม และได้ลงมือต่อวงจร Output จริงๆ ซึ่งเป็นหัวใจสำคัญของการสั่งงานอุปกรณ์ IoT ในอนาคต (หลักการเดียวกันนี้ใช้กับการสั่งเปิด-ปิด Relay เพื่อคุมหลอดไฟบ้าน 220V ได้เลยครับ)

ภารกิจต่อไป: เมื่อเรา “สั่งงาน” ได้แล้ว บทต่อไปเราต้องเรียนรู้วิธี “รับคำสั่ง” บ้าง ในบทความหน้าเราจะมาเรียนเรื่อง Digital Input การอ่านค่าจากปุ่มกด (Switch) เพื่อนำมาควบคุมไฟ LED กันครับ