#!/usr/bin/python3 import time from components import ATemperatureSensor import spidev class TempSensor_max31865(ATemperatureSensor): def name(self): return "Max31865" def __init__(self, temp_offset=0): ATemperatureSensor.__init__(self) # Open SPI bus self.spi = spidev.SpiDev() self.spi.open(0, 0) self.spi.max_speed_hz = 50000 self.spi.mode = 0b01 self.temp_offset = temp_offset self.write_reg(0x00, 0xA3) def read_reg(self, addr): reg = self.spi.xfer([addr, 0xFF]) return reg[1] def write_reg(self, addr, data): self.spi.xfer([addr+0x80, data]) def read_digits(self): for i in range(0, 10): reg = self.read_reg(0x00) if (0x20 & reg) == 0: break time.sleep(0.01) msb = self.read_reg(0x01) lsb = self.read_reg(0x02) if lsb & 0x01 == 0x00: digits = float(256*msb + lsb)/2 self.write_reg(0x00, 0xA3) return digits def temperature(self): return self.__tempRaw() + self.temp_offset def __tempRaw(self): T = 0 try: digits = self.read_digits() R = TempSensor_max31865.calc_R(430, digits) T = TempSensor_max31865.vanDusen_temp(R) # print("Digits={}, R={:.3f} Ohm, T={:.2f} degC".format(digits,$ except: pass return T @staticmethod def calc_R(Rref, digits): k = digits / 32768 R = k*Rref return R @staticmethod def vanDusenLut (R0, Tmin, Tmax, dT): a = +3.90830e-03 b = -5.77500e-07 c = -4.18301e-12 Rv = [] Tv = [] T = Tmin while T <= Tmax: R = R0*(1 + a*T + b*T**2) if T < 0.0: R += R0*c*(T - 100)*T**3 Rv.append(R) Tv.append(T) T += dT return Rv, Tv @staticmethod def vanDusen_temp(Rmeas): RLut, TLut = TempSensor_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 def process(self): temp = self.temperature() self.temp = temp # Main if __name__ == '__main__': TempSensor_max31865 = TempSensor_max31865() for i in range (0, 8): print("Reg[0x{}]: 0x{:02X}".format(i, TempSensor_max31865.read_reg(i))) print(TempSensor_max31865.temperature()) time.sleep(0.1) print("End of program")