# kalibratie.py - kalibratierechte van een temperatuursensor (kleinste kwadraten)
T_ref = [0.4, 10.2, 18.7, 24.9, 32.6, 41.3, 49.8]   # referentiethermometer (°C)
ruw = [106, 127, 143, 158, 174, 192, 209]            # ruwe waarde van de sensor (ADC)

n = len(T_ref)
x_gem = sum(T_ref) / n
y_gem = sum(ruw) / n
teller = sum((x - x_gem) * (y - y_gem) for x, y in zip(T_ref, ruw))
noemer = sum((x - x_gem) ** 2 for x in T_ref)
a = teller / noemer          # gevoeligheid: tellen per °C
b = y_gem - a * x_gem        # ruwe waarde bij 0 °C

# R²: welk deel van de spreiding van de ruwe waarden verklaart de rechte?
ss_res = sum((y - (a * x + b)) ** 2 for x, y in zip(T_ref, ruw))
ss_tot = sum((y - y_gem) ** 2 for y in ruw)
r2 = 1 - ss_res / ss_tot
print(f"a = {a:.4f} tellen/°C   b = {b:.2f} tellen   R² = {r2:.5f}")


def temperatuur(r):
    """Zet een ruwe sensorwaarde om naar °C met de omgekeerde kalibratierechte."""
    return (r - b) / a


for x, y in zip(T_ref, ruw):
    t = temperatuur(y)
    print(f"ref {x:5.1f} °C   ruw {y:4d}   gekalibreerd {t:5.1f} °C   verschil {t - x:+.2f} °C")
