Forum: Mikrocontroller und Digitale Elektronik Batterie Stand in % anzeigen


von Lorenz S. (lorenz_s)


Angehängte Dateien:

Lesenswert?

Hey,
Ich möchte auf einem Arduino den aktuellen Batterie zustand ermitteln.
3V... 0%, 4,2V...100%
Die Spannungsmessung erfolgt durch einen INA219.
Zurzeit versuche ich es mit der Funktion "Map" auf dem Arduino.
Wäre cool wenn ihr mir helfen könnt.

: Verschoben durch Moderator
von Armin K. (-donald-) Benutzerseite


Lesenswert?

Hattest du in der Schule Mathe?

Beitrag #6608412 wurde vom Autor gelöscht.
von Lorenz S. (lorenz_s)


Lesenswert?

Armin K. schrieb:
> Hattest du in der Schule Mathe?

Wäre nett wenn du mir das erklären könntest

von Forenbeobachter (Gast)


Lesenswert?

Irgendwie kommt die dusslige Frage nach "Batterie Stand in % anzeigen"
mindestens alle 7 Tage einmal.

von Udo S. (urschmitt)


Lesenswert?

Dann mach dir erst mal eine Tabelle (auf Papier aka "toter Baum") in die 
du Akkuspannung und Restkapazität einträgst.
Wenn du diese Tabelle hast geht es weiter.

von sonnig (Gast)


Lesenswert?

Lorenz S. schrieb:
> Armin K. schrieb:
>> Hattest du in der Schule Mathe?
>
> Wäre nett wenn du mir das erklären könntest

Das wäre dann ein Dreisatz.

von Udo (Gast)


Lesenswert?

Lorenz S. schrieb:
> Wäre nett wenn du mir das erklären könntest

--> evtl. hilft dir der Suchbegriff "Dreisatz" weiter

von Andras H. (kyrk)


Lesenswert?

Und was tut da nicht?

Sonst ist glaube ich das mit dem Scalieren nur bedingt eine gute Idee. 
Weil die Kurve ja nicht linear ist. Also einfach zu Scalieren wird nur 
mehr oder weniger den Prozent zu sagen. Sonst ist zwischen 30 und 70 
prozent die kurve eher flach, da wird es schwer zu messen.

von Wolfgang (Gast)


Lesenswert?

Das Thema hatten wir gerade letzte Woche
Beitrag "Batterie in Prozent Anzeigen"

von Philipp G. (geiserp01)


Lesenswert?

int sensorValue = analogRead(A0);
  val = map(sensorValue , 0, 1023, 0, 100);

: Bearbeitet durch User
von Weasel P. (philipp_s576)


Lesenswert?

Wenn du es eh nur als lineare Funktion annimmst ....

y(x) = k*x+d

Du hast 2 unbekannte und2 x&y Werte ....

von Praktiker (Gast)


Lesenswert?

Hallo

Forum? -Hier wird geholfen... oder auch nicht :-(

Ich würde es erst gar nicht mit einen Mapping machen sonden eine Tabelle 
(Array) nutzen - eben wegen den alles andere als linearen Zusammenhang 
zwischen der Kapazität und der  Spannung.

Wobei über einen weiten Bereich der Zusammenhang Spannung - Kapazität so 
gering ist das ein verlässlicher Wert eher illusorisch ist.
Die Lösung wäre eher eine Art Ladungs- und dann Entladungsmengenzähler 
wobei du selbst durch Trail and Error herausfinden müsstest wie hoch der 
Lade- Endladewirkungsgrad ist und das dann als Korrekturfaktor 
einbringen.

Dummerweise hängt die Nutzbare Kapazität auch vom Belastungsprofil ab - 
auch gibt es eben -nicht- die eine wahre Entladeschlussspannung aka "0%" 
sondern diese ist davon abhängig was dir wichtig (Maximale Kapazität vs. 
Lebensdauer, Zuverlässigkeit und vieles mehr)ist und was der jeweilige 
Akku (Die -genaue- Zellenchemie welche oft nicht bekannt ist Li-Ionen 
ist nur ein Überbegriff) für Eigenschaften hat.

Alles nicht so einfach - daher auch die typische Balkenanzeige mit 
selten mehr als 4 Balken - genauer ist sehr aufwendig und ein 
Lernprozess des Kapazitätsmessers den man aber selbst erst mal verstehen 
muss (das ist nicht trivial) um es dann der Elktronik bzw. den µC des 
Kapazitätmessers "beizubringen" (Zu Programmieren).

Und leicht OT:
Wieder mal ein trauiges Beispiel wie typischer Weise nicht geholfen 
wird:
Ansatt zu erklären und vorzumachen wie der Dreisatz, oder die Lineare 
Funktion jetzt Funktioniert wird das den TO einfach um die Ohren gehauen 
- das ist keine Hilfe, keine Anleitung auch keine Hilfe für stille 
Mitleser oder durch eine Suchmaschine hier hin geführte Leute.

Das der Ansatz in diesen Fall aus technologischen Gesichtspunkten nicht 
funktioniert (zumindest wenn die prozentangaben der Realtät wenigstens 
angenähert entsprechen sollen) hat nicht mit der Kritik zu tun - würde 
der Ansatz nämlich Funktionieren wäre den TO trotzdem nicht geholfen 
worden, sondern wieder mal nur "arbeitsaufträge" verteilt worden - das 
hat(te) er bestimmt schon viel zu oft in der Schule oder am 
Arbeitsplatz.

Wer keine Lust dazu irgendwelche Anfragen wirklich sinnvoll und 
basierend auf die Frage,  den zu vermutenden Wissensstand und Anspruch 
des jeweiligen TO (nicht nur hier in diesen Fall) hat ja den 
risenvorteil das er nicht Antworten muss und sich entspannt 
zurücklehenen kann und den anderen (eventuell auch niemanden) die Arbeit 
zu überlassen.

von Lorenz S. (lorenz_s)


Lesenswert?

> Und leicht OT:
> Wieder mal ein trauiges Beispiel wie typischer Weise nicht geholfen
> wird:
> Ansatt zu erklären und vorzumachen wie der Dreisatz, oder die Lineare
> Funktion jetzt Funktioniert wird das den TO einfach um die Ohren gehauen
> - das ist keine Hilfe, keine Anleitung auch keine Hilfe für stille
> Mitleser oder durch eine Suchmaschine hier hin geführte Leute.


Danke

von Philipp G. (geiserp01)


Lesenswert?

Ich habe Dir

Lorenz S. schrieb:
> Danke

Ich habe Dir einen Lösungsansatz aufgezeigt:

int sensorValue = analogRead(A0);
  val = map(sensorValue , 0, 1023, 0, 100);

von Forenbeobachter (Gast)


Lesenswert?

Ja, und wenn das Dingens dann 50% anzeigt, ist der Akku
im wesentlichen schon leer. Fuer fortgeschrittene Themen
braucht man eben auch fortgeschrittene Mathematik und
keinen dussligen Dreisatz.

von Kevin M. (arduinolover)


Lesenswert?

Philipp G. schrieb:
> val = map(sensorValue , 0, 1023, 0, 100);

Das bildet aber 0 bis 5V auf 0 bis 100 ab, er will ja 3 bis 4,2V auf 0 
bis 100 abbilden. Demnach bräuchte er:

val = map(sensorValue , 614, 860, 0, 100);

Abgesehen davon ist der Zusammenhang zwischen Spannung und Restkapazität 
gerade im oberen Bereich sehr nichtlinear, erst ab der Nominalspannung 
wird das einigermaßen und selbst da hängt es stark von Einflüssen wie 
der Temperatur und dem Strom ab. Ob man langfristig glücklich mit dieser 
Methode wird ist fraglich.

Akkukapazität bestimmen ist eine Kunst für sich, die einfachste und 
einigermaßen genaueste Methode ist ein coulomb counter der taugt in 
seiner einfachsten Form auch nur bei einigermaßen konstanten Bedingungen 
was die Lade- / Entladeströme und Umgebungstemperatur betrifft. Das 
Bezieht dann auch keine Alterung oder dergleichen mit ein.

von Philipp G. (geiserp01)


Lesenswert?

Kevin M. schrieb:
>> val = map(sensorValue , 0, 1023, 0, 100);
>
> Das bildet aber 0 bis 5V auf 0 bis 100 ab, er will ja 3 bis 4,2V auf 0
> bis 100 abbilden. Demnach bräuchte er:

Ich habe meine Lösung bewusst TO gerecht beantwortet. Denn wenn er nicht 
mal weiss was ein Dreisatz ist, bezweifle ich ernsthaft, dass er eine 
Kurve in einem Array unterbringen kann.

von Batterie leer... (Gast)


Lesenswert?

Irgendwo habe ich mal eine Tabelle gefunden und in mein ESPHome 
integriert:
Spannung  Prozent
4.2  100
4.15  95
4.11  90
4.08  85
4.02  80
3.98  75
3.95  70
3.91  65
3.87  60
3.85  55
3.84  50
3.82  45
3.8  40
3.79  35
3.77  30
3.75  25
3.73  20
3.71  15
3.69  10
3.61  5
3.27  0

ESPHome kann das so verarbeiten und auch Zwischenwerte berechnen. 0% bei 
rund 3.3 Volt macht auch noch Sinn - dann ist noch nicht ganz tot wenn 
man es endlich sieht ;-)

Map wird da wohl nicht direkt gehen. Vielleicht mit switch(case) wenn 
Dir 5%-Stufen reichen; geht natürlich auch mit 1%-Stufen - wird halt 
länger ;-)

von Philipp G. (geiserp01)


Lesenswert?

1
Batterie_Kapazitaet = map(Spannung_Solar , 4.2 , 3 , 100 , 0 );

Und noch was, der Begriff Kapazität in Bezug auf die Akkuspannung ist 
falsch. Auch delay solltest du vermeiden wo möglich.

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Lorenz S. schrieb:
> Hey,
> Ich möchte auf einem Arduino den aktuellen Batterie zustand ermitteln.

miss alle Sekunde den entnommmenen Strom, addiere die Ah/mAh auf und du 
weisst es circa. (wer mag merkt sich auch noch die Spannung oder nimmt 
die mit auf)

Ist zwar kein Ladezustand, aber man weiss ungefähr wieviel noch drin 
steckt.

Angenommen 2000mAh und man entnimmt 10 Stunden 100mA sind 1 Ah weg von 2 
Ah.

: Bearbeitet durch User
von jungerAlterSack (Gast)


Lesenswert?

Jeder Akkutyp hat für gewöhnlich eine Kennlinie mit Spannung u. 
Kapazität, die man aus dem Datasheet entnehmen kann.
Daraus kannst du dir einen formellen Zuammenhang ableiten und mit dem 
gemessenen (AD gewandelten) Wert interpolieren.

von Kevin M. (arduinolover)


Lesenswert?

jungerAlterSack schrieb:
> Jeder Akkutyp hat für gewöhnlich eine Kennlinie mit Spannung u.
> Kapazität, die man aus dem Datasheet entnehmen kann.

Ich glaube nicht. Google mal nach Akku Entladekurve, 18650 Endladekurve, 
etc. Du wirst feststellen das es da mehr als eine Kurve gibt.

von Stefan F. (Gast)


Lesenswert?

Falls dein "Arduino" ein ESP8266 oder ESp32 ist, bedenke dass nicht nur 
die Entladekurve des Akkus nicht linear ist, sondern auch der AD 
Wandler.

Das heißt: Benutze nicht Messwerte vom Multimeter als Basis für die 
Tabelle, sondern Messwerte vom ADC.

von Εrnst B. (ernst)


Lesenswert?

Stefan ⛄ F. schrieb:
> Falls dein "Arduino" ein ESP8266 oder ESp32 ist, bedenke dass
> nicht nur
> die Entladekurve des Akkus nicht linear ist, sondern auch der AD
> Wandler.

-->

Lorenz S. schrieb:
> Die Spannungsmessung erfolgt durch einen INA219.


Der INA219 kann auch gleich noch den Strom messen, wären eigentlich 
ideale Voraussetzungen für

Kevin M. schrieb:
> genaueste Methode ist ein coulomb counter

: Bearbeitet durch User
von Timo N. (tnn85)


Lesenswert?

Ideal wäre gleich einen Battery Monitor oder Battery Gauge IC zu nehmen. 
Gibts von zig Herstellern

https://www.st.com/resource/en/application_note/cd00248578-using-the-stc3100-battery-monitor-for-gas-gauge-applications-stmicroelectronics.pdf

von Stefan F. (Gast)


Lesenswert?

Εrnst B. schrieb:
>> Die Spannungsmessung erfolgt durch einen INA219.

Ach ja, habe ich nicht bedacht.

von Realist (Gast)


Lesenswert?

Hallo

Kevin M. schrieb:
> Ich glaube nicht. Google mal nach Akku Entladekurve, 18650 Endladekurve,
> etc. Du wirst feststellen das es da mehr als eine Kurve gibt.


So ist es - und diese Kurven sind dann noch unter Labor Bedingungen 
aufgenommen werden - anders geht es gar nicht.
Konstantstromentladung  mit genau bekannter Historie des vorhergehenden 
Ladevorgangs und irgendwelchen festen "Lagerzeiten" bis zur Nutzung gibt 
es in der Praxis aber nun mal nicht.
Solange ein Akku nicht nur Selbstzweck ist (eben z.B. zum Aufnehmen der 
Ladekurven, oder um die optimalen Bedingungen herauszufinden, irgendwie 
sinnlos die maximale Kapazität zu verheizen etc.) sind diese 
Entladekurven mehr oder weniger "nur" eine einigermaßen belastbare 
Vergleichsmöglichkeit zwischen verschiedenen Zellen und ein (sehr) grobe 
Hilfe zur Abschätzung der Akkulaufzeit bzw. ob der Akku für die 
vorgesehenen Entladeströme  geeignet ist.
Wobei die Entladeströme dann bei ein und demselben Gerät sehr oft 
zwischen einigen µA bis mehre A liegen können - gerade eben bei den 
Geräten wo Lithium Zellen genutzt werden.
Mit viel Erfahrung kann man eventuell (viele Variablen...) abschätzen 
wie lange das jeweilige Gerät mit den zugehörigen x Ah Akku läuft und 
somit die passende Entladekurve zuordnen - wobei das auch nicht so ganz 
Koscher ist  da eben die Stromspitzen die bis in den Amperebereich gehen 
überproportional in die "Rechnung" eingehen - wobei eine Berechenbarkeit 
in der Praxis schön wäre...

von Akku-Experte (Gast)


Lesenswert?

Lorenz S. schrieb:
> Hey,
> Ich möchte auf einem Arduino den aktuellen Batterie zustand ermitteln.
> 3V... 0%, 4,2V...100%
> Die Spannungsmessung erfolgt durch einen INA219.
> Zurzeit versuche ich es mit der Funktion "Map" auf dem Arduino.
> Wäre cool wenn ihr mir helfen könnt.

der Zusammenhang ist keineswegs trivial, nichtlinear und stark von der 
Akkutechnologie abhängig. Selbst viele Hersteller scheitern daran 
regelmäßig.

Traurig wie auf deine Frage reagiert wird. Sie offenbart zugleich 
grenzenlose Ahnungslosigkeit und Unfreundlichkeit :-)

von Manfred (Gast)


Lesenswert?

Philipp G. schrieb:
> int sensorValue = analogRead(A0);

Hier sind mal wieder diverse Vollpfosten unterwegs:
Lorenz S. schrieb:
> Die Spannungsmessung erfolgt durch einen INA219.

Beim INA219 gibt es kein analogRead, der liefert Werte per I2C, und 
diese verdammt genau.

Joachim B. schrieb:
> miss alle Sekunde den entnommmenen Strom, addiere die Ah/mAh auf und du
> weisst es circa. (wer mag merkt sich auch noch die Spannung oder nimmt
> die mit auf)

Genau so sollte man es machen. Ganz zuende gedacht, misst man auch die 
Ladung und kann damit auf die Alterung reagieren. Als zusätzliche 
Sicherheit packt man eine Endabschaltung nach Spannung dazu.

Die Fragestellung klingt mal wieder nach Kindergarten, per Google 
hierher gefunden und wenig Chancen, es umzusetzen. Der angehängte 
Progarmmkot ist wohl ein Witz, der hat nichts mit INA219 zu tun - Troll 
oder Dussel?

Es gibt auch Ansätze ohne Strommessung: Man rechnet Zeit gegen den 
bekannt typischen Stromverbrauch, wie es z.B. DECT-Telefone machen und 
legt nur einen Notausstieg bei Endspannung an.

jungerAlterSack schrieb:
> Jeder Akkutyp hat für gewöhnlich eine Kennlinie mit Spannung u.
> Kapazität, die man aus dem Datasheet entnehmen kann.

Es gibt keinen Akku, dessen Ladezustand man anhand der Spannung halbwegs 
sinnvoll erkennen kann.

Stefan ⛄ F. schrieb:
> Das heißt: Benutze nicht Messwerte vom Multimeter als Basis für die
> Tabelle, sondern Messwerte vom ADC.

Hauptsache, viele Kommentare, bloß nicht lesen:
"Die Spannungsmessung erfolgt durch einen INA219."

Timo N. schrieb:
> Ideal wäre gleich einen Battery Monitor oder Battery Gauge IC zu nehmen.

Klasse Tip, sehr hilfreich. Vielleicht guckst Du mal das Datenblatt vom 
INA219 an, FuelGauge ist eine für ihn typische Applikation!

------

Der INA219 ist am Arduino mit einer Library aus dem Internet sehr 
schnell in Betrieb zu nehmen, die von Adafruit gibt Spannung und Strom 
direkt als vorzeichenbehaftete Zahl her. Ich habe den INA219 mehrfach 
eingesetzt, ein ziemlich problemloses Teil mit guter Genauigkeit!

Die Zahlen zu verarbeiten, darf der Progarmmierer entweder selbst machen 
oder sich ein anderes Hobby suchen.

von Timo N. (tnn85)


Lesenswert?

Manfred schrieb:
> Timo N. schrieb:
>> Ideal wäre gleich einen Battery Monitor oder Battery Gauge IC zu nehmen.
>
> Klasse Tip, sehr hilfreich. Vielleicht guckst Du mal das Datenblatt vom
> INA219 an, FuelGauge ist eine für ihn typische Applikation!

Finde keinen Akkumulator oder Coloumb Counter in dem IC. Kannst das 
natürlich über IC2 dann im Arduino selbst machen. Aber dann musst du 
deterministisch in immer gleichen ausreichend kurzen Zeitabschnitten den 
Stromwert abfragen.
Ob da was gescheites bei raus kommt...

von Voyager 2 (Gast)


Lesenswert?

Praktiker schrieb:
> Wieder mal ein trauiges Beispiel wie typischer Weise nicht geholfen
> wird:
> Ansatt zu erklären und vorzumachen wie der Dreisatz, oder die Lineare
> Funktion jetzt Funktioniert wird das den TO einfach um die Ohren gehauen
> -

Dreisatz ist in Klasse 6 dran. Lineare Funktion in Klasse 8.
"Hier" ist der falsche Ort und die falsche Zeit.

"Hier" sollte man lediglich empfehlen, sich genauer mit der Akku-Theorie 
zu beschäftigen und erst dann wieder zu kommen, wenn es Fragen gibt.

Nur "ich habe einen Arduino und von überhaupt nichts Ahnung" ist zu 
wenig und nicht zielführend.

von Name (Gast)


Lesenswert?

Sry wegen Tipp- und Grammatikfehler.

@Lorenz: Nur weiter so lass dir nichts abreden!
Bastel dir erstmal eine ungenaue/simple Lösung. Benutze vorerst nur die 
Spannung. Diese hat den größten Einfluss auf die Kapazität. Später 
kannst du auf deine Berechnung andere Faktoren sowie Temperatur und 
Strom dazuholen.

Ansatz 1 - Verstehe was du machst)

Vakt ist die aktuelle Spannung

100 % = Vmax

0 % = Vmin

DiffMax = Vmax - Vmin

d.h 0 bis DiffMax -> 100% bis 0%

((DiffMax - (Vmax - Vakt)) / DiffMax) * 100 = .. %

Schon hast du deine 1. Lösungsweg.

Wenn du genauer werden willst nehme nun auch den nächsten Faktor für die 
Berechnung mit.

Die Batteriespannung hängt von auch fliesenden Strom bzw. Leistung ab 
V=P/I .
Fließt Strom raus nehmt die Spannung ab andersrum nimmt Spannung zu. 
Stoppt man die Ladung/Entladung bleibt die Spannung nicht konstant.
Stoppt man Ladungsvorgang nimmt die aktuelle Spannung ab.
Stoppt man die Entladung nimmt die aktuelle Spannung zu.

von Roland F. (rhf)


Lesenswert?

Hallo,
Manfred schrieb:

> Hier sind mal wieder diverse Vollpfosten unterwegs:...

> Die Fragestellung klingt mal wieder nach Kindergarten...

> Hauptsache, viele Kommentare, bloß nicht lesen:

> Klasse Tip, sehr hilfreich...

Was soll diese überhebliche und aggressive Art? Wenn das für dich hier 
ein Kindergarten ist, stellt sich mir die Frage wieso du dich hier 
überhaupt einbringst.

> Der INA219 ist am Arduino mit einer Library aus dem Internet sehr
> schnell in Betrieb zu nehmen, die von Adafruit gibt Spannung und Strom
> direkt als vorzeichenbehaftete Zahl her. Ich habe den INA219 mehrfach
> eingesetzt, ein ziemlich problemloses Teil mit guter Genauigkeit!

Geht doch.

> ...oder sich ein anderes Hobby suchen.

Und wieder ein Rückfall.

rhf

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.