ARTICLE

Pull-up และ Pull-down Resistor คืออะไร? ทำไม GPIO ถึงอ่านค่าไม่นิ่ง.

อธิบาย Pull-up/Pull-down Resistor สำหรับ ESP32, Arduino, Button และ Sensor ตั้งแต่ Floating Input, Open-Drain/Open-Collector, Internal Pull Resistor และการเลือกใช้ให้เหมาะกับสาย/Noise

ElectricalIoTMakerโดย Thospaakเผยแพร่ 10 ต.ค. 2569อัปเดต 10 ต.ค. 2569

ถ้า GPIO อ่านค่าเดี๋ยว HIGH เดี๋ยว LOW ทั้งที่ยังไม่ได้กดปุ่มหรือ Sensor ไม่ได้เปลี่ยนสถานะ ปัญหาหนึ่งที่พบบ่อยคือ input ลอย (floating)

Pull-up และ Pull-down resistor ใช้กำหนดสถานะเริ่มต้นให้ input ชัดเจน

Floating Input คืออะไร

GPIO input มี impedance สูง จึงไม่ได้ดึง line ไป HIGH หรือ LOW อย่างแข็งแรงด้วยตัวเอง

ถ้าปล่อยขาไว้:

GPIO input
   |
   +---- ไม่ต่ออะไร

มันอาจรับ noise จาก environment และอ่านค่าไม่แน่นอน

Pull-up คืออะไร

Pull-up resistor ต่อ signal ไปยัง logic supply:

Vlogic
  |
 resistor
  |
  +---- GPIO
  |
 switch
  |
 GND

เมื่อ switch เปิด GPIO ถูกดึง HIGH

เมื่อ switch ปิด GPIO ถูกดึง LOW

วงจรนี้จึงมักเป็น active-low input

Pull-down คืออะไร

กลับกัน:

Vlogic
  |
 switch
  |
  +---- GPIO
  |
 resistor
  |
 GND

เมื่อ switch เปิด GPIO ถูกดึง LOW

เมื่อ switch ปิด GPIO เป็น HIGH

ทำไมต้องมี Resistor

ถ้าต่อ switch จาก Vlogic ลง GND โดยไม่มี resistor ใน topology ผิดแบบ อาจเกิด short circuit เมื่อ switch ปิด

Resistor ช่วยกำหนด default state โดยจำกัด current

ค่า Pull Resistor ใช้เท่าไร

ไม่มีค่าเดียวที่เหมาะกับทุกงาน

ค่าที่มากเกินไป:

  • current ต่ำ;
  • แต่ susceptibility ต่อ noise/capacitance สูงขึ้นได้

ค่าที่น้อยเกินไป:

  • signal แข็งแรงขึ้น;
  • แต่กิน current มากขึ้นเมื่อถูกดึงตรงข้าม

การเลือกต้องดู:

  • supply voltage;
  • cable length;
  • leakage;
  • input threshold;
  • speed/rise time;
  • EMI environment

Internal Pull-up/Pull-down คืออะไร

MCU หลายรุ่นมี resistor ภายในที่เปิดผ่าน firmware ได้

ข้อดี:

  • ลด component;
  • เหมาะกับปุ่ม/สัญญาณระยะสั้นบางงาน

ข้อจำกัด:

  • resistance tolerance อาจกว้าง;
  • ไม่ใช่ทุกขารองรับเหมือนกัน;
  • อาจไม่เหมาะกับสายยาว/noisy field input;
  • state ตอน boot/reset ต้องตรวจ

Open-Drain / Open-Collector ต้องใช้ Pull-up ทำไม

Output แบบ open-drain/open-collector ทำได้หลัก ๆ คือ “ดึงลง LOW” แต่ไม่ได้ขับ HIGH เอง

จึงต้องมี pull-up:

Vlogic
  |
 pull-up
  |
 signal ---- device A
       \--- device B

device ใด device หนึ่งดึง LOW ได้

นี่เป็นแนวคิดสำคัญของ I2C

I2C ใช้ Pull-up เท่าไร

ขึ้นกับ bus capacitance, speed และ voltage

ค่า resistor ที่มากไปทำให้ rise time ช้า

ค่าที่ต่ำไปเพิ่ม current ตอน line LOW

ดังนั้น board/module หลายตัวที่มี pull-up อยู่แล้วอาจทำให้ effective resistance ต่ำเกินเมื่อเอามาต่อหลายใบ parallel

อย่าคิดว่า “ทุก module มี pull-up ยิ่งเยอะยิ่งดี”

อ่านต่อ: UART, I2C และ SPI ต่างกันอย่างไร

Pull-up กับ Button Debounce ต่างกันไหม

ต่างกัน

Pull-up กำหนด default logic state

Debounce จัดการ contact bounce ตอน switch เปลี่ยนสถานะ

ระบบ button ที่ดีอาจต้องมีทั้งสองเรื่อง

Reed Switch / Float Switch ใช้ Pull-up ได้ไหม

ได้ใน concept ถ้าเป็น dry contact และ electrical environment เหมาะสม

แต่ถ้าสายยาวไป tank/field ต้องเพิ่มการพิจารณา:

  • lightning/surge;
  • EMI;
  • cable capacitance;
  • ground potential;
  • wet/noisy environment;
  • isolation/interface

ไม่ควรต่อสาย outdoor ยาวเข้าขา ESP32 โดยตรงเพียงเพราะใช้ pull-up แล้ว

Pull-up Voltage สำคัญไหม

สำคัญมาก

ถ้า ESP32 logic เป็น 3.3V แต่ pull-up ถูกต่อไป 5V line อาจขึ้นถึง 5V

โดยเฉพาะ module I2C ที่มี resistor บน board ต้องตรวจ schematic

อ่านต่อ: 3.3V กับ 5V Logic Level

Pull-up ช่วย Noise ได้ทั้งหมดไหม

ไม่

มันช่วยกำหนด impedance/default state แต่ถ้า environment มี noise สูงอาจต้องใช้:

  • lower impedance;
  • RC filter;
  • Schmitt-trigger input;
  • shield/twisted pair;
  • optocoupler/digital isolator;
  • differential interface

ขึ้นกับ system

ตัวอย่าง Home Automation

ประตูใช้ reed contact:

3.3V
  |
 pull-up
  |
 ESP32 GPIO -------- reed switch -------- GND

Firmware อ่าน:

  • HIGH = contact open;
  • LOW = contact closed

แต่ production node ต้องคิด disconnected wire และ fault detection เพิ่มถ้าสถานะสำคัญ

สรุป

Pull-up/Pull-down resistor ทำหน้าที่กำหนด default logic state ให้ GPIO ไม่ลอย

การเลือกใช้งานจริงต้องดู logic voltage, cable/noise, current และ output type โดยเฉพาะ open-drain/I2C อย่าจำเพียงว่า “ใส่ 10kΩ แล้วจบ” กับทุกระบบ