ส่วนที่ 1: ทบทวนและแนะนำ GPIO

  • ทบทวนสัปดาห์ที่ 1: สัปดาห์ที่แล้ว เราได้ “ปลุกชีพ” บอร์ด ESP32 ของเราแล้ว เราสามารถติดตั้งโปรแกรม, ทำให้ไฟ LED บนบอร์ด (Built-in LED) กะพริบ (Blink) และส่งข้อความทักทาย (Serial Print) ออกมาได้
  • GPIO คืออะไร?:
    • คำว่า GPIO ย่อมาจาก General Purpose Input/Output (พอร์ตอินพุต/เอาต์พุตเอนกประสงค์)
    • มันคือ “ขา” หรือ “พิน” (Pin) ที่อยู่บนบอร์ด ESP32

* คำว่า "เอนกประสงค์" (General Purpose) หมายความว่า เรา (คนเขียนโปรแกรม) สามารถ **กำหนดหน้าที่** ให้กับขาเหล่านี้ได้ ว่าจะให้มันทำหน้าที่เป็น **"ปาก" (Output)** เพื่อส่งสัญญาณออกไป หรือเป็น **"หู" (Input)** เพื่อรับสัญญาณเข้ามา

ส่วนที่ 2: สัญญาณดิจิทัล (Digital Signal)

  • คอมพิวเตอร์และไมโครคอนโทรลเลอร์ทำงานกับโลกของ ดิจิทัล
  • ดิจิทัล คือ สัญญาณที่มีเพียง 2 สถานะ ชัดเจน (ไม่ 0 ก็ 1)
  • ในโลกของ ESP32 (ที่ทำงานด้วยไฟเลี้ยง 3.3V):
    • สถานะ HIGH (สูง) หรือ 1 (จริง) = มีแรงดันไฟฟ้า 3.3 โวลต์
    • สถานะ LOW (ต่ำ) หรือ 0 (เท็จ) = มีแรงดันไฟฟ้า 0 โวลต์ (หรือ Ground)
  • เราจะเรียนวิธี “สั่ง” (Output) และ “อ่าน” (Input) สัญญาณดิจิทัลเหล่านี้

ส่วนที่ 3: Digital Output (การส่งสัญญาณดิจิทัลออก)

เราจะใช้ หลอด LED เป็นตัวอย่างคลาสสิกในการเรียนรู้เรื่อง Digital Output

1. พื้นฐานวงจร LED:

  • LED (Light Emitting Diode) มี 2 ขา: Anode (ขั้วบวก, ขา +, ขายาว) และ Cathode (ขั้วลบ, ขา -, ขาสั้น)
  • LED จะสว่างเมื่อมีกระแสไฟฟ้าไหลผ่าน (จาก + ไป -)
  • ข้อควรระวัง: LED รับกระแสไฟได้จำกัด! ถ้าเราต่อ LED (ที่ทนแรงดันได้ ~2.0V) เข้ากับขา ESP32 (ที่จ่ายไฟ 3.3V) ตรงๆ… LED จะขาดทันที!

2. กฎของโอห์ม และ ตัวต้านทานจำกัดกระแส (Current Limiting Resistor):

  • เราต้องจำกัดกระแสที่ไหลผ่าน LED ไม่ให้เกินค่าที่มันทนได้ (เช่น 15-20mA หรือ 0.015A)
  • เราใช้ ตัวต้านทาน (Resistor) มาต่ออนุกรม
  • กฎของโอห์ม: V=IR (แรงดัน = กระแส x ความต้านทาน)

  • การคำนวณ :
    • แรงดันจาก ESP32 (VSource​) = 3.3V
    • แรงดันตกคร่อม LED สีแดง (Vf​) = ~2.0V
    • กระแสที่ต้องการ (I) = 15mA (0.015A)
    • แรงดันที่ต้องตกคร่อม Resistor (VR​) = VSource​−Vf​=3.3V−2.0V=1.3V
    • หาค่า R=VR​/I=1.3V/0.015A≈87Ω
    • สรุป: เราสามารถใช้ค่ามาตรฐานที่หาซื้อง่าย คือ 220 Ω หรือ 330 Ω มาต่อได้เลย (ปลอดภัยและสว่างเพียงพอ)

3. คำสั่งในโค้ด Arduino:

  • pinMode(pin, OUTPUT);
    • เป็นคำสั่งที่ต้องใส่ใน void setup()
    • เป็นการ “บอก” ESP32 ว่า “ขาหมายเลข… (pin) นี้, ฉันจะใช้เป็น ‘ปาก’ (OUTPUT) นะ”
  • digitalWrite(pin, HIGH);
    • เป็นคำสั่งที่ใช้ใน void loop()
    • เป็นการ “สั่ง” ให้ขา (pin) ที่เราตั้งค่าไว้ “ปล่อยไฟ 3.3V” (HIGH) ออกไป (ผลคือ LED สว่าง)
  • digitalWrite(pin, LOW);
    • เป็นการ “สั่ง” ให้ขา (pin) “หยุดจ่ายไฟ” (LOW) หรือกลายเป็น 0V (ผลคือ LED ดับ)
  • delay(milliseconds);
    • คำสั่ง “หน่วงเวลา” หรือ “หยุดรอ” ตามเวลาที่กำหนด (หน่วยเป็นมิลลิวินาที)
    • delay(1000); = หยุดรอ 1 วินาที

ส่วนที่ 4: Digital Input (การรับสัญญาณดิจิทัลเข้า)

เราจะใช้ สวิตช์ปุ่มกด (Pushbutton Switch) เป็นตัวอย่างในการเรียนรู้เรื่อง Digital Input

1. ปัญหา “พินลอย” (Floating Pin):

  • เมื่อเราตั้งค่าขาเป็น INPUT (pinMode(pin, INPUT);)
  • ถ้าขานี้ ไม่ได้ต่ออยู่กับอะไรเลย (เช่น ตอนที่เรายังไม่กดสวิตช์) สถานะของมันจะ “ลอย” (Floating)
  • “ลอย” หมายความว่า ESP32 จะอ่านค่าได้แบบมั่วๆ (ได้ทั้ง HIGH และ LOW สลับไปมา) เพราะมันโดนสัญญาณรบกวนในอากาศ

2. วิธีแก้ปัญหา (การกำหนดสถานะเริ่มต้น): เราต้องบังคับให้ขามีสถานะ “เริ่มต้น” (Default) ที่แน่นอน โดยใช้ตัวต้านทาน Pull-up หรือ Pull-down

  • แบบที่ 1: Pull-down Resistor (ดึงลงกราวด์)
    • เราต่อ Resistor (เช่น 10k$\Omega$) ระหว่างขา Input กับ GND (0V)
    • สถานะปกติ (ไม่กดสวิตช์): ขา Input จะถูกดึงลง GND -> อ่านค่าได้ LOW
    • เมื่อกดสวิตช์ (ต่อกับ 3.3V): ขา Input จะได้รับไฟ 3.3V -> อ่านค่าได้ HIGH

  • แบบที่ 2: Pull-up Resistor (ดึงขึ้นไฟเลี้ยง)
    • เราต่อ Resistor (เช่น 10k$\Omega$) ระหว่างขา Input กับ VCC (3.3V)
    • สถานะปกติ (ไม่กดสวิตช์): ขา Input จะถูกดึงขึ้น 3.3V -> อ่านค่าได้ HIGH
    • เมื่อกดสวิตช์ (ต่อกับ GND): ขา Input จะถูกต่อลง GND -> อ่านค่าได้ LOW
    • (วิธีนี้เรียกว่า Active Low คือ ทำงานเมื่อเป็น LOW)

3. วิธีที่ง่ายที่สุด: Internal Pull-up (Pull-up ภายใน)

  • ข่าวดี! ในตัว ESP32 (และ Arduino) มีวงจร Pull-up Resistor (แบบที่ 2) อยู่ภายในตัวมันเองแล้ว! เราสามารถ “เปิดใช้งาน” มันได้ด้วยคำสั่งเดียว

4. คำสั่งในโค้ด Arduino:

  • pinMode(pin, INPUT_PULLUP);
    • เป็นคำสั่งที่ต้องใส่ใน void setup()
    • เป็นการ “บอก” ESP32 ว่า “ขาหมายเลข… (pin) นี้, ฉันจะใช้เป็น ‘หู’ (INPUT) และ ช่วยเปิดใช้ตัวต้านทาน Pull-up ภายใน ให้ด้วย”
    • ผล: สถานะปกติของขา (pin) นี้จะเป็น HIGH (1) เสมอ
  • digitalRead(pin);
    • เป็นคำสั่งที่ใช้ใน void loop()
    • เป็นการ “อ่าน” ค่าที่ขา (pin) ว่าตอนนี้เป็น HIGH หรือ LOW
    • เรามักจะเก็บค่าที่อ่านได้ไว้ในตัวแปร: int buttonState = digitalRead(pin);
  • ตรรกะการทำงาน (Logic) ของ INPUT_PULLUP:
    • ถ้า digitalRead(pin) ได้ค่า HIGH (1) = ไม่ได้กด สวิตช์
    • ถ้า digitalRead(pin) ได้ค่า LOW (0) = กำลังกด สวิตช์

ส่วนที่ 5: สรุปและเตรียมความพร้อมสู่ภาคปฏิบัติ

  • สรุปคำสั่ง 4 คำสั่งหลักของวันนี้:
    1. pinMode(pin, OUTPUT): ตั้งขาเป็น “ปาก”
    2. pinMode(pin, INPUT_PULLUP): ตั้งขาเป็น “หู” (แบบมี Pull-up)
    3. digitalWrite(pin, HIGH/LOW): “สั่ง” ให้ขาปล่อยไฟ (HIGH) หรือหยุด (LOW)
    4. digitalRead(pin): “อ่าน” ค่าที่ขา (ได้ HIGH หรือ LOW)
  • เชื่อมโยงสู่ภาคปฏิบัติ:
    • ในชั่วโมงปฏิบัติต่อไป (Lab 2) เราจะมาทดลองต่อวงจร LED ภายนอก และต่อสวิตช์ปุ่มกด
    • เป้าหมายของ Lab คือ: “เขียนโปรแกรมอ่านค่าจากสวิตช์ (Input) เพื่อไปควบคุมการเปิด-ปิดไฟ LED (Output)”