diff --git a/Control/brewpi/astirrer.py b/Control/brewpi/astirrer.py index 7fb6314..2e141d9 100644 --- a/Control/brewpi/astirrer.py +++ b/Control/brewpi/astirrer.py @@ -3,36 +3,58 @@ import abc class AStirrer(abc.ABC): - def __init__(self): - pass + def __init__(self, dt): + self.dt = dt + self.speed = 0 + self.cycleTime = 1 + self.dutyCycle = 1 + self.cycleCounter = 0 + self.isOn = 0 def log(self, s): print("{:.2f}: {}".format(time.time(), s)) - @abc.abstractmethod def process(self): - pass + isOn = self.isOn + self.cycleCounter += self.dt + if self.cycleCounter >= self.cycleTime: + self.cycleCounter -= self.cycleTime + isOn = 0 + + if self.cycleCounter >= (self.cycleTime * (1-self.dutyCycle)): + if not isOn: + isOn = 1 + + if self.isOn != isOn: + if isOn: + self.onSetSpeed(self.speed) + else: + self.onSetSpeed(0) + + self.isOn = isOn - @abc.abstractmethod def setSpeed(self, speed): - pass + self.speed = speed + if self.isOn: + self.onSetSpeed(speed) + self.log ("Stirrer: Set speed to {} %".format(speed)) - @abc.abstractmethod def setCycleTime(self, time): - pass + self.cycleTime = time + self.log ("Stirrer: Set cycle time to {} s".format(time)) - @abc.abstractmethod def setDutyCycle(self, dutyCycle): - pass + self.dutyCycle = dutyCycle + self.log ("Stirrer: Set duty cycle to {} %".format(100*dutyCycle)) @abc.abstractmethod def getSpeed(self): return None @abc.abstractmethod - def start(self): + def activate(self): pass @abc.abstractmethod - def stop(self): + def deactivate(self): pass \ No newline at end of file diff --git a/Control/brewpi/pololu1376.py b/Control/brewpi/pololu1376.py index 7ed6b11..2e3338f 100644 --- a/Control/brewpi/pololu1376.py +++ b/Control/brewpi/pololu1376.py @@ -3,13 +3,8 @@ import serial import time class Pololu1376(AStirrer): - def __init__(self, params, com_port='/dev/ttyUSB0', com_baud=9600): - self.params = params - self.speed = 0 - self.cycleTime = 1 - self.dutyCycle = 1 - self.cycleCounter = 0 - self.isOn = 0 + def __init__(self, dt, com_port='/dev/ttyUSB0', com_baud=9600): + super(Pololu1376, self).__init__(dt) self.isMasterOn = 0 self.ser = serial.Serial(com_port, com_baud) @@ -31,68 +26,49 @@ class Pololu1376(AStirrer): s = self.ser.readline().decode("utf-8").replace("\n", '').replace("\r", '') return s - def process(self): - dt = self.params["dt"] - - self.cycleCounter -= dt - if self.cycleCounter <= 0: - self.cycleCounter = self.cycleTime - - if self.cycleCounter <= (self.cycleTime * self.dutyCycle): - if not self.isOn: - self.__setMotorSpeed(self.speed) - self.log ("Stirrer: On") - self.isOn = 1 - else: - if self.isOn: - self.__setMotorSpeed(0) - self.log ("Stirrer: Off") - self.isOn = 0 - - def setSpeed(self, speed): - self.log ("Stirrer: Set speed to {} %".format(speed)) - self.speed = speed - if self.isOn: - self.__setMotorSpeed(speed) - - def setCycleTime(self, time): - self.log ("Stirrer: Set cycle time to {} s".format(time)) - self.cycleTime = time - - def setDutyCycle(self, dutyCycle): - self.log ("Stirrer: Set duty cycle to {} %".format(100*dutyCycle)) - self.dutyCycle = dutyCycle - def getSpeed(self): if self.isOn and self.isMasterOn: return self.speed return 0 - def start(self): + def activate(self): self.isMasterOn = 1 - self.log("Stirrer: switched On") self.ser_send("go") + self.log("Stirrer: switched On") - def stop(self): + def deactivate(self): self.isMasterOn = 0 - self.log("Stirrer: switched Off") self.ser_send("x") + self.log("Stirrer: switched Off") - def __setMotorSpeed(self, speed): + def onSetSpeed(self, speed): self.ser_send("F" + str(speed) + "%") + if __name__ == '__main__': s = Pololu1376(None, "/dev/ttyACM0", "115200") - s.start() - s.setSpeed(1000) - time.sleep(2) - s.setSpeed(2000) - time.sleep(2) - s.setSpeed(3000) - time.sleep(2) - s.setSpeed(2000) - time.sleep(2) - s.setSpeed(1000) - time.sleep(2) - s.stop() + s.activate() + print ("Set some speeds") + s.setSpeed(50) + time.sleep(2) + s.setSpeed(100) + time.sleep(2) + s.setSpeed(50) + time.sleep(2) + + print ("Pulsed operation, duty cycle = 50%") + s.setDutyCycle(0.5) + s.setCycleTime(10) + for i in range(1,30): + s.process() + time.sleep(1) + + print ("Pulsed operation, duty cycle = 20%") + s.setDutyCycle(0.2) + s.setCycleTime(10) + for i in range(1,30): + s.process() + time.sleep(1) + + s.deactivate() diff --git a/Control/brewpi/stirrer.py b/Control/brewpi/stirrer.py index 9a8b0cf..ae4f6f8 100644 --- a/Control/brewpi/stirrer.py +++ b/Control/brewpi/stirrer.py @@ -1,52 +1,55 @@ from astirrer import AStirrer +import time class Stirrer(AStirrer): - def __init__(self, params): - self.params = params - self.speed = 0 - self.cycleTime = 1 - self.dutyCycle = 1 - self.cycleCounter = 0 - self.isOn = 0 + def __init__(self, dt): + super(Stirrer, self).__init__(dt) self.isMasterOn = 0 - def process(self): - dt = self.params["dt"] + def __del__(self): + self.deactivate() - self.cycleCounter -= dt - if self.cycleCounter <= 0: - self.cycleCounter = self.cycleTime + def activate(self): + self.isMasterOn = 1 + self.log("Stirrer: switched On") - if self.cycleCounter <= (self.cycleTime * self.dutyCycle): - if not self.isOn: - self.log ("Stirrer: On") - self.isOn = 1 - else: - if self.isOn: - self.log ("Stirrer: Off") - self.isOn = 0 - - def setSpeed(self, speed): - self.log ("Stirrer: Set speed to {} %".format(speed)) - self.speed = speed - - def setCycleTime(self, time): - self.log ("Stirrer: Set cycle time to {} s".format(time)) - self.cycleTime = time - - def setDutyCycle(self, dutyCycle): - self.log ("Stirrer: Set duty cycle to {} %".format(100*dutyCycle)) - self.dutyCycle = dutyCycle + def deactivate(self): + self.isMasterOn = 0 + self.log("Stirrer: switched Off") def getSpeed(self): if self.isOn and self.isMasterOn: return self.speed return 0 - def start(self): - self.isMasterOn = 1 - self.log("Stirrer: switched On") + def onSetSpeed(self, speed): + self.log("Stirrer: Set speed to {} %".format(speed)) - def stop(self): - self.isMasterOn = 0 - self.log("Stirrer: switched Off") + +if __name__ == '__main__': + s = Stirrer(1.0) + s.activate() + + print ("Set some speeds") + s.setSpeed(50) + time.sleep(2) + s.setSpeed(100) + time.sleep(2) + s.setSpeed(50) + time.sleep(2) + + print ("Pulsed operation, duty cycle = 50%") + s.setDutyCycle(0.5) + s.setCycleTime(10) + for i in range(1,30): + s.process() + time.sleep(1) + + print ("Pulsed operation, duty cycle = 20%") + s.setDutyCycle(0.2) + s.setCycleTime(10) + for i in range(1,30): + s.process() + time.sleep(1) + + s.deactivate()