diff --git a/Control/brewpi/hendiCtrl.py b/Control/brewpi/hendiCtrl.py index 86ef01f..4495ca8 100644 --- a/Control/brewpi/hendiCtrl.py +++ b/Control/brewpi/hendiCtrl.py @@ -3,6 +3,7 @@ import time import serial import sys +import numpy as np class HendiCtrl(): def __init__(self, port, baudrate): @@ -24,21 +25,16 @@ class HendiCtrl(): "pwr_digits_min" : 4092, "pwr_digits_max" : 670 } - self.curve = { - 'powers' : [ 500, 600, 700, 800, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100, 2200, 2300, 2400, 2500, 2600, 2700, 2800, 2900, 3000, 3100, 3200, 3300, 3400, 3500], - 'digits' : [4092, 3840, 3700, 3440, 3300, 3060, 3000, 2930, 2860, 2780, 2640, 2510, 2430, 2360, 2190, 2130, 2030, 1980, 1880, 1730, 1630, 1560, 1480, 1400, 1240, 1150, 1150, 1080, 920, 740, 670], - 'poly' : [-7.6500e-14, 8.2218e-10, -3.4125e-06, 6.8421e-03, -7.6098e+00, 6.5858e+03] - } + powers = [ 500, 600, 700, 800, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100, 2200, 2300, 2400, 2500, 2600, 2700, 2800, 2900, 3000, 3100, 3200, 3300,3400, 3500] + digits = [4092, 3840, 3700, 3440, 3300, 3060, 3000, 2930, 2860, 2780, 2640, 2510, 2430, 2360, 2190, 2130, 2030, 1980, 1880, 1730, 1630, 1560, 1480, 1400, 1240, 1150, 1150, 1080, 920, 740, 670] + self.poly_w2d = np.polyfit(powers, digits, 5) + self.poly_d2w = np.polyfit(digits, powers, 5) - def toDigits(self, pwr): - poly = self.curve['poly'] + def toDigits(self, power_watts): + return np.polyval(self.poly_w2d, float(power_watts)) - N = len(poly) - - for n in range(0, N): - digits = poly[N-1-n] * pwr**n - - return digits + def toWatts(self, power_digits): + return np.polyval(self.poly_d2w, float(power_digits)) def reset(self): self.ser.dtr = True @@ -155,39 +151,16 @@ class HendiCtrl(): return self.cmd("S?") def setPowerWatts(self, power_watts): - pwr_watts_min = self.caps['pwr_watts_min'] - pwr_watts_max = self.caps['pwr_watts_max'] pwr_digits_min = self.caps['pwr_digits_min'] pwr_digits_max = self.caps['pwr_digits_max'] - pwr_watts_step = self.caps['pwr_watts_step'] - - pwr_watts_range = pwr_watts_max - pwr_watts_min - pwr_digits_range = pwr_digits_max - pwr_digits_min - digits_per_watt = pwr_digits_range/pwr_watts_range - pwr_digits = pwr_digits_min + digits_per_watt * (power_watts - pwr_watts_min) + 0.5 - max_digits = max(pwr_digits_max, pwr_digits_min) min_digits = min(pwr_digits_max, pwr_digits_min) + pwr_digits = int(self.toDigits(power_watts)) pwr_digits = int(min(max_digits, max(min_digits, pwr_digits))) - self.setPowerDigits(self.toDigits(power_watts)) + return self.setPowerDigits(pwr_digits) def getPowerWatts(self): - pwr_watts_min = self.caps['pwr_watts_min'] - pwr_watts_max = self.caps['pwr_watts_max'] - pwr_digits_min = self.caps['pwr_digits_min'] - pwr_digits_max = self.caps['pwr_digits_max'] - - pwr_watts_range = pwr_watts_max - pwr_watts_min - pwr_digits_range = pwr_digits_max - pwr_digits_min - digits_per_watt = pwr_digits_range/pwr_watts_range - - max_digits = max(pwr_digits_max, pwr_digits_min) - min_digits = min(pwr_digits_max, pwr_digits_min) - pwr_digits = int(self.getPowerDigits()) - - pwr_watts = (pwr_digits - pwr_digits_min)/digits_per_watt + pwr_watts_min - - return int(pwr_watts) + return int(self.toWatts(self.getPowerDigits()) + 0.5) if __name__ == '__main__': @@ -205,6 +178,7 @@ if __name__ == '__main__': try: hendi.remoteEnable(True) hendi.setSwitch(1) + time.sleep(2.0) for pwr in range(500, 3500, 100): hendi.setPowerWatts(pwr) time.sleep(0.1)