قياس جهد البطارية بالأردوينو وعرضه على شريط LED

رسم هندسي توضيحي: قياس جهد البطارية بالأردوينو وعرضه على شريط LED

يتيح المدخل التناظري في الأردوينو قياس جهد البطارية وعرضه على شريط من عشرة مصابيح LED، لكن يجب أولًا خفض الجهد إلى نطاق آمن للمدخل. يشرح هذا المشروع طريقة قياس بطاريات يصل جهدها إلى نحو 15V باستخدام مقسّم جهد، مع كود يعتمد على متوسط عدة قراءات لتحسين الثبات.

مهم: لا توصل بطارية أعلى من جهد مرجع الأردوينو مباشرة بالمدخل A0. ولا تستخدم مؤشر الجهد بديلًا عن دائرة حماية أو شاحن مخصص، خصوصًا مع بطاريات الليثيوم.

مبدأ القياس

يحوّل محول 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

*
*
Only registered users can leave comments.