Mein Paket… LM 385-Z1.2 – wie messe ich den Batteriestand?

Beim Basteln meines Bluetooth Gamepads ist ein Problem aufgetaucht:
Kabellos, schön und gut, aber der Akku? Eingebaut habe ich einen 1100 mAh LiPo – sollte für genug Spielstunden reichen. Jedoch sind LiPos kritisch, was den Ladezustand angeht. Weder dürfen sie über-, noch tiefenentladen werden. Überladung schließe ich mit einem herkömmlichen USB-LiPo-Charger aus China aus, Tiefenentladung hingegen ist ein heikles Thema.

Wie messe ich bei einem Arduino den Ladezustand, wenn ich die interne Referenz von 1.1V nicht nutzen kann, weil ich z.B. Joysticks über die Versorgungsspannung speise? Die Abhilfe schafft hier eine Referenzdiode des Typs LM385. In Sperrichtung mit 27k an die Versorgungsspannung und GND. Zwischen Diode und Widerstand kann man nun die 1.2V (oder eine andere, je nach Diode) abgreifen. Die Auswertung ist mehr als simpel:
Da analogWert = AnalogIn/Vcc*1024 = 1.2V/Akkuladung*1024
gilt Rückwärts Spannung = 1.2*1024/analogWert
Auf Grund des bescheidenen Spannungsverlaufs von LiPos (4.2V-3.7V schnell, 3.7V für lange Zeit und dann wieder rapide auf 3V fallend) hilft einem die Spannung nicht eine ungefähre Restlaufzeit vorherzusagen. Dafür müssten andere Geschütze aufgefahren werden.
Zusätzlich habe ich noch einen Indikator eingebaut, der signalisiert, ob der Akku geladen wird. Dazu einfach einen NPN-Transistor mit der Basis an den 5V Anschluss des Ladegerätes, den Emitter an GND und Collector mit über den Ladeadapter (mind. dreipolig dadurch) an einen digitalen Pin (mit PullUp). Würde man die 5V mit einem Widerstand oder direkt an einen digitalen Pin legen, so würde der Arduino sich davon mit Spannung speisen, also lieber mit der Methode auf Masse ziehen. Der Akku erreicht bei mir bei ca. 300 einen Zustand „geladen“ (~4,1V), bei 400 sollte man ihn schleunigst vom Verbraucher abnehmen/laden (knapp 3V).

Hier noch ein paar Bilder des Gamepads: