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