Akku-Tester

Es kommt ja immer wieder einmal vor, dass man die Kapazität seiner Liion-Zellen wissen möchte. Hier ein sehr einfaches Programm mit dem Arduino, welches eben genau diese Kapazität in mAh ermittelt. Einstellbar ist die Entladeschlussspannung (z.B. 2.8 V) und der Entladewiderstand. Angezeigt wird immer die momentane Akkuspannung und die bisherige Akkukapazität. Als Mosfet eignet sich eigentlich ein jeder Logiktyp (Buchstabe L im Namen) mit ausreichender Strombelastbarkeit, z.B. der IRL3103.

Hier ein typisches Testergebnis einer 18650-Zelle:

 

Arduino-Programm:

#include <LiquidCrystal_I2C.h>
#include <Wire.h>

LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display. ACHTUNG: Adresse kann auch 0x3F sein !!!

// Anschlüsse:
// GND - GND
// VCC - 5V
// SDA - ANALOG Pin 4
// SCL - ANALOG pin 5

int pushButton = 2;
int Mosfetgate = 3;

float voltage_old, voltage_new;
float voltage_stop;
float resistance;
float charge;

int time_old, time_new;


// ===========================
// =======   SETUP   =========
// ===========================

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

    pinMode(pushButton, INPUT);
    pinMode(Mosfetgate,OUTPUT);
    
    lcd.begin();        // initialize the lcd
    lcd.backlight();
    lcd.setCursor(0,0);
    lcd.print("Batterien-");
    lcd.setCursor(0,1);
    lcd.print("Kapazitaetmesser");
    
    delay(3000);
    
    lcd.setCursor(0,0);
    lcd.print("insert battery");
    lcd.setCursor(0,1);
    lcd.print("& press button  ");

    charge = 0.0;
    voltage_stop = 2.80;    // stopping-voltage of the battery

    resistance = 2.12;      // value of the discharging-resistor
        
   }


// ===========================
// =======    LOOP   =========
// ===========================

void loop()
   {
    while(digitalRead(pushButton) == LOW)     // Waiting for push button to start
        {
          
        }


    digitalWrite(Mosfetgate, HIGH);
    delay(10);
    
    voltage_old = analogRead(A0) * 5.0 / 1023;
    time_old = millis();

    charge = 0.0;

            

    while(5.0 * analogRead(A0) / 1023 > voltage_stop)    // While battery-voltage higher than lower-limit, run measurement
       {
        time_new = millis();
        voltage_new = analogRead(A0) * 5.0 / 1023;

        charge = charge + (0.5 * (voltage_new + voltage_old)/ resistance) * ((time_new - time_old) / 1000.0) / 3.6;    // floated charge in mAh

        
        delay(1000);

        time_old = time_new;
        voltage_old = voltage_new;
        
        lcd.setCursor(0,0);
        lcd.print("U = ");
        lcd.print(voltage_new,2);
        lcd.print(" V       ");

        lcd.setCursor(0,1);
        lcd.print("Q = ");
        lcd.print(charge,0);
        lcd.print(" mAh ...  ");
        
        
       }

    digitalWrite(Mosfetgate, LOW);

    lcd.setCursor(0,0);
    lcd.print("U_end = ");
    lcd.print(voltage_new,2);
    lcd.print(" V       ");

    lcd.setCursor(0,1);
    lcd.print("Q_end = ");
    lcd.print(charge,0);
    lcd.print(" mAh    ");
   
    
   }