
يتيح المدخل التناظري في الأردوينو قياس جهد البطارية وعرضه على شريط من عشرة مصابيح LED، لكن يجب أولًا خفض الجهد إلى نطاق آمن للمدخل. يشرح هذا المشروع طريقة قياس بطاريات يصل جهدها إلى نحو 15V باستخدام مقسّم جهد، مع كود يعتمد على متوسط عدة قراءات لتحسين الثبات.
مبدأ القياس
يحوّل محول ADC ذو الدقة 10 بت في Arduino Uno الجهد من 0 إلى جهد المرجع إلى قيمة رقمية من 0 إلى 1023. نستخدم مقاومة 30kΩ بين موجب البطارية ونقطة القياس، ومقاومة 7.5kΩ بين نقطة القياس والأرضي؛ فتكون نسبة المقسّم 5:1 تقريبًا. لذلك يظهر على A0 نحو 3V عندما يكون جهد البطارية 15V.
المعادلة العامة هي: Vbattery = ADC × (Vref / 1023) × ((R1 + R2) / R2). قِس قيمة 5V الفعلية في لوحتك بالملتيميتر واستخدمها بدل القيمة الاسمية للحصول على نتيجة أفضل.
المكونات والتوصيل
- Arduino Uno، وشريط LED مكوّن من 10 شرائح أو عشرة مصابيح منفصلة.
- عشر مقاومات 220Ω أو 330Ω لتحديد تيار مصابيح LED.
- مقاومة 30kΩ وأخرى 7.5kΩ لمقسّم الجهد، ويفضل بدقة 1%.
- مكثف 100nF اختياري بين A0 وGND لتقليل الضوضاء.
| التوصيل | المسار |
|---|---|
| موجب البطارية | إلى R1=30kΩ ثم إلى نقطة القياس A0 |
| نقطة A0 | إلى R2=7.5kΩ ثم إلى GND |
| سالب البطارية | إلى GND في الأردوينو |
| شرائح LED | من D2 إلى D11، وكل شريحة عبر مقاومة مستقلة |
الكود البرمجي
const byte VOLTAGE_PIN = A0;
const byte ledPins[10] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
const float VREF = 5.00; // استبدلها بالقيمة المقاسة على طرف 5V
const float R1 = 30000.0;
const float R2 = 7500.0;
const float DIVIDER_RATIO = (R1 + R2) / R2;
const float DISPLAY_MAX_VOLTAGE = 15.0;
float readBatteryVoltage() {
unsigned long sum = 0;
const byte samples = 16;
for (byte i = 0; i < samples; i++) {
sum += analogRead(VOLTAGE_PIN);
delay(3);
}
float raw = sum / float(samples);
float pinVoltage = raw * (VREF / 1023.0);
return pinVoltage * DIVIDER_RATIO;
}
void showLevel(float voltage) {
int lit = int((voltage / DISPLAY_MAX_VOLTAGE) * 10.0 + 0.5);
lit = constrain(lit, 0, 10);
for (byte i = 0; i < 10; i++) {
digitalWrite(ledPins[i], i < lit ? HIGH : LOW);
}
}
void setup() {
Serial.begin(9600);
for (byte i = 0; i < 10; i++) {
pinMode(ledPins[i], OUTPUT);
}
}
void loop() {
float voltage = readBatteryVoltage();
showLevel(voltage);
Serial.print("Battery voltage: ");
Serial.print(voltage, 2);
Serial.println(" V");
delay(500);
}المعايرة وحدود الاستخدام
قارن القراءة بملتيميتر موثوق عند أكثر من جهد، ثم عدّل VREF أو نسبة المقسّم إذا ظهر انحراف ثابت. احسب قدرة المقاومات قبل قياس جهود أعلى، وأضف مصهرًا وحماية من عكس القطبية في التطبيقات الدائمة.
عدد شرائح LED هنا يعرض نسبة من نطاق القياس 0–15V، وليس «نسبة شحن» دقيقة. العلاقة بين الجهد وحالة الشحن تختلف باختلاف كيمياء البطارية والحمل ودرجة الحرارة. إذا أردت مؤشر حالة شحن حقيقيًا، استخدم خوارزمية ومنظومة قياس ملائمة لنوع البطارية.
Leave your comment