ESP32 อ่าน analog ไม่ได้ตอนเปิด WiFi: เลือกขา ADC1 กับ ADC2 ให้ถูก

ทำไม analogRead() บนบางขาของ ESP32 ใช้ไม่ได้เมื่อเปิด WiFi ขาไหนเป็น ADC1 ที่ใช้ได้ตลอด และทำอย่างไรเมื่อเซนเซอร์ analog มีมากกว่าขาที่ว่าง

อัปเดต 2026-10-31

อาการที่เจอบ่อย: เซนเซอร์ analog อ่านค่าได้ปกติตอนทดสอบ แต่พอเพิ่มโค้ด WiFi เข้าไป analogRead() กลับได้ค่าผิดหรืออ่านไม่ได้ สาเหตุคือขานั้นอยู่บน ADC2 ซึ่ง ESP32 ใช้ร่วมกับวงจร WiFi บทความนี้พูดถึง ESP32 รุ่นแรก (ESP32-WROOM-32 บนบอร์ด DevKit V1) รุ่น S2, S3 และ C3 จัดขาต่างออกไป

ADC1 กับ ADC2

ADCขา (GPIO)ใช้ตอนเปิด WiFi
ADC132, 33, 34, 35, 36 (VP), 39 (VN)✅ ได้
ADC20, 2, 4, 12, 13, 14, 15, 25, 26, 27❌ ไม่ได้

บนบอร์ด DevKit V1 จึงมีขา analog ที่ใช้ได้แน่นอนแค่ 6 ขา และในนั้น GPIO 34, 35, 36, 39 เป็นขา input อย่างเดียว ไม่มีตัวต้านทาน pull-up ภายใน ใช้กับเซนเซอร์ analog ได้ดี แต่ใช้กับปุ่มกดต้องต่อ pull-up ภายนอกเอง

ถ้าโปรเจกต์ไม่ใช้ WiFi เลย ขา ADC2 ก็อ่านค่าได้ตามปกติ แต่ถ้าวันหนึ่งอยากเพิ่มการควบคุมผ่านมือถือ จะต้องย้ายขาใหม่ทั้งหมด จึงควรวางเซนเซอร์ analog บน ADC1 ตั้งแต่แรก

ตัวอย่าง: หุ่นยนต์หาแสงใช้ ADC1 ครบ 6 ขา

หุ่นใน โปรเจกต์หุ่นยนต์หาแสง มี LDR 2 ตัวกับ IR Sharp 4 ตัว รวม 6 สัญญาณ analog พอดีกับ ADC1 ตัวจำลองจัดขาให้โดยเลือก ADC1 ก่อนเสมอ:

การต่อขาบน ESP32 DevKit V1 (จัดขาอัตโนมัติจากตัวจำลอง)
TB6612FNG
Motors
VM → แบต 7.4 V
VCC → 3V3
GND → GND
PWMA → GPIO25
AIN1 → GPIO13
AIN2 → GPIO4
PWMB → GPIO26
BIN1 → GPIO19
BIN2 → GPIO21
STBY → 3V3 (ต่อค้างไว้)
HC-SR04
Front sonar
VCC → 5V
TRIG → GPIO22
ECHO → GPIO14
GND → GND
LDR
Left eye LDR
VCC → 3V3
GND → GND
AO → GPIO32
LDR
Right eye LDR
VCC → 3V3
GND → GND
AO → GPIO33
Microswitch
Front bumper
COM → GND
NO → GPIO16
GP2Y0A21
IR front-left
VCC → 5V
GND → GND
VO → GPIO34
GP2Y0A21
IR front-right
VCC → 5V
GND → GND
VO → GPIO35
GP2Y0A21
IR left side
VCC → 5V
GND → GND
VO → GPIO36
GP2Y0A21
IR right side
VCC → 5V
GND → GND
VO → GPIO39
Microswitch
Rear bumper
COM → GND
NO → GPIO17
SG90
Head servo
GND → GND
VCC → 5V
PWM → GPIO27
ST7789
Face Display
GND → GND
VCC → 3V3
SCL → GPIO18
SDA → GPIO23
RES → GPIO5
DC → GPIO15
BLK → 3V3 (ต่อค้างไว้)

ถ้าเพิ่มเซนเซอร์ analog ตัวที่ 7 ตัวจำลองจะจำเป็นต้องใช้ขา ADC2 และขึ้นคำเตือนในหน้า Wiring ว่า “อ่านค่าไม่ได้ขณะเปิด WiFi” ลองดูได้ด้วยการเพิ่ม IR อีกตัวในหน้า Robot Body

เปิดหุ่นหาแสงแล้วลองเพิ่มเซนเซอร์ →

เมื่อขา analog ไม่พอ

  1. ใช้ ADC ภายนอก ADS1115 ต่อผ่าน I²C (ใช้แค่ 2 ขาร่วมกับอุปกรณ์ I²C อื่น) ได้ 4 ช่องต่อชิป ความละเอียด 16 บิต ต่อได้สูงสุด 4 ชิปบนบัสเดียวโดยตั้ง address 0x48–0x4B ตัวจำลองใช้วิธีนี้กับ Raspberry Pi ที่ไม่มีขา analog เลย
  2. เปลี่ยนเป็นเซนเซอร์แบบดิจิทัล เช่นใช้ HC-SR04 หรือเซนเซอร์ระยะแบบ I²C (เช่น VL53L0X) แทน IR analog บางตัว
  3. ใช้ ADC2 เฉพาะกับงานที่ไม่ต้องอ่านค่าระหว่างเปิด WiFi ทางนี้ยุ่งยากและพลาดง่าย แนะนำเป็นทางสุดท้าย

เรื่องอื่นที่ควรรู้เกี่ยวกับ ADC ของ ESP32