2013-11-23 21:25:20 +00:00
|
|
|
import threading,time,random,datetime,logging
|
2013-11-23 22:50:59 +00:00
|
|
|
|
2013-11-23 21:25:20 +00:00
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
|
2013-11-23 23:36:10 +00:00
|
|
|
try:
|
|
|
|
from max31855 import MAX31855, MAX31855Error
|
|
|
|
sensor_dummy = False
|
|
|
|
except ImportError:
|
|
|
|
log.warning("Could not initialize temperature sensor, using dummy values!")
|
|
|
|
sensor_dummy = True
|
|
|
|
|
2013-11-23 21:25:20 +00:00
|
|
|
class Oven (threading.Thread):
|
2013-11-24 14:27:29 +00:00
|
|
|
STATE_IDLE = "IDLE"
|
2013-11-23 21:25:20 +00:00
|
|
|
STATE_RUNNING = "RUNNING"
|
|
|
|
STATE_ABORT = "ABORT"
|
|
|
|
STATE_ERROR = "ERROR"
|
2013-11-23 22:40:46 +00:00
|
|
|
|
2013-11-23 21:25:20 +00:00
|
|
|
def __init__(self):
|
|
|
|
threading.Thread.__init__(self)
|
2013-11-23 22:54:45 +00:00
|
|
|
self.daemon = True
|
2013-11-23 21:25:20 +00:00
|
|
|
self.profile = None
|
|
|
|
self.start_time = 0
|
2013-11-23 23:30:06 +00:00
|
|
|
self.runtime = 0
|
2013-11-24 14:27:29 +00:00
|
|
|
self.totaltime = 0
|
2013-11-23 21:25:20 +00:00
|
|
|
self.power = 0.0
|
|
|
|
self.state = Oven.STATE_IDLE
|
|
|
|
self.temp_sensor = TempSensor(self)
|
|
|
|
self.temp_sensor.start()
|
2013-11-24 14:20:38 +00:00
|
|
|
self.start()
|
2013-11-23 22:40:46 +00:00
|
|
|
|
2013-11-23 21:25:20 +00:00
|
|
|
def run_profile(self, profile):
|
|
|
|
self.profile = profile
|
2013-11-24 14:27:29 +00:00
|
|
|
self.totaltime = 300.0
|
2013-11-23 21:25:20 +00:00
|
|
|
self.state = Oven.STATE_RUNNING
|
|
|
|
self.start_time = datetime.datetime.now()
|
|
|
|
log.info("Starting")
|
2013-11-23 22:40:46 +00:00
|
|
|
|
2013-11-23 21:25:20 +00:00
|
|
|
def abort_run(self):
|
|
|
|
self.state = Oven.STATE_ABORT
|
2013-11-23 22:40:46 +00:00
|
|
|
|
2013-11-23 21:25:20 +00:00
|
|
|
def run(self):
|
|
|
|
while True:
|
|
|
|
if self.state == Oven.STATE_RUNNING:
|
2013-11-23 23:30:06 +00:00
|
|
|
self.runtime = (datetime.datetime.now() - self.start_time).total_seconds()
|
2013-11-24 14:27:29 +00:00
|
|
|
log.info("running at %.1f deg C, power %.2f (%.1fs/%.0f)"%(self.temp_sensor.temperature,self.power,self.runtime,self.totaltime))
|
2013-11-23 21:25:20 +00:00
|
|
|
if self.temp_sensor.temperature < 250:
|
|
|
|
self.power = 1.0
|
|
|
|
else:
|
|
|
|
self.power = 0.0
|
2013-11-24 14:27:29 +00:00
|
|
|
if self.runtime >= self.totaltime:
|
2013-11-23 23:30:06 +00:00
|
|
|
self.power = 0.0
|
|
|
|
self.state = Oven.STATE_IDLE
|
2013-11-23 21:25:20 +00:00
|
|
|
elif self.state == Oven.STATE_ABORT:
|
|
|
|
self.power = 0.0
|
|
|
|
self.state = Oven.STATE_IDLE
|
|
|
|
time.sleep(1)
|
2013-11-23 22:40:46 +00:00
|
|
|
|
|
|
|
|
2013-11-23 21:25:20 +00:00
|
|
|
def get_state(self):
|
2013-11-23 23:30:06 +00:00
|
|
|
|
2013-11-23 21:25:20 +00:00
|
|
|
state = {
|
2013-11-23 23:30:06 +00:00
|
|
|
'runtime': self.runtime,
|
2013-11-23 21:25:20 +00:00
|
|
|
'temperature': self.temp_sensor.temperature,
|
|
|
|
'state': self.state,
|
|
|
|
'power': self.power,
|
2013-11-24 14:27:29 +00:00
|
|
|
'totaltime': self.totaltime
|
2013-11-23 21:25:20 +00:00
|
|
|
}
|
|
|
|
return state
|
2013-11-23 22:40:46 +00:00
|
|
|
|
2013-11-23 21:25:20 +00:00
|
|
|
class TempSensor(threading.Thread):
|
2013-11-23 22:50:59 +00:00
|
|
|
|
2013-11-23 21:25:20 +00:00
|
|
|
def __init__(self,oven):
|
|
|
|
threading.Thread.__init__(self)
|
2013-11-23 22:54:45 +00:00
|
|
|
self.daemon = True
|
|
|
|
|
2013-11-23 21:25:20 +00:00
|
|
|
self.temperature = 0
|
|
|
|
self.oven = oven
|
2013-11-23 22:50:59 +00:00
|
|
|
|
2013-11-23 23:36:10 +00:00
|
|
|
if not sensor_dummy:
|
2013-11-23 22:50:59 +00:00
|
|
|
cs_pin = 27
|
|
|
|
clock_pin = 22
|
|
|
|
data_pin = 17
|
|
|
|
units = "c"
|
|
|
|
self.thermocouple = MAX31855(cs_pin, clock_pin, data_pin, units)
|
2013-11-23 22:40:46 +00:00
|
|
|
|
|
|
|
|
2013-11-23 21:25:20 +00:00
|
|
|
def run(self):
|
|
|
|
while True:
|
2013-11-23 23:36:10 +00:00
|
|
|
if not sensor_dummy:
|
2013-11-23 22:50:59 +00:00
|
|
|
self.temperature = self.thermocouple.get()
|
|
|
|
else:
|
|
|
|
time_delta = (20.0 - self.temperature)/40
|
|
|
|
power_delta = 8.0*self.oven.power
|
|
|
|
self.temperature += (time_delta+power_delta)
|
|
|
|
|
2013-11-23 21:25:20 +00:00
|
|
|
time.sleep(1)
|
2013-11-23 22:40:46 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
2013-11-23 21:25:20 +00:00
|
|
|
if __name__ == "__main__":
|
|
|
|
my_oven = Oven()
|
|
|
|
my_oven.run_profile("abc")
|
2013-11-23 22:40:46 +00:00
|
|
|
|