LCD individuelle Symbole für LiPo Akkuüberwachung mit Unterspannungsabschaltung

Hallo,

ich habe mal diesen Thread zum Anlass genommen und mich mal dem Batteriemanagment für eine LiPo Zelle zur Stromversorgung eines Arduinos gewidment.

Die Schaltung von Gunther funktioniert auch in der Praxis. Meine Prinzipschaltung weiter oben funktioniert in der Praxis nicht. Beim Abschalten leitet der Ausgang wieder gegen Masse und der µC macht einen Reset und fängt wieder von vorne an :fearful:
Weiterhin wollte ich für ein LCD ein Piktogramm mit dem Ladezustand des Akkus, wie man es auch aus Fertiggeräten kennt und eine Notabschaltung, um den Akku nicht zu schädigen.
Um Ladeschaltung und StepUp-Wandler auf 5V für den Arduino braucht man sich keinen Kopf zu machen. Beide Module gibts beim freudlichen Chinesen für kleines Geld :smiley:
Lademanagment: http://www.ebay.de/itm/370906211162?ssPageName=STRK:MEWAX:IT&_trksid=p3984.m1423.l2649
StepUp Wandler: http://www.ebay.de/itm/121150366656?ssPageName=STRK:MEWAX:IT&_trksid=p3984.m1423.l2649
Beide Module gleichzeitig am Akku kommen sich nicht ins Gehege, denn beim Laden bleibt die Spannung unter 4,2V und damit kann der Schaltreger ordnungsgemäß sogar beim Laden arbeiten.
Es ist aber empfehlenswert, auf dem Laderegler den Widerstand für den Ladestrom anzupassen, denn 1A Ladestrom ist schon ziemlich heavy. Ich habe einen 1300 mA Akku von einer verfolssenen DigiCam “recycelt”.
Kernfrage war der Spannungsverlauf bei der Entladung, um eine vernünftige Vorhersage über Ladezustand treffen zu können. Dazu kommt noch erschwerend, das bei sinkender Spannung der Batteriestrom steigen muß, damit die Leistung gleichbleibt. Bei sinkender Spannung sinkt dazu auch noch der Wirkungsgrad des Wandlers…
Ich habe zur Aufnahme der Messwerte einfach eine Cree-LED mit 10 Ohm Vorwiderstand an den StepUp Wandler angeschlossen. Der Wandler hält die 5V absolut stabil. Somit bleibt der Strom im 5V Kreis ebenfalls stabil. Es herrschen also praxisrelavante Bedingungen. Dabei wird der + Pol des Akkus über den Analogeingang A0 überwacht. Das ist ohne weiteres möglich, da das Modul eine durchgehende Masse besitzt. 8)
Hier mein Code:

/*
please note, voltage setpoints in result with one LiPo cell with china step-up converter to 5V
lower voltage, more current, lower efficency, much more current...
setpoints for 6 identical timewindows
*/
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x20,20,2);  // set the LCD address to 0x20 for a 16 chars and 2 line display
int switchOff = 8;        // pin for undervoltage switch off

char a = 0;
char b = 1;
char c = 2;
char d = 3;
char e = 4;
char f = 5;


byte batt100[8] = {
B01110,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B00000
};
byte batt80[8] = {
B01110,
B10001,
B11111,
B11111,
B11111,
B11111,
B11111,
B00000
};
byte batt60[8] = {
B01110,
B10001,
B10001,
B11111,
B11111,
B11111,
B11111,
B00000
};
byte batt40[8] = {
B01110,
B10001,
B10001,
B10001,
B11111,
B11111,
B11111,
B00000
};
byte batt20[8] = {
B01110,
B10001,
B10001,
B10001,
B10001,
B11111,
B11111,
B00000
};
byte batt0[8] = {
B01110,
B10001,
B10001,
B10001,
B10001,
B10001,
B11111,
B00000
};

void setup()
{
  pinMode(switchOff, OUTPUT);      // initialize aus output
  lcd.init();                      // initialize the lcd 
 
  lcd.backlight();
 Serial.begin(9600);
lcd.createChar(0, batt100);
lcd.createChar(1, batt80);
lcd.createChar(2, batt60);
lcd.createChar(3, batt40);
lcd.createChar(4, batt20);
lcd.createChar(5, batt0);
}

void loop()
{
int sensorValue = analogRead(A0);                // analog input for voltage detection one cell LiPo accu +3,6V
digitalWrite (switchOff, 1);                    // set power on 
float voltage = sensorValue * (5.19 / 1023.0);   // use real supply voltage 5V is theory :-)
lcd.setCursor(0, 0);
lcd.write(0);
lcd.print(" ");
lcd.write(1);
lcd.print(" ");
lcd.write(2);
lcd.print(" ");
lcd.write(3);
lcd.print(" ");
lcd.write(4);
lcd.print(" ");
lcd.write(5);
lcd.setCursor(0, 1);
if ((0 <= voltage) && (voltage < 3.57)) lcd.write(5);     //     0 to 16,66% running time  
if ((3.57 <= voltage) && (voltage < 3.63)) lcd.write(4);  // 16,66 to 33,33% running time
if ((3.63 <= voltage) && ( voltage < 3.67)) lcd.write(3); // 33,33 to 50,00% running time
if ((3.67 <= voltage) && ( voltage < 3.77)) lcd.write(2); // 50,00 to 66,66% running time
if ((3.77 <= voltage) && ( voltage < 3.91)) lcd.write(1); // 66,66 to 83,33% running time
if ((3.91 <= voltage) && ( voltage < 5.0)) lcd.write(0);  // 83,33 to   100% running time
if ((voltage) <= 3.0) digitalWrite(switchOff, 0);         // switch off by undervoltage
lcd.setCursor(2, 1);
lcd.print(voltage);
lcd.print(" V"); 
Serial.println(voltage);
delay(1000);
}

Da sich nur 8? Sondersymbole definieren lassen, will vielleicht nicht jeder 6 Symbole für den Batteriestatus opfern. Es gehen natürlich auch weniger. Bei Bedarf stelle ich auch noch die menütlichen 225 Spannungsmesswerte zur Verfügung, damit jeder sich die Werte selber raussuchen kann.
Im Bespielcode habe ich in der oberen Reihe des Displays einfach mal alle definierten Symbole abgebildet. In den Arrys sind 1:1 die Pixel drin. 0 ist aus und 1 ist an. Abwandlungen sind also kein Problem.
Hier noch die Bilder:
Eine mögliche Verbesserung wäre noch, statt der ausgerechneten Volt mit den “Rohdaten” vom AD-Wandler zu arbeiten, da so noch eine bessere Auflösung zu Stande kommt, als durch die Umrechnung und Rundung bedingt. Dann hätte ich aber auch die Messwerte so aufnehem müssen :blush:

Gruß Gerald

Hallo Gerald! Schönes Projekt hast du da zusammengestellt, sieht gut aus!

Gruß Frank

Hallo Frank,

ich bin da eigentlich drauf gekommen, im Zuge des ebenfalls hier vorgestellten Schimmelwarners ein nutzbares Gerät daraus zu machen. Aber ich dachte, das die Akkuüberwachung immer wieder in verschiedenen Projekten zu gebrauchen ist. Deshalb habe ich es hier vorgestellt, auch wenn der Nutzen für sich alleine ziemlich begrenzt ist :) In wie weit sich die Spannungswerte von Akkumodell zu Akkumodell verschiedener Hersteller, die oft auch noch eine unterschiedliche Chemie verwenden, übertragen lassen, muß sich zeigen. Wenn der StepUp Regler nicht verwendet wird, ändert sich ebenfalls die zeitliche Entladekennlinie, da die Stromaufnahme dann bei sinkender Spannung ebenfalls sinkt, statt zu steigen. Aber das Prinzip der Kennlinienaufnahme habe ich aufgezeigt. Ließe sich sicherlich auch mit einem Datenlogger auf SD-Karte automatisieren... :D

Gruß Gerald

Stimmt, und mit einem Datenlogger könnte man die Kurven aufzeichnen und auf Dauer einen “Gesundheitscheck” des Akku’s realisieren.

Gruß Frank

Gute Idee, das ist das Schöne an Open Hardware :D Dann ist das Akkumanagement warscheinlich umfangreicher, als manche Schaltung , die damit betrieben wird :P

Der Weg ist das Ziel 8) 8) 8) 8)

Hallo,

ich würde gerne den Code hier verwenden um zu darzustellen wie der Status von meinem Lipo Akku ist. Kann mir jemand helfen wie ich die Schaltung aufbauen muss um das zu realisieren?

Gruß