Analog Input Arduino คืออะไร? อ่านค่าเซนเซอร์แบบ 0-1023 ให้เข้าใจจริงๆ
เตรียมของให้พร้อม!
โปรเจคนี้ต้องใช้: TDS Sensor Analog EC Sensor เซ็นเซอร์วัดค่าการนำไฟฟ้าของน้ำ ตรวจสอบคุณภาพน้ำ ใช้ได้กับ arduino esp32 esp8266 และอื่นๆ
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
#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 แบบเร่งด่วน สามารถดูรายละเอียดบริการได้ที่หน้าแรก
จ้างทำโปรเจคเลย