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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
#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 "); } |