# kalibratie.py - een NTC ijken: B en R25 uit metingen met een referentiethermometer
import math
import numpy as np

R_VAST = 10000.0                                   # vaste weerstand (ohm, nominaal)
T_ref = [0.1, 10.4, 20.2, 30.0, 40.3, 50.1]         # referentie (graden C)
N = [231, 337, 448, 558, 662, 745]                     # ADC-waarden van de NTC-deler

R = [R_VAST * (1024 - n) / n for n in N]           # spanningsdeler omgekeerd
x = [1 / (t + 273.15) for t in T_ref]              # 1/T in 1/K
y = [math.log(r) for r in R]                       # ln R

B, b = np.polyfit(x, y, 1)                         # ln R = B * (1/T) + b is een rechte
R25 = math.exp(b + B / 298.15)
print(f"geijkt: B = {B:.0f} K, R25 = {R25:.0f} ohm")


def temperatuur(r, r25, b_waarde):
    return 1 / (1 / 298.15 + math.log(r / r25) / b_waarde) - 273.15


print(" T_ref    N  R (ohm)  T datasheet  T geijkt")
for t, n, r in zip(T_ref, N, R):
    print(f"{t:6.1f} {n:4d} {r:8.0f} {temperatuur(r, 10000, 3950):11.2f} {temperatuur(r, R25, B):9.2f}")
