กลับหน้าหลัก
views
Analog Input Arduino คืออะไร? อ่านค่าเซนเซอร์แบบ 0-1023 ให้เข้าใจจริงๆ
Last updated on

Analog Input Arduino คืออะไร? อ่านค่าเซนเซอร์แบบ 0-1023 ให้เข้าใจจริงๆ


เตรียมของให้พร้อม!

โปรเจคนี้ต้องใช้: TDS Sensor Analog EC Sensor เซ็นเซอร์วัดค่าการนำไฟฟ้าของน้ำ ตรวจสอบคุณภาพน้ำ ใช้ได้กับ arduino esp32 esp8266 และอื่นๆ

🛒 สั่งซื้อที่ Shopee

Analog Input Arduino คืออะไรกันแน่

ถ้าจะอธิบายแบบเข้าใจง่าย Analog Input ใน Arduino ก็คือช่องที่ใช้อ่านค่าสัญญาณไฟฟ้าที่เปลี่ยนแปลงได้ต่อเนื่อง ไม่ใช่แค่ 0 หรือ 1 แบบ digital ธรรมดา ตระกูล Arduino UNO, Nano, Mega จะมีขา Analog Input ตั้งแต่ A0-A5 รวม 6 ช่อง ส่วน Arduino Mega จะมีเยอะกว่านี้

[image: ตำแหน่งขา� Analog Input บนบอร์ด Arduino UNO]

ทำไมต้องเป็นค่า 0-1023?

นี่แหละจุดที่หลายคนงง ค่า 0-1023 มาจากการที่ Arduino ใช้ ADC (Analog-to-Digital Converter) ความละเอียด 10-bit หมายความว่าแบ่งสัญญาณไฟฟ้าออกเป็น 2 ยกกำลัง 10 = 1,024 ระดับ เริ่มจาก 0 ถึง 1023

ถ้าใช้ reference voltage 5V ค่าแต่ละขั้นจะเท่ากับ:

5V ÷ 1024 ≈ 4.88 mV ต่อ 1 หน่วย

นี่คือเหตุผลว่าทำไมเซนเซอร์บางตัวถึงต้องการ voltage divider หรือ amplifier เพื่อให้ไฟฟ้าอยู่ในช่วงที่ Arduino อ่านได้

วงจรพื้นฐานของ Analog Input

การต่อเซนเซอร์แบบ Analog ส่วนใหญ่จะมี 3 ขา คือ VCC, GND และ Signal บางตัวอาจต่อตรงได้เลย บางตัวต้องใช้ pull-down resistor เพิ่ม

[image: วงจรการต่อเซนเซอร์แสง LDR กับ Arduino]

ตัวอย่าง: ต่อ Potentiometer อ่านค่า

const int potPin = A0;  // ขา A0 สำหรับอ่านค่า
int potValue = 0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  potValue = analogRead(potPin);  // อ่านค่า 0-1023
  
  // แปลงเป็นเปอร์เซ็นต์
  int percent = map(potValue, 0, 1023, 0, 100);
  
  Serial.print("Value: ");
  Serial.print(potValue);
  Serial.print(" = ");
  Serial.print(percent);
  Serial.println("%");
  
  delay(100);
}

ใช้ฟังก์ชัน analogRead() รับค่ามาเป็น int อย่างเดียว คืนค่า 0-1023 ถ้าอยากได้เปอร์เซ็นต์หรือช่วงอื่นใช้ map() ช่วยได้

การแปลงค่า Analog เป็นโวลต์จริง

หลายครั้งที่ต้องการรู้ว่าขานั้นรับไฟฟ้ากี่โวลต์จริงๆ ใช้สูตรง่ายๆ นี้:

float voltage = (analogValue / 1023.0) * 5.0;

ใส่จุดทศนิยมหลัง 1023 ด้วย ไม่งั้น C++ จะตัดเศษทิ้ง ได้ค่าผิด

ข้อควรระวังที่เจอบ่อยในการใช้ Analog Input

1. Noise จากไฟฟ้ารบกวน

ค่าที่อ่านได้จากเซนเซอร์บางตัวจะกระโดดไม่หยุด โดยเฉพาะสายยาวหรืออยู่ในห้องที่มีมอเตอร์ไฟฟ้า วิธีแก้ง่ายๆ คือใช้การเฉลี่ย:

int readSmooth(int pin, int samples) {
  long sum = 0;
  for (int i = 0; i < samples; i++) {
    sum += analogRead(pin);
    delay(1);
  }
  return sum / samples;
}

ใช้ 5-10 ตัวอย่างก็พอ อย่ามากเกินไปจน delay เยอะ

2. Reference Voltage ไม่เสถียร

ถ้าใช้ USB จ่ายไฟ แรงดันอาจไม่ถึง 5V จริงๆ อาจเป็น 4.7-4.9V ทำให้ค่าคำนวณผิด ถ้าต้องการความแม่นยำสูง ใช้ external reference หรือวัดแรงดันจริงด้วยมัลติมิเตอร์แล้วปรับสูตร

3. ขาบางขาถูกใช้เป็น Digital I/O แล้ว

ขา A0-A5 บน Arduino UNO/Nano สามารถใช้เป็น digital ขา 14-19 ได้ด้วย ถ้าโค้ดเซ็ตผิดจะอ่านค่าไม่ได้ ตอนใช้ analog ไม่ต้อง pinMode ก็อ่านได้เลย

[image: สภาพสัญญาณ Analog Input ก่อนและหลังกรอง noise]

ตัวอย่างการใช้งานจริง: เซนเซอร์วัดคุณภาพน้ำ

สำหรับโปรเจกต์ที่ต้องวัดค่าการนำไฟฟ้าของน้ำ เช่น ตรวจสอบ TDS (Total Dissolved Solids) หรือ EC (Electrical Conductivity) จะใช้ Analog Input อ่านค่าสัญญาณจากเซนเซอร์ แล้วแปลงเป็นค่า ppm หรือ μS/cm

TDS Sensor Analog EC Sensor เซ็นเซอร์วัดค่าการนำไฟฟ้าของน้ำ ตรวจสอบคุณภาพน้ำ ใช้ได้กับ arduino esp32 esp8266 และอื่นๆ

// ตัวอย่างโค้ดอ่านค่า TDS
#define TdsSensorPin A1
#define VREF 5.0

float tdsValue = 0;

void setup() {
  Serial.begin(115200);
}

void loop() {
  int sensorValue = analogRead(TdsSensorPin);
  float voltage = sensorValue * VREF / 1023.0;
  
  // แปลงค่า voltage เป็น TDS (ppm)
  tdsValue = (voltage * 133.42) - 16.09;
  
  Serial.print("TDS Value: ");
  Serial.print(tdsValue);
  Serial.println(" ppm");
  
  delay(1000);
}

Arduino กับ ESP32 ใช้ Analog Input ต่างกันอย่างไร

ตระกูล ESP32 ที่นิยมใช้ทำ IoT มี ADC ความละเอียด 12-bit อ่านค่าได้ 0-4095 มากกว่า Arduino ถึง 4 เท่า แต่ก็มีข้อควรระวังเรื่อง attenuation ที่ต้องตั้งค่าถูกต้องไม่งั้นค่าจะอ่านผิด

ถ้าสนใจบอร์ด ESP32 ที่มี ADC ดีกว่า Arduino อ่านได้ที่ ESP32 คืออะไร? เจาะลึกบอร์ด IoT ยอดนิยมที่แรงกว่า Arduino

สรุป: สิ่งที่ต้องจำเกี่ยวกับ Analog Input

  • ค่าที่อ่านได้ = 0-1023 บน Arduino (2^10)
  • ใช้ analogRead(pin) ไม่ต้อง pinMode
  • ขา A0-A5 สามารถใช้เป็น digital ได้ด้วย (ขา 14-19)
  • แปลงเป็นโวลต์: voltage = (value / 1023.0) * 5.0
  • ถ้าค่ากระโดด ใช้ averaging ช่วยได้
  • หลีกเลี่ยงสายยาวเกินไปและแหล่ง noise

ถ้ายังไม่แน่ใจเรื่องพื้นฐานของ Arduino เอง แนะนำอ่านบทความ Arduino คืออะไร? เริ่มต้นเรียนรู้ฉบับเข้าใจง่าย ก่อนจะไปต่อ

[image: เปรียบเทียบสัญญาณ Digital และ Analog บน Oscilloscope]

อยากทำโปรเจคแบบนี้?

รับทำโปรเจค Arduino / IoT จบงานไว ส่งงานครบ พร้อมสอน

หากต้องการ รับทำโปรเจคอาดูโน่ หรือระบบ IoT แบบเร่งด่วน สามารถดูรายละเอียดบริการได้ที่หน้าแรก

จ้างทำโปรเจคเลย

ความคิดเห็น