From ea562735e2dabc5c22d84a78caff9f9e994819c6 Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Sun, 31 Mar 2019 06:20:52 +0000 Subject: [PATCH] - make class of it git-svn-id: http://moon:8086/svn/projects/HendiControl@189 fda53097-d464-4ada-af97-ba876c37ca34 --- Control/brewpi/max31865.py | 142 ++++++++++++++++++++----------------- 1 file changed, 77 insertions(+), 65 deletions(-) diff --git a/Control/brewpi/max31865.py b/Control/brewpi/max31865.py index b68d011..4f4554e 100755 --- a/Control/brewpi/max31865.py +++ b/Control/brewpi/max31865.py @@ -1,89 +1,101 @@ #!/usr/bin/python import spidev -import time -import os - -# Open SPI bus -spi = spidev.SpiDev() -spi.open(0,0) -spi.max_speed_hz=100000 -spi.mode = 0b01 -def read_reg(addr): - reg = spi.xfer([addr, 0xFF]); - return reg[1] - -def write_reg(addr, data): - spi.xfer([addr+0x80, data]); +class Max31865(): + def __init__(self): + # Open SPI bus + self.spi = spidev.SpiDev() + self.spi.open(0, 0) + self.spi.max_speed_hz = 100000 + self.spi.mode = 0b01 + self.write_reg(0x00, 0xA3) -def read_digits(): - msb = read_reg(0x01) - lsb = read_reg(0x02) - digits = float(256*msb + lsb)/2 + def read_reg(self, addr): + reg = self.spi.xfer([addr, 0xFF]) - return digits + return reg[1] -def calc_R(Rref, digits): - k = digits / 8192 / 4 - R = k*Rref + def write_reg(self, addr, data): + self.spi.xfer([addr+0x80, data]) - return R + def read_digits(self): + msb = self.read_reg(0x01) + lsb = self.read_reg(0x02) + digits = float(256*msb + lsb)/2 -def vanDusenLut (R0, Tmin, Tmax, dT): - a = +3.90830e-03; - b = -5.77500e-07; - c = -4.18301e-12; + return digits - Rv = [] - Tv = [] - T = Tmin - while T <= Tmax: - R = R0*(1 + a*T + b*T**2) + def getTemperature(self): + digits = self.read_digits() + R = max31865.calc_R(430, digits) + T = max31865.vanDusen_temp(R) + print("R={:.3f} Ohm, T={:.2f} degC".format(R, T)) + return T - if T < 0.0: - R += R0*c*(T - 100)*T**3; - - Rv.append(R) - Tv.append(T) - T += dT + @staticmethod + def calc_R(Rref, digits): + k = digits / 8192 / 4 + R = k*Rref - return Rv, Tv + return R -def vanDusen_temp(Rmeas): - RLut, TLut = vanDusenLut(100, -150, +500, 1.0) + @staticmethod + def vanDusenLut (R0, Tmin, Tmax, dT): + a = +3.90830e-03 + b = -5.77500e-07 + c = -4.18301e-12 - # Find candidate - i = 0 - for R in RLut: - if R > Rmeas: - break - i += 1 + Rv = [] + Tv = [] + T = Tmin + while T <= Tmax: + R = R0*(1 + a*T + b*T**2) - # Linear interpolation - R0 = RLut[i-1] - R1 = RLut[i] - T0 = TLut[i-1] - T1 = TLut[i] + if T < 0.0: + R += R0*c*(T - 100)*T**3 - dR = R1 - R0 - dT = T1 - T0 + Rv.append(R) + Tv.append(T) + T += dT - k = (Rmeas-R0)/dR - T = T0 + dT*k + return Rv, Tv + + @staticmethod + def vanDusen_temp(Rmeas): + RLut, TLut = Max31865.vanDusenLut(100, -150, +500, 1.0) + + # Find candidate + i = 0 + for R in RLut: + if R > Rmeas: + break + i += 1 + + # Linear interpolation + R0 = RLut[i-1] + R1 = RLut[i] + T0 = TLut[i-1] + T1 = TLut[i] + + dR = R1 - R0 + dT = T1 - T0 + + k = (Rmeas-R0)/dR + T = T0 + dT*k + + return T - return T # Main -write_reg(0x00, 0xA3) -digits = read_digits() -R = calc_R(430, digits) -T = vanDusen_temp(R) -print("R={:.3f} Ohm, T={:.2f} degC".format(R, T)) +if __name__ == '__main__': -for i in range (0, 8): - print("Reg[0x{}]: 0x{:02X}".format(i, read_reg(i))) + max31865 = Max31865() + for i in range (0, 8): + print("Reg[0x{}]: 0x{:02X}".format(i, max31865.read_reg(i))) -print("End of program") + max31865.getTemperature() + + print("End of program")