บทความ › อิเล็กทรอนิกส์

ต่อ LED กับ ESP32 ให้ถูก คำนวณ ตัวต้านทาน ด้วย Ohm's law

ทำไม LED ต้องมีตัวต้านทานเสมอ คำนวณค่าทีละขั้นสำหรับ ESP32 (3.3 V) และ Arduino Uno (5 V) เลือกขา GPIO ที่ปลอดภัย และโค้ดไฟกะพริบกับปุ่มกด

เริ่มต้น อ่าน 5 นาที 16 ตุลาคม 2569 โปรเจกต์ เมกเกอร์ ชิ้นแรก · บทที่ 1/3

อ่านจบแล้วจะรู้
  • LED ต้องมีตัวต้านทานจำกัดกระแสเสมอ เพราะตัว LED เองไม่จำกัดกระแส
  • สูตรเดียวที่ใช้: R = (แรงดันไฟเลี้ยง − แรงดันตกคร่อม LED) ÷ กระแสที่ต้องการ
  • ESP32 ใช้ไฟ 3.3 V ขาไม่ทน 5 V และมีบางขาที่ไม่ควรใช้ต่อ LED
  • วัดแรงดันคร่อมตัวต้านทานด้วยมัลติมิเตอร์ ก็รู้กระแสจริงได้โดยไม่ต้องตัดวงจร

โปรเจกต์แรกของคนเริ่มเล่นไมโครคอนโทรลเลอร์เกือบทุกคนคือทำให้ LED กะพริบ ฟังดูง่าย แต่ถ้าต่อ LED เข้าขา GPIO ตรง ๆ ไม่มีตัวต้านทาน อาจเสียทั้ง LED และขาของบอร์ด บทนี้อธิบายว่าทำไม คำนวณค่าตัวต้านทานทีละขั้น แล้วจบด้วยโค้ดที่ใช้ได้จริง

ตัวอย่างในบทใช้บอร์ด ESP32 DevKit (โมดูล ESP32-WROOM-32) เขียนโค้ดด้วย Arduino IDE 2 ที่ติดตั้ง arduino-esp32 core แล้ว

ทำไม LED ต่อตรงไม่ได้

LED คือไดโอด (diode) ชนิดหนึ่ง ถ้าแรงดันยังต่ำกว่าค่าหนึ่ง แทบไม่มีกระแสไหล พอแรงดันถึงค่านั้น ซึ่งเรียกว่า แรงดันตกคร่อม (forward voltage, Vf) กระแสจะพุ่งขึ้นเร็วมาก โดยตัว LED ไม่ได้ช่วยจำกัดกระแสเลย

ถ้าต่อตรง สิ่งเดียวที่จำกัดกระแสคือความต้านทานภายในของขา GPIO ผลคือ LED ได้กระแสเกินพิกัด และขาของชิปต้องจ่ายกระแสเกินที่ออกแบบไว้ บางครั้งไม่พังทันที แต่เสื่อมไปเรื่อย ๆ จนวันหนึ่งขานั้นใช้ไม่ได้

ตัวต้านทานที่ต่ออนุกรมกับ LED คือตัวกำหนดกระแส ไม่มีมัน ก็ไม่มีอะไรกำหนด

สูตรเดียวที่ต้องจำ

แรงดันไฟเลี้ยงถูกแบ่งเป็นสองส่วน ส่วนหนึ่งตกคร่อม LED อีกส่วนตกคร่อมตัวต้านทาน ตาม Ohm’s law (V = I × R) จะได้

R = (Vsupply − Vf) ÷ I

ค่า Vf ขึ้นกับสีของ LED ค่าด้านล่างเป็นค่าทั่วไปของ LED ขนาด 5 mm ควรดูจาก datasheet ของ LED ที่ใช้จริงเสมอ

สี LEDVf โดยทั่วไป
แดง1.8–2.2 V
เหลือง ส้ม2.0–2.2 V
เขียวสด ฟ้า ขาว2.8–3.3 V

LED ขนาด 5 mm ทั่วไปรับกระแสต่อเนื่องได้ราว 20 mA แต่ไฟแสดงสถานะใช้แค่ 5–10 mA ก็สว่างพอ และเบากับขา GPIO มากกว่า

ตัวอย่างคำนวณทีละขั้น

GPIO183.3 V150 Ωขายาว (+)GND1.3 Vคร่อมตัวต้านทาน2.0 Vคร่อม LEDI = 1.3 V ÷ 150 Ω≈ 8.7 mA
3.3 V แบ่งเป็น 1.3 V คร่อมตัวต้านทาน กับ 2.0 V คร่อม LED กระแสไหลเท่ากันทั้งวง

โจทย์: ต่อ LED สีแดงกับขา GPIO ของ ESP32 ซึ่งให้ไฟ 3.3 V ต้องการกระแสราว 10 mA

  1. แรงดันที่เหลือให้ตัวต้านทาน = 3.3 − 2.0 = 1.3 V
  2. R = 1.3 ÷ 0.010 = 130 Ω
  3. ไม่มีตัวต้านทาน 130 Ω ในชุดค่ามาตรฐานทั่วไป (E12) เลือกค่าที่ ใหญ่ขึ้น ถัดไป คือ 150 Ω
  4. กระแสจริง = 1.3 ÷ 150 ≈ 8.7 mA ต่ำกว่าเป้านิดหน่อย ไปทางปลอดภัย
  5. กำลังที่ตัวต้านทานต้องรับ P = I² × R = 0.0087² × 150 ≈ 0.011 W ตัวต้านทาน 1/4 W ทั่วไปเหลือเฟือ

ถ้าใช้ Arduino Uno ซึ่งขาให้ไฟ 5 V ตัวเลขจะเปลี่ยน

บอร์ดแรงดันขาR ที่คำนวณได้ (10 mA)ค่าที่เลือกกระแสจริง
ESP323.3 V130 Ω150 Ω≈ 8.7 mA
Arduino Uno5 V300 Ω330 Ω≈ 9.1 mA

ขา GPIO ของ ESP32 ที่ควรรู้

  • ESP32 ใช้ไฟ 3.3 V และขาไม่ทน 5 V ห้ามป้อนสัญญาณ 5 V เข้าขาโดยตรง
  • datasheet ระบุกระแสสูงสุดราว 40 mA ต่อขาที่ค่า drive strength สูงสุด นั่นคือเพดาน ไม่ใช่ค่าใช้งาน ให้ LED ใช้ราว 10 mA ก็พอ
  • GPIO 6–11 ต่อกับ flash ภายในโมดูล WROOM ห้ามใช้
  • GPIO 34–39 เป็นขา input อย่างเดียว ขับ LED ไม่ได้
  • GPIO 0, 2, 5, 12, 15 เป็น strapping pin มีผลตอนบอร์ดบูต ใช้ได้แต่ต้องระวัง มือใหม่เลี่ยงไปก่อน

บทนี้ใช้ GPIO18 สำหรับ LED และ GPIO4 สำหรับปุ่ม ทั้งสองขาไม่มีข้อจำกัดข้างบน

ต่อวงจร

  1. ถอดสาย USB ก่อนต่อทุกครั้ง
  2. ขา GPIO18 → ตัวต้านทาน 150 Ω → ขายาว ของ LED (anode, +)
  3. ขาสั้น ของ LED (cathode, −) ซึ่งอยู่ฝั่งที่ขอบตัว LED ตัดตรง → GND
  4. ปุ่มกด: ขาหนึ่งต่อ GPIO4 อีกขาต่อ GND ไม่ต้องมีตัวต้านทานเพิ่ม เพราะจะเปิด pull-up ภายในชิปด้วยโค้ด

โค้ด

ไฟกะพริบทุกครึ่งวินาที

const int LED_PIN = 18;

void setup() {
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_PIN, HIGH);
  delay(500);
  digitalWrite(LED_PIN, LOW);
  delay(500);
}

เพิ่มปุ่ม กดแล้วไฟติด ปล่อยแล้วไฟดับ

const int LED_PIN = 18;
const int BUTTON_PIN = 4;

void setup() {
  pinMode(LED_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP);  // ปล่อย = HIGH, กด = LOW
}

void loop() {
  bool pressed = digitalRead(BUTTON_PIN) == LOW;
  digitalWrite(LED_PIN, pressed ? HIGH : LOW);
}

INPUT_PULLUP เปิดตัวต้านทานภายในชิปที่ดึงขาขึ้นไปที่ 3.3 V ตอนไม่ได้กด ขาจึงอ่านได้ HIGH พอกดปุ่ม ขาถูกต่อลงกราวด์ อ่านได้ LOW ตรรกะจึงกลับด้านจากที่หลายคนคาด

วัดกระแสจริงด้วยมัลติมิเตอร์

ไม่ต้องตัดวงจรเพื่อต่อแอมป์มิเตอร์ ตั้งมัลติมิเตอร์เป็นโหมดวัดแรงดัน DC แล้ววัดคร่อมตัวต้านทานตอน LED ติด ถ้าได้ 1.25 V กระแสคือ 1.25 ÷ 150 ≈ 8.3 mA

ค่าที่วัดได้มักต่ำกว่าที่คำนวณเล็กน้อย เพราะแรงดันขา GPIO ลดลงนิดหน่อยเมื่อมีโหลด และ Vf ของ LED แต่ละดวงไม่เท่ากันเป๊ะ เป็นเรื่องปกติ

ข้อผิดพลาดที่เจอบ่อย

  • ไม่ใส่ตัวต้านทาน เพราะ “ลองแล้วก็ติด” ติดได้ แต่ขากับ LED รับภาระเกินพิกัด
  • กลับขา LED ไฟไม่ติด แต่ไม่พัง กลับขาแล้วลองใหม่
  • ใช้ขา 34–39 เขียนโค้ดถูกหมดแต่ไฟไม่ติด เพราะขาพวกนี้เป็น input อย่างเดียว
  • ตัวต้านทานเสียบผิดแถวบนเบรดบอร์ด ขาสองข้างอยู่แถวเดียวกัน กระแสไม่ผ่านตัวต้านทานเลย

บทต่อไปจะให้ ESP32 อ่านค่าจากเซนเซอร์ผ่านสาย I2C สองเส้น แล้วค่อยพิมพ์กล่องให้มันในบทที่สาม

คำถามที่พบบ่อย

ใช้ตัวต้านทาน 220 Ω แทน 150 Ω ได้ไหม

ได้ กระแสจะเหลือราว (3.3 − 2.0) ÷ 220 ≈ 5.9 mA ไฟหรี่ลงนิดหน่อยแต่ยังเห็นชัด ค่าที่มากขึ้นปลอดภัยกว่าเสมอ

ต่อ LED หลายดวงขนานกันแล้วใช้ตัวต้านทานตัวเดียวได้ไหม

ไม่ควร LED แต่ละดวงมีแรงดันตกคร่อมต่างกันเล็กน้อย ดวงที่แรงดันต่ำสุดจะกินกระแสเกือบทั้งหมด ให้ใช้ตัวต้านทานแยกดวงละตัว

ทำไม LED สีฟ้ากับสีขาวต่อกับ 3.3 V แล้วหรี่มาก

LED สีฟ้าและขาวมีแรงดันตกคร่อมราว 2.8–3.3 V เหลือแรงดันให้ตัวต้านทานน้อยมาก ใช้ทรานซิสเตอร์ขับจากไฟ 5 V แทนจะได้ความสว่างที่คงที่กว่า

วงจรและโค้ดในบทความทดสอบกับบอร์ดตัวอย่าง บอร์ดต่างรุ่นอาจใช้ขาต่างกัน ตรวจ pinout ของบอร์ดที่ใช้ก่อนต่อไฟเสมอ