Spannungsmessung und automatische Abschaltung bei leerem Akku

#1

Hallo zusammen!

Mein TonUNIO funktioniert inzwischen so wie ich es mir vorgestellt habe. Einschalten per Taster über den Polulu Switch, Akku kann über USB geladen werden und der Timer schaltet das Gerät nach 5min ab.

Letzter Punkt auf der Wunschliste ist jetzt die automatische Abschaltung bei zu geringer Akkuspannung um den Akku nicht zu schrotten und ggf. beim Einschalten eine Warnung wenn die Kapazität unter 25% gefallen ist.

Dafür benötige ich aber sowohl etwas “Hardware” um mit dem Arduino die Akkuspannung zu messen und natürlich die passende Software. Kann mir da jemand behilflich sein oder gibt es sogar die Chance das in die DEV zu bekommen? So als Option im Admin Menü wie bei der Abschaltoption?

Gruß
Papa

0 Likes

#2

Je nach Aufbau könntest du die Spannung über einen freien analog pin messen. Basierend darauf ist Warnung ausgeben oder auch abschalten relativ einfach. Ich hab das so ähnlich für die cubiekid Platine implementiert, messe die Spannung allerdings intern (geht aber nicht bei jedem Aufbau). Kommt halt aufs Setup an.

0 Likes

#3

Intern bedeutet, der Arduino misst seine eigene Betriebsspannung? Also geht das nur bei einem Aufbau ohne Step-Up Treiber?

Ich hatte an die Lösung per Analog Pin gedacht, aber bei der bisherigen Recherche bin ich nicht wirklich weit gekommen. Es gibt zwar relativ viele Informationen, aber irgendwie mehr Fragen und Probleme als Antworten.

0 Likes

#4

Ja genau. Und ja genau.

Ich bin nicht der Meisterelektroniker, aber vom Prinzip her müsste man auch die LiPo Spannung vor dem booster abgreifen können und dann am analog Pin messen können, aber da können andere hier sicher mehr zu sagen.

Mal ne frage, um den Akku zu schützen haste doch sicher ne Schaltung verbaut oder? Es geht hier also nur darum nicht von der Abschaltung überrascht zu werden?

0 Likes

#5

Nein, so eine Schutzschaltung schaltet wirklich erst im letzten Moment ab und ist wirklich nur als reine Notlösung gedacht. Es schadet den Akkus, wenn man die immer bis zur Notabschaltung runter nudelt. Daher würde ich die Schwelle für die Abschaltung gerne etwas höher ansetzen. Bei meinen Taschenlampen fahre ich die LiIon Zellen zwischen 3,5 und 4,1V. Beim Tonuino würde ich wegen den geringen Strömen wohl zwischen 3,3V und 4,0V bleiben wollen. Und für die LiFePO4 Zellen kann man bis 2,5V runter gehen, voll sind die bei 3,6V. Aber auch hier sagt der Hersteller, wenn man die Zellen zwischen 20 und 80% Kapazität verwendet, halten die 5.000 Ladungen durch. Man könnte also jeden Tag laden und die Akkus würden trotzdem >10 Jahre halten - zumindest theoretisch.

0 Likes

#6

Da klemm ich mich mal dazu - das ist nämlich genau das, was mir auch noch fehlt… Jedoch bin ich leider ebenso ratlos und trotz Lesens bislang nur unsicherer geworden… :confused:

0 Likes

#7

Also wenn ich das richtig verstehe, kann man den Lipo direkt an einen analogen Pin anschließen. Hardware brauch man also keine, abgesehen von einem Kabel:

https://42project.net/praezise-analoge-spannungsmessungen-mit-dem-arduino-anhand-einer-referenzspannung-messen/

Da die meisten den Arduino über einen Step-Up (oder Step-Down) mit konstanter Ausgangsspannung betreiben werden, kann dieser als Referenz dienen. Ob das genau genug ist, müsste man testen.

Die Frage ist, wo im Code bauen wir das ein und wie oft soll die Spannung abgefragt werden.

Mir würde beim Einschalten eine Warnung (Audiofile) bei unter 25% reichen, wenn im Code die Spannung eingetragen werden könnte, wäre das super.

Und bei der Abschaltung halt vorher den Text abspielen den ich schon irgendwo gelesen habe: “Oh, mein Akku ist leer. Bitte Mama oder Papa das die mich wieder aufladen” oder so ähnlich :wink:
Hier auch die Spannung im Code einstellen und dann automatisch abschalten - wie schon beim Timer implementiert.

0 Likes

#8

Im Prinzip ist das eigentlich kein großes Problem. Die relevanten Suchbegriffe sind “Arduino Spannung Messen” und “Spannungsteiler”. Damit findet man sowohl benötigte Hardware (worst case paar Widerstände aus der Bastelkiste) und auch Beispielcode.

0 Likes

#9

Ich habe das oben im main loop(). Ist natürlich jetzt etwas anders als ihr es machen würdet (analogread() usw.) und nicht die Library die ich da verwende für die interne Spannung. Wenn die kritische Spannung erreicht wird, kommt noch ne Ansage (genau wie @papa oben schreibt) und die Box geht aus.

1 Like

#10

Da habe ich wiederum gelesen, dass im ausgeschalteten Zustand keine Spannung an den analogen Pins anliegen sollte bspw.: http://forum.arduino.cc/index.php?topic=287377.msg2012671#msg2012671

Soweit war ich auch schon, aber wie man den Spannungsteiler in dem speziellen Fall dimensionieren sollte, ohne nachher ggf. zu hohe Verluste zu haben übersteigt mein elektronisches Verständnis, weshalb ich auf die Erfahrung von Euch hoffe…

0 Likes

#11

Also ich würde einfach den Ausgang vom Polulu an den analog Pin legen, dann liegt auch keine Spannung an, wenn der Arduino abgeschaltet ist.

Spannungsteiler benötigt man ebenfalls keinen, da wir bei einem LiPo/LiFePo4 immer unter den maximalen 5V bleiben.

Theoretisch braucht es dann nur zwei Zeilen Code um die Spannung auszulesen:

int v=analogRead(analogPin);
voltage=v/1023*5.0;
0 Likes

#12

Ja gute Idee. Hängt halt vom Setup ab wie man es am dümmsten macht.

Ich hatte das mit dem Spannungsteiler erwähnt damit es etwas allgemein gültiger ist. Und nicht jemand hier auf die Idee kommt 12V (oder mehr) an arme, kleine, analog Pins anzulegen. So hast du natürlich Recht.

Genau, und abhängig davon dann eben Ansage, abschalten etc.pp.

0 Likes

#13

OK, ich werde mich an einen Testaufbau wagen. Welcher Pin wäre denn auf unserer Platine dafür geeignet und noch frei? Und was tragen wir dann hier ein?

int analogPin=1;

Ach so, und wie kann ich den aktuellen Wert zum überprüfen ausgeben?

0 Likes

#14

Einzeiler zum Test:

Serial.println(analogRead(A6));

0 Likes

#15

Aber nicht wundern wenn da dann eine Zahl zwischen 0 und 1024 raus kommt das ist der roh wert des 8 bit adc.

0 Likes

#16

Klaro. Deswegen meinte ich ja zum Test. Muss man dann natürlich entsprechend umrechnen oder ggf. mit map() arbeiten (wobei das mit integern arbeitet, für Spannungen in dem Bereich eher unvorteilhaft).

0 Likes