# ontlaadtest.py - een NiMH-cel ontladen met een constante stroom, en tellen wat eruit komt
import math

CAPACITEIT = 2.0      # nominale capaciteit (Ah)
STROOM = 0.50         # ontlaadstroom (A): een kwart van de capaciteit per uur, 0,25 C
EINDSPANNING = 1.00   # hier stopt de test (V)
DT = 60               # een meting per minuut (s)


def celspanning(x):
    """Model van de spanning van een NiMH-cel; x = ontladen deel van de capaciteit (0 tot 1)."""
    return 1.28 - 0.10 * x + 0.10 * math.exp(-x / 0.03) - 0.25 * math.exp((x - 1) / 0.05)


lading = 0.0          # geleverde lading (Ah)
energie = 0.0         # geleverde energie (Wh)
t = 0                 # tijd (s)
while True:
    u = celspanning(lading / CAPACITEIT)          # 'meting' van de spanning
    if u < EINDSPANNING:
        break
    lading += STROOM * DT / 3600                  # coulombtellen: I * dt, in Ah
    energie += u * STROOM * DT / 3600             # energie: U * I * dt, in Wh
    t += DT

print(f"duur: {t / 3600:.2f} h")
print(f"geleverde lading: {lading:.3f} Ah")
print(f"geleverde energie: {energie:.3f} Wh")
print(f"gemiddelde spanning: {energie / lading:.3f} V")
