บทนำ:
ในโปรเจกต์นี้ ผมจะสร้าง Digital Voltmeter โดยใช้ Arduino nano และ HD44780 Compatible 16*2 LCD เราจะป้อนแรงดันไฟ analog ที่ต้องการวัดเข้าสู่ขา analog input ขาหนึ่งของ Arduino เราสามารถวัดแรงดัน DC ได้สูงสุด 5V ด้วย Digital Voltmeter นี้ ผมจะพยายามเพิ่มช่วงการวัดให้มากขึ้นในโปรเจกต์ต่อๆ ไป
รายการ Hardware:
- 1. Arduino Nano
- 2. HD44780 LCD Display ( 16*2)
- 3. 10K potentiometer
- 4. Bread Board
- 5. 10K trimmer potentiometer
- 6. Jumper wire
- 7. 100 ohm resistor
- 8. Mini B USB Cable
ทำตามขั้นตอนที่ให้ไว้เพื่อตั้งค่าทุกอย่างให้ถูกต้อง
ขั้นตอนที่ 1 – เสียบ Arduino nano และ HD44780 LCD display ลงบน Bread Board อย่างระมัดระวัง หลังจากเสียบอุปกรณ์ทั้งสองนี้แล้ว ให้เสียบ 10K trimmer, 10K potentiometer และ 100 ohm resistor เพิ่มเติมตามที่แสดงในรูปภาพด้านล่าง
ขั้นตอนที่ 2 – เชื่อมต่อขาต่างๆ ของ hardware เข้าด้วยกันตาม Schematic diagram ที่ให้ไว้ เมื่อการเดินสาย hardware เสร็จสิ้น โปรดตรวจสอบการเชื่อมต่อทั้งหมดซ้ำสองครั้ง เพื่อไม่ให้เกิดข้อผิดพลาดในการเดินสายใดๆ หลังจากเดินสายแล้ว การตั้งค่าของคุณจะมีลักษณะดังนี้
ขั้นตอนที่ 3 – ปรับความคมชัดของตัวอักษรที่แสดงบนหน้าจอ LCD ให้ได้ระดับที่คุณต้องการ โดยหมุนปุ่มของ 10K Trimmer ตามเข็มนาฬิกาหรือทวนเข็มนาฬิกาด้วยไขควง
ขั้นตอนที่ 4 – เขียน Sketch เพื่ออ่านแรงดันไฟ analog จากขา analog ขาหนึ่งของ Arduino และแสดงค่าแรงดันนี้บน LCD Display
ในการคำนวณแรงดันไฟ analog input ของขา analog input ใดๆ เราใช้สูตรพื้นฐานของ DAC หรือ ADC Convertor ซึ่งก็คือ
Vout = (digital input * Vref)/Resolution of the ADC
ไมโครคอนโทรลเลอร์ Atemega328P ของ Arduino nano มี ADC ชนิด Successive approximation แบบ 10 Bit ที่แปลงค่า analog เป็นค่า binary ขนาด 10 bit
ขั้นตอนที่ 5 – หลังจากคำนวณค่าแรงดันบนขา analog ของ Arduino แล้ว เราจะแสดงค่าแรงดันนี้บน 16*2 LCD
ขั้นตอนที่ 6 – หลังจากเขียน Sketch แล้ว ให้ Verify Sketch และเมื่อการ Verify เสร็จสิ้น คุณควร Upload Sketch นี้ไปยัง hardware ของคุณโดยใช้ Latest Arduino Software
Sketch (โค้ด C/C++)
#include
LiquidCrystal lcd(5,6,7,8,9,10);
float voltage;
float val;
const int Vref = 5.0;
const int resolution = 1024.0;
void setup() {
// put your setup code here, to run once:
lcd.begin(16,2);
lcd.setCursor(0,0);
lcd.print("Voltage:");
}
void loop() {
// put your main code here, to run repeatedly:
val = analogRead(A3);
voltage = (val*Vref)/resolution;
lcd.setCursor(0,1);
lcd.print(voltage);
delay(90);
}
รูปภาพผลงานของผม -
Schematicdiagram -
รายละเอียดทางเทคนิคเพิ่มเติม
ทฤษฎีการแบ่งแรงดัน (Voltage Division Theory)
แม้ว่า ADC ของ Arduino สามารถวัดแรงดันได้สูงสุดเพียง 5V แต่โปรเจกต์นี้ใช้ Resistor Voltage Divider เพื่อวัดแรงดันที่สูงกว่ามาก (เช่น 0-25V)
- การออกแบบวงจร: ใช้ 10kΩ และ 2.2kΩ Resistor ต่ออนุกรมกัน ซึ่งจะปรับลดสัญญาณ 24V ลงมาเหลือประมาณ 4.3V ซึ่งปลอดภัยสำหรับขา analog ของ Arduino
- หลักการทางคณิตศาสตร์: Firmware จะคูณค่าที่อ่านได้จาก ADC ดิบ (0-1023) ด้วย "Correction Factor" ที่ได้มาจากค่า Resistor และแรงดันอ้างอิง (5.0V)
ความปลอดภัยและการแสดงผล (Safety & Display)
- การป้องกัน: มี Zener Diode (5.1V) คล่อมที่ input เพื่อป้องกันแรงดันเกินโดยไม่ตั้งใจ ซึ่งอาจสร้างความเสียหายให้กับไมโครคอนโทรลเลอร์
- UI: แรงดันแบบเรียลไทม์จะแสดงบน 16x2 LCD ที่มีความแม่นยำ 2 ตำแหน่งทศนิยม สร้างเครื่องมือวินิจฉัยแบบพกพาที่สะดวกสบายสำหรับการทดสอบแบตเตอรี่และ Power supply