คุณเคยไหม? ต่อเซนเซอร์เข้ากับ ESP32 แล้วใช้ analogRead() แต่ได้ตัวเลขงง ๆ ไม่รู้ว่าหมายถึงอะไร
หรือบางครั้งค่าเด้งขึ้นลงเหมือนเครื่องจับผี ทั้งที่ไม่ได้ขยับอะไรเลย
ปัญหานี้เกิดกับ Maker มือใหม่แทบทุกคน เพราะยังไม่เข้าใจว่า ADC ของ ESP32 ทำงานอย่างไร
บทความนี้จะอธิบายแบบช่างสอนช่าง ให้คุณเข้าใจตั้งแต่พื้นฐานจนใช้งานจริงได้ทันที
💡 ถ้าคุณกำลังเริ่มต้น ESP32 จริงจัง
แนะนำอ่านบทความ “ESP32 คืออะไร” เพื่อเข้าใจภาพรวมทั้งหมดก่อนเริ่มทำโปรเจกต์
ADC คืออะไร และทำไม ESP32 ต้องมี
ADC (Analog to Digital Converter) คือวงจรที่แปลงแรงดันไฟฟ้าแบบต่อเนื่อง (Analog) ให้กลายเป็นตัวเลข (Digital)
ESP32 เป็นไมโครคอนโทรลเลอร์ที่ทำงานกับตัวเลขเท่านั้น ดังนั้นถ้าจะอ่านค่าจากเซนเซอร์ที่ให้แรงดันไฟฟ้า ก็ต้องผ่าน ADC ก่อน
สัญญาณ Analog vs Digital ต่างกันยังไง
- Analog: ค่าเปลี่ยนได้ต่อเนื่อง เช่น 0-3.3V
- Digital: ค่าเป็นตัวเลข เช่น 0-4095
ตัวอย่างอุปกรณ์ที่ให้ค่า Analog
- Soil Moisture Sensor
- Potentiometer (VR)
- Light Sensor แบบ Analog
- Gas Sensor
ADC ของ ESP32 ถูกใช้งานอย่างแพร่หลายในระบบ Smart Farm เช่น การวัดความชื้นดินเพื่อควบคุมการรดน้ำอัตโนมัติ ดูตัวอย่างโครงงานจริงได้ที่:
ESP32 ระบบรดน้ำต้นไม้อัตโนมัติด้วย Capacitive Soil Sensor
ESP32 ADC ทำงานอย่างไร
เมื่อแรงดันไฟฟ้าเข้าที่ขา ADC ESP32 จะวัดแรงดันนั้นและแปลงเป็นตัวเลข
โดยค่าเริ่มต้น ESP32 ใช้ความละเอียด 12-bit
ช่วงแรงดันที่อ่านได้
โดยทั่วไป ESP32 อ่านแรงดันได้ประมาณ 0 ถึง 3.3V (ขึ้นกับ attenuation)
ADC1 และ ADC2 ต่างกันอย่างไร
- ADC1: ใช้ได้ตลอด แม้เปิด WiFi
- ADC2: ใช้ไม่ได้เมื่อ WiFi ทำงาน
คำแนะนำ: ถ้าใช้ WiFi ให้เลือก ADC1 เท่านั้น
ความละเอียด (Resolution) ของ ESP32 ADC
10-bit vs 12-bit ต่างกันยังไง
ความละเอียดบอกจำนวนระดับที่ ADC แบ่งแรงดันออกมา
- 10-bit → 1024 ระดับ
- 12-bit → 4096 ระดับ
ESP32 ใช้ 12-bit ทำให้วัดได้ละเอียดกว่า Arduino Uno
ค่า 0-4095 หมายถึงอะไร
- 0 → 0V
- 4095 → แรงดันสูงสุด
เวลา ESP32 อ่านค่าเซนเซอร์ผ่าน ADC คุณมักจะเห็นตัวเลข 0–4095 โผล่มาใน Serial Monitor ถ้ายังไม่เข้าใจว่าตัวเลขนี้หมายถึงอะไร บทความ ESP32 ADC Resolution นี้จะช่วยให้คุณเข้าใจได้ง่ายขึ้น
อ่านค่า Analog ด้วย analogRead()
ขาที่ใช้ ADC ได้
ตัวอย่างขา ADC1 ที่นิยมใช้:
- GPIO32
- GPIO33
- GPIO34
- GPIO35
- GPIO36
- GPIO39
ก่อนเลือกต่อวงจรกับ ESP32 คุณควรรู้ก่อนว่าขา GPIO แต่ละขามีหน้าที่และข้อจำกัดต่างกัน ถ้ายังไม่แน่ใจว่าใช้ขาไหนได้บ้าง ดูบทความนี้ได้เลย
ESP32 Pinout DevKit V1

int sensorPin = 34;
void setup() {
Serial.begin(115200);
}
void loop() {
int value = analogRead(sensorPin);
Serial.println(value);
delay(1000);
}แปลงค่า ADC เป็นแรงดันไฟฟ้า
สูตรคำนวณ
แรงดัน ≈ ค่า ADC × 3.3 / 4095
int raw = analogRead(34);
float voltage = raw * 3.3 / 4095.0;
Serial.print("Voltage: ");
Serial.println(voltage);
เมื่อเข้าใจพื้นฐาน ADC แล้ว คุณสามารถดูตัวอย่างการอ่านค่า Analog จริงด้วยฟังก์ชัน analogRead() ได้จากบทความนี้:
วิธีอ่านค่า Analog ด้วย ESP32 (analogRead)
ปัญหาที่พบบ่อยเมื่อใช้ ESP32 ADC
ค่ากระโดด / ไม่นิ่ง
- สายยาวเกินไป
- สัญญาณรบกวน
- ไม่มี GND ร่วม
ค่าไม่ตรงแรงดันจริง
- ESP32 ADC ไม่ได้ Linear 100%
- ต้อง Calibrate สำหรับงานแม่นยำ
ดูตัวอย่างการใช้ EMA Filter และ Moving Average ได้จากโครงงาน ESP32-C3 อ่านค่าฝุ่น ซึ่งเป็นตัวอย่างงานจริงที่ช่วยให้ค่าที่อ่านได้มีความนิ่งมากขึ้น
สรุป: ควรใช้ ESP32 ADC เมื่อไหร่
ใช้เมื่อคุณต้องการอ่านค่าแรงดันจากโลกจริง เช่น ความชื้น แสง อุณหภูมิ หรือระดับน้ำ
สำหรับงาน Smart Farm หรือ IoT — ADC คือหัวใจสำคัญที่ทำให้ ESP32 เข้าใจสภาพแวดล้อมได้



