ESP32 วัดแรงดันไฟด้วย ADC แบบปลอดภัย ใช้งานจริงได้ด้วย Voltage Divider

อย่าเอา 5V หรือ 12V เสียบเข้า ADC ของ ESP32 ตรง ๆ เด็ดขาด เพราะพังได้จริง และมือใหม่พลาดจุดนี้กันเยอะมากเวลาเริ่มทำโปรเจควัดแบต วัดไฟโซลาร์ หรือเช็กไฟเลี้ยงระบบต่าง ๆ

บทความนี้คุณจะได้เข้าใจแบบใช้งานได้จริงว่า ESP32 วัดแรงดันไฟอย่างไร, ต้องใช้ Voltage Divider ยังไง, คำนวณค่าอย่างไร, ต่อวงจรแบบไหน, และเขียนโค้ดอ่านค่า ADC เพื่อนำไปแปลงกลับเป็นแรงดันจริงได้อย่างไร เหมาะมากกับงาน Smart Farm, IoT, ระบบแบตเตอรี่ และงานตรวจสอบไฟเลี้ยงต่าง ๆ

บทความนี้เหมาะกับใคร

  • มือใหม่ที่อยากวัดแรงดันไฟด้วย ESP32
  • คนที่กำลังทำโปรเจควัดแบตเตอรี่, โซลาร์เซลล์, หรือระบบไฟ DC
  • Maker ที่เคยอ่านค่า ADC แล้วงงว่าทำไมค่ามันไม่ตรง

ESP32 เป็นไมโครคอนโทรลเลอร์ที่มี WiFi และ Bluetooth ในตัว และสามารถอ่านสัญญาณอนาล็อกผ่าน ADC ได้ หากคุณยังไม่รู้จัก
ESP32 คืออะไร
แนะนำให้เริ่มจากบทความพื้นฐานก่อนครับ

ESP32 วัดแรงดันไฟได้ไหม

คำตอบคือ ได้ แต่ ห้ามวัดแรงดันสูงกว่าช่วงที่ขา ADC รับได้โดยตรง เพราะ ADC ของ ESP32 ออกแบบมาสำหรับอ่านสัญญาณแรงดันต่ำ ไม่ใช่เอาไฟ 5V, 9V หรือ 12V เข้ามาเสียบตรง ๆ แบบนั้น

ดังนั้น ถ้าคุณต้องการวัดแรงดันที่สูงกว่า ADC รับไหว ต้องใช้วงจร Voltage Divider หรือเรียกง่าย ๆ ว่า วงจรแบ่งแรงดัน ก่อน แล้วค่อยส่งแรงดันที่ถูกลดระดับแล้วเข้าไปยังขา ADC ของ ESP32

หลักการแปลงสัญญาณอนาล็อกเป็นดิจิทัล ADC

ตัวอย่างงานที่นิยมวัดแรงดันด้วย ESP32

  • วัดแรงดันแบตเตอรี่ 18650 หรือ Li-ion
  • วัดไฟเลี้ยง 5V หรือ 12V ในระบบ IoT
  • วัดแรงดันจากแผงโซลาร์เซลล์
  • เช็กว่าแหล่งจ่ายไฟตกหรือไม่
  • ใช้ทำระบบแจ้งเตือนไฟต่ำในงาน Smart Farm

ทำไมถึงห้ามต่อไฟเข้า ADC ตรง ๆ

เพราะขา ADC ของ ESP32 ไม่ได้ถูกออกแบบมาให้รับแรงดันสูงแบบตรง ๆ ถ้าคุณเผลอเอา 5V ต่อเข้าขา ADC เลย ความเสี่ยงมีตั้งแต่ค่าอ่านเพี้ยน ไปจนถึงขาเสียหรือบอร์ดพังได้

ถ้ายังนึกภาพไม่ออกว่าทำไมถึงห้ามเอา 5V หรือ 12V ต่อเข้าขา ADC ของ ESP32 ตรง ๆ ลองดูช่วงนี้ก่อนครับ จะช่วยให้เห็นภาพความเสี่ยงได้ชัดขึ้น ก่อนจะไปต่อเรื่องวงจรแบ่งแรงดันในหัวข้อถัดไป

Chapters

  • 00:00 Intro
  • 01:52 ทำไมถึงห้ามต่อไฟเข้า ADC ตรง ๆ
  • 02:22 Voltage Divider คืออะไร
  • 06:56 การต่อวงจรจริงกับ ESP32

ข้อควรจำ
การวัดแรงดันไฟด้วย ESP32 ต้องคิด 2 เรื่องเสมอ:

  • ADC รับแรงดันได้ในช่วงเท่าไร
  • แรงดันจริงที่คุณจะวัดต้องถูกลดลงมาก่อนหรือไม่

หลักการของ Voltage Divider คืออะไร

Voltage Divider คือวงจรแบ่งแรงดันด้วยตัวต้านทาน 2 ตัว เพื่อลดแรงดันจากต้นทางให้เหลือระดับที่ปลอดภัยกับขา ADC ก่อนส่งเข้า ESP32

วงจรพื้นฐานจะมีตัวต้านทาน 2 ตัวคือ R1 และ R2 ต่ออนุกรมกัน แล้วดึงจุดกึ่งกลางเข้าขา ADC

สูตรแรงดันที่ขา ADC

Vout = Vin x (R2 / (R1 + R2))

โดยที่

  • Vin = แรงดันจริงที่ต้องการวัด
  • Vout = แรงดันที่เข้าขา ADC
  • R1 = ตัวต้านทานด้านบน
  • R2 = ตัวต้านทานด้านล่าง

ตัวอย่างการคำนวณแบบใช้งานจริง

ตัวอย่างที่ 1: วัดไฟ 5V

สมมติคุณใช้ตัวต้านทาน

  • R1 = 10kΩ
  • R2 = 10kΩ

แทนค่าในสูตร

Vout = 5 x (10k / (10k + 10k)) = 2.5V

แปลว่า ถ้าต้นทางมี 5V จะเหลือประมาณ 2.5V ที่ขา ADC ซึ่งปลอดภัยกว่าเยอะและอ่านได้ง่าย

ตัวอย่างที่ 2: วัดไฟ 12V

สมมติคุณใช้ตัวต้านทาน

  • R1 = 30kΩ
  • R2 = 10kΩ

แทนค่าในสูตร

Vout = 12 x (10k / (30k + 10k)) = 3V

แปลว่า ถ้าต้นทางมี 12V จุดที่เข้า ADC จะเหลือประมาณ 3V ซึ่งเหมาะกับงานวัดแรงดัน DC ทั่วไปมาก

Tip จากงานจริง
ถ้าคุณวัดไฟ 12V ในระบบ Smart Farm เช่น ปั๊มน้ำ พัดลม หรือไฟ LED อย่าออกแบบให้แรงดันที่ขา ADC ชนเพดานพอดีเกินไป ควรเผื่อไว้หน่อย เพราะไฟจริงอาจแกว่งเกิน 12V ได้

เลือกค่า R1 และ R2 อย่างไรดี

หลักง่าย ๆ คือเลือกให้แรงดันสูงสุดที่คุณคาดว่าจะวัดได้ ถูกหารลงมาแล้วอยู่ในช่วงปลอดภัยของ ADC

แนวทางเลือกเบื้องต้น

  • วัด 5V ใช้ 10kΩ + 10kΩ ได้ง่ายและนิยม
  • วัด 12V ใช้ 30kΩ + 10kΩ ได้บ่อย
  • ถ้าต้องการลดการกินกระแส อาจขยับค่าเป็น 100kΩ + 100kΩ หรือ 300kΩ + 100kΩ ได้ แต่ต้องระวังสัญญาณไม่นิ่งในบางงาน

สำหรับมือใหม่ ถ้าจะเริ่มให้ทำงานง่ายก่อน ใช้ค่าระดับ 10kΩ ถึง 100kΩ จะคุมงานง่ายกว่า

ค่า R ที่นิยมใช้จริง

Vin สูงสุดR1R2Vout
5V10kΩ10kΩ2.5V
12V33kΩ10kΩ2.79V
24V100kΩ10kΩ2.18V

การต่อวงจรวัดแรงดันกับ ESP32

อุปกรณ์ที่ต้องใช้

  • ESP32 WROOM-32 หรือบอร์ด ESP32 รุ่นที่มี ADC
  • ตัวต้านทาน 2 ตัว ตามค่าที่ออกแบบ
  • สาย Jumper
  • Breadboard
  • มัลติมิเตอร์ สำหรับวัดแรงดันจริง
วงจร Voltage Divider สำหรับ ESP32 ADC

ตัวอย่างการต่อสาย

ในตัวอย่างนี้ สมมติใช้ GPIO34 เป็นขา ADC

  • แรงดันที่ต้องการวัด ต่อเข้าด้านบนของ R1
  • ปลายอีกด้านของ R1 ต่อเข้าจุดร่วมกับ R2 และ GPIO34
  • ปลายอีกด้านของ R2 ต่อ GND
  • GND ของแหล่งจ่ายที่วัด ต้องต่อร่วมกับ GND ของ ESP32

ภาพจำง่าย ๆ ของวงจร

ESP32 วัดแรงดันแบตเตอรี่ด้วย Voltage Divider

สำคัญมาก

Vin ไม่ต่อเข้า ESP32 โดยตรง และต้องใช้ GND ร่วมกัน
ถ้า GND ไม่ร่วมกัน ค่าแรงดันที่อ่านได้อาจมั่วหรืออ่านไม่ได้เลย

ขา ADC ของ ESP32 ที่นิยมใช้

สำหรับบอร์ด ESP32 WROOM-32 ทั่วไป ขาที่นิยมใช้วัดสัญญาณอนาล็อก เช่น GPIO32, GPIO33, GPIO34, GPIO35, GPIO36 และ GPIO39

แต่ในงานจริง หลายคนชอบใช้ GPIO34 เพราะเป็นขา input only และนิยมใช้กับเซนเซอร์อนาล็อกบ่อย

ถ้าคุณยังไม่คุ้นกับการอ่านค่า ADC แนะนำให้ดูตัวอย่างการใช้งาน analogRead() บน ESP32 เพิ่มด้วย จะช่วยให้เข้าใจ flow การอ่านค่ามากขึ้น

ตัวอย่างโค้ด ESP32 วัดแรงดันไฟด้วย ADC

แนวคิดของโค้ดชุดนี้

  • อ่านค่าดิบจาก ADC
  • แปลงเป็นแรงดันที่ขา ADC
  • คูณกลับด้วยอัตราส่วนของ Voltage Divider เพื่อหาแรงดันจริง
#define ADC_PIN 34

// ค่าแรงดันอ้างอิงโดยประมาณ
const float ADC_REF_VOLTAGE = 3.3;

// ESP32 ADC 12-bit = 0 - 4095
const int ADC_MAX = 4095;

// ค่า resistor ของวงจรแบ่งแรงดัน
const float R1 = 30000.0; // 30k
const float R2 = 10000.0; // 10k

float readVoltage()
{
  int raw = analogRead(ADC_PIN);

  // แปลงค่าดิบเป็นแรงดันที่ขา ADC
  float vOut = (raw * ADC_REF_VOLTAGE) / ADC_MAX;

  // แปลงกลับเป็นแรงดันจริงก่อนถูกแบ่ง
  float vIn = vOut * ((R1 + R2) / R2);

  return vIn;
}

void setup()
{
  Serial.begin(115200);
  delay(1000);

  analogReadResolution(12);  
}

void loop()
{
  float voltage = readVoltage();

  Serial.print("Measured Voltage = ");
  Serial.print(voltage, 2);
  Serial.println(" V");

  delay(1000);
}

อธิบายโค้ดแบบคนเริ่มต้นก็เข้าใจ

1) กำหนดขา ADC

เราใช้ ADC_PIN 34 เพื่อบอกว่าให้อ่านค่าจาก GPIO34

2) กำหนดค่า ADC reference และความละเอียด

ในตัวอย่างนี้ใช้ 3.3V เป็นค่าประมาณสำหรับการคำนวณ และกำหนดความละเอียดเป็น 12-bit ทำให้ค่าที่อ่านได้อยู่ในช่วง 0 ถึง 4095

3) กำหนดค่า R1 และ R2

ตรงนี้ต้องใส่ให้ตรงกับวงจรจริง เพราะถ้าค่าไม่ตรง แรงดันที่คำนวณกลับจะเพี้ยนทันที

4) อ่านค่าดิบและแปลงเป็นแรงดัน

บรรทัดนี้ใช้แปลงค่าดิบ ADC ให้เป็นแรงดันที่ขา ADC

float vOut = (raw * ADC_REF_VOLTAGE) / ADC_MAX;

5) คำนวณกลับเป็นแรงดันจริง

เมื่อแรงดันถูกแบ่งลงมาก่อนแล้ว เราต้องคูณกลับด้วยอัตราส่วนของวงจรแบ่งแรงดันเพื่อหา Vin จริง

วิธีทดสอบว่าอ่านแรงดันได้จริงไหม

  1. ต่อวงจร Voltage Divider ให้เรียบร้อย
  2. ใช้มัลติมิเตอร์วัดแรงดันต้นทางจริงก่อน
  3. อัปโหลดโค้ดลง ESP32
  4. เปิด Serial Monitor
  5. เปรียบเทียบค่าที่วัดจากมัลติมิเตอร์กับค่าที่ ESP32 อ่านได้

ถ้าค่าไม่ตรงเป๊ะ ไม่ต้องตกใจ เพราะ ADC ของ ESP32 ในงานจริงมักมีความคลาดเคลื่อนบ้าง ต้องมีการปรับเทียบเพิ่มเติม

ทำไมค่าแรงดันที่อ่านได้ถึงเพี้ยน

1) ใช้ค่า 3.3V แบบสมมติ

บอร์ดจริงอาจไม่ได้มีแรงดันอ้างอิง 3.300V เป๊ะ ๆ ทำให้ค่าคำนวณคลาดเคลื่อนได้

2) กำหนดค่า ADC reference และความละเอียด

ในตัวอย่างนี้ใช้ 3.3V เป็นค่าประมาณสำหรับการคำนวณ และกำหนดความละเอียดเป็น 12-bit ทำให้ค่าที่อ่านได้อยู่ในช่วง 0 ถึง 4095 

3) ADC ของ ESP32 มีความไม่เชิงเส้นในบางช่วง

นี่คือเหตุผลว่าทำไมบางโปรเจคต้องมีการคาลิเบรตเพิ่ม โดยเฉพาะงานที่ต้องการความแม่นจริง

4) สัญญาณมี Noise

ถ้าระบบมีปั๊ม, รีเลย์, มอเตอร์ หรือ switching power supply ค่า ADC อาจแกว่งได้

วิธีทำให้การวัดแรงดันแม่นขึ้น

ใช้ค่าเฉลี่ยหลายครั้ง

แทนที่จะอ่านแค่ครั้งเดียว ให้อ่านหลายรอบแล้วเฉลี่ย จะช่วยให้ค่านิ่งขึ้น

float readVoltageAverage(int samples)
{
  long total = 0;

  for (int i = 0; i < samples; i++)
  {
    total += analogRead(ADC_PIN);
    delay(5);
  }

  float rawAverage = total / (float)samples;
  float vOut = (rawAverage * ADC_REF_VOLTAGE) / ADC_MAX;
  float vIn = vOut * ((R1 + R2) / R2);

  return vIn;
}

คาลิเบรตด้วยมัลติมิเตอร์

วิธีง่ายที่สุดคือวัดแรงดันจริงด้วยมัลติมิเตอร์ แล้วเปรียบเทียบกับค่าที่ ESP32 อ่าน จากนั้นเพิ่ม calibration factor เข้าไป

const float CAL_FACTOR = 1.03; // ตัวอย่าง ปรับตามของจริง

float readVoltageCalibrated()
{
  int raw = analogRead(ADC_PIN);
  float vOut = (raw * ADC_REF_VOLTAGE) / ADC_MAX;
  float vIn = vOut * ((R1 + R2) / R2);
  return vIn * CAL_FACTOR;
}

Tip จากประสบการณ์จริง
ถ้าคุณทำระบบไว้ใช้ดูแนวโน้ม เช่น แบตเริ่มอ่อนหรือไฟตกหรือไม่ ค่าไม่จำเป็นต้องเป๊ะระดับเครื่องมือแล็บ แต่ต้อง “นิ่งและสม่ำเสมอ” มากกว่า

Use Case จริงที่เอาไปต่อยอดได้ทันที

1) วัดแบตเตอรี่ 18650

เหมาะมากกับโปรเจคที่รันด้วยแบต เช่น กล่องเซนเซอร์, node ไร้สาย หรือระบบสำรองไฟย่อย

2) วัดไฟ 12V ในระบบ Smart Farm

เช่น เช็กว่าแหล่งจ่ายของปั๊มน้ำหรือพัดลมยังทำงานปกติไหม

3) วัดแรงดันจากแผงโซลาร์เซลล์

ใช้เช็กแนวโน้มแรงดันที่ผลิตได้ในช่วงเวลาต่าง ๆ ของวัน

4) แจ้งเตือนไฟต่ำ

เมื่อแรงดันต่ำกว่าค่าที่กำหนด สามารถสั่งแจ้งเตือนผ่านจอ, buzzer หรือส่งข้อมูลขึ้นระบบ IoT ได้

ข้อควรระวังสำคัญก่อนนำไปใช้งานจริง

อย่าวัดไฟ AC ตรง ๆ

บทความนี้เหมาะกับ ไฟ DC เช่น 3.7V, 5V, 12V ถ้าจะวัดไฟ AC ต้องใช้วงจรแยกและออกแบบให้ปลอดภัยกว่านี้มาก

อย่าให้แรงดันเกินช่วงออกแบบ

ถ้าระบบคุณอาจมีไฟกระชาก เช่น จากแหล่งจ่ายบางชนิด ควรเผื่อ headroom ไว้เสมอ

GND ต้องร่วมกัน

ถ้าไม่ต่อกราวด์ร่วม ค่า ADC จะไม่น่าเชื่อถือ

อย่าเชื่อค่าจากสูตรอย่างเดียว

ในงานจริงควรเช็กด้วยมัลติมิเตอร์เสมอ โดยเฉพาะก่อนเอาไปใช้กับระบบสำคัญ

สรุป

ถ้าคุณอยากให้ ESP32 วัดแรงดันไฟได้อย่างปลอดภัย วิธีที่ใช้กันจริงคือ ใช้ Voltage Divider เพื่อลดแรงดันก่อนเข้า ADC จากนั้นอ่านค่าด้วย analogRead() แล้วคำนวณย้อนกลับเป็นแรงดันจริง

หัวใจของงานนี้มี 4 เรื่อง

  • อย่าต่อแรงดันสูงเข้า ADC ตรง ๆ
  • ออกแบบค่า R1 และ R2 ให้เหมาะ
  • ใช้โค้ดแปลงค่าจาก ADC ให้ถูกต้อง
  • คาลิเบรตด้วยมัลติมิเตอร์ถ้าต้องการความแม่นขึ้น

ถ้าคุณเข้าใจบทนี้ เวลาไปทำโปรเจควัดแบต วัดไฟโซลาร์ วัดไฟเลี้ยงปั๊ม หรือระบบแจ้งเตือนไฟต่ำ คุณจะต่อยอดได้ง่ายขึ้นเยอะมาก

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

ESP32 วัดไฟ 5V ได้ไหม

ได้ แต่ไม่ควรต่อ 5V เข้า ADC ตรง ๆ ต้องใช้ Voltage Divider ลดแรงดันก่อน

ได้ ถ้าออกแบบวงจรแบ่งแรงดันให้เหมาะสม เช่น ใช้ R1 และ R2 ลดให้แรงดันที่ขา ADC อยู่ในช่วงปลอดภัย

เพราะ ADC ของ ESP32 มีความคลาดเคลื่อนในงานจริงได้จากหลายสาเหตุ เช่น ค่าแรงดันอ้างอิงไม่ตรง, ค่าตัวต้านทานคลาดเคลื่อน, หรือมีสัญญาณรบกวน

ได้ และเป็น use case ที่นิยมมาก แต่ต้องออกแบบวงจรแบ่งแรงดันให้รองรับช่วงแรงดันของแบตด้วย

ถ้าคุณต้องการค่าที่แม่นขึ้น แนะนำให้ใช้มัลติมิเตอร์ในการเช็กและคาลิเบรต เพราะจะช่วยให้ค่าที่อ่านจาก ESP32 ใกล้เคียงของจริงมากขึ้น

Shopping Cart
Scroll to Top