diff --git a/.gitignore b/.gitignore index e2e9708..53b63f4 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ thumbs.db storage/profiles config.py +.idea/* diff --git a/config.py.EXAMPLE b/config.py.EXAMPLE index 2dbf4c0..8c771bd 100644 --- a/config.py.EXAMPLE +++ b/config.py.EXAMPLE @@ -35,15 +35,22 @@ heater_invert = 0 # switches the polarity of the heater control ### Inputs gpio_door = 18 -### Thermocouple Adapter selection (MAX31855 or MAX6675) -max31855 = 1 +### Thermocouple Adapter selection: +# max31855 - bitbang SPI interface +# max31855spi - kernel SPI interface +# max6675 - bitbang SPI interface +max31855 = 0 max6675 = 0 +max31855spi = 1 -### Thermocouple I2C Connection +### Thermocouple Connection (using bitbang interfaces) gpio_sensor_cs = 27 gpio_sensor_clock = 22 gpio_sensor_data = 17 +### Thermocouple SPI Connection (using adafrut drivers + kernel SPI interface) +spi_sensor_chip_id = 0 + ######################################################################## # diff --git a/lib/max31855spi.py b/lib/max31855spi.py new file mode 100644 index 0000000..89182de --- /dev/null +++ b/lib/max31855spi.py @@ -0,0 +1,32 @@ +#!/usr/bin/python +from Adafruit_MAX31855 import MAX31855 + +class MAX31855SPI(object): + '''Python driver for [MAX38155 Cold-Junction Compensated Thermocouple-to-Digital Converter](http://www.maximintegrated.com/datasheet/index.mvp/id/7273) + Requires: + - adafruit's MAX31855 SPI-only device library + + ''' + def __init__(self, spi_dev): + self.max31855 = MAX31855.MAX31855(spi=spi_dev) + + def get(self): + '''Reads SPI bus and returns current value of thermocouple.''' + state = self.max31855.readState() + if state['openCircuit']: + raise MAX31855Error('Not Connected') + elif state['shortGND']: + raise MAX31855Error('Short to Ground') + elif state['shortVCC']: + raise MAX31855Error('Short to VCC') + elif state['fault']: + raise MAX31855Error('Unknown Error') + return self.max31855.readLinearizedTempC() + + +class MAX31855SPIError(Exception): + def __init__(self, value): + self.value = value + + def __str__(self): + return repr(self.value) diff --git a/lib/oven.py b/lib/oven.py index 74059cb..c8d7be4 100644 --- a/lib/oven.py +++ b/lib/oven.py @@ -10,15 +10,19 @@ import config log = logging.getLogger(__name__) try: - if (config.max31855 == config.max6675): - log.error("choose (only) one converter IC") - exit() + if config.max31855 + config.max6675 + config.max31855spi > 1: + log.error("choose (only) one converter IC") + exit() if config.max31855: - from max31855 import MAX31855, MAX31855Error - log.info("import MAX31855") + from max31855 import MAX31855, MAX31855Error + log.info("import MAX31855") + if config.max31855spi: + import Adafruit_GPIO.SPI as SPI + from max6675 import MAX31855SPI, MAX31855SPIError + log.info("import MAX31855SPI") if config.max6675: - from max6675 import MAX6675, MAX6675Error - log.info("import MAX6675") + from max6675 import MAX6675, MAX6675Error + log.info("import MAX6675") sensor_available = True except ImportError: log.warning("Could not initialize temperature sensor, using dummy values!") @@ -147,14 +151,14 @@ class Oven (threading.Thread): self.heat = 1.0 if gpio_available: if config.heater_invert: - GPIO.output(config.gpio_heat, GPIO.LOW) + GPIO.output(config.gpio_heat, GPIO.LOW) else: GPIO.output(config.gpio_heat, GPIO.HIGH) else: self.heat = 0.0 if gpio_available: if config.heater_invert: - GPIO.output(config.gpio_heat, GPIO.HIGH) + GPIO.output(config.gpio_heat, GPIO.HIGH) else: GPIO.output(config.gpio_heat, GPIO.LOW) @@ -211,19 +215,23 @@ class TempSensorReal(TempSensor): def __init__(self, time_step): TempSensor.__init__(self, time_step) if config.max6675: - log.info("init MAX6675") - self.thermocouple = MAX6675(config.gpio_sensor_cs, + log.info("init MAX6675") + self.thermocouple = MAX6675(config.gpio_sensor_cs, config.gpio_sensor_clock, config.gpio_sensor_data, config.temp_scale) if config.max31855: - log.info("init MAX31855") - self.thermocouple = MAX31855(config.gpio_sensor_cs, + log.info("init MAX31855") + self.thermocouple = MAX31855(config.gpio_sensor_cs, config.gpio_sensor_clock, config.gpio_sensor_data, config.temp_scale) + if config.max31855spi: + log.info("init MAX31855-spi") + self.thermocouple = MAX31855SPI(spi_dev=SPI.SpiDev(port=0, device=config.spi_sensor_chip_id)) + def run(self): while True: self.temperature = self.thermocouple.get() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..215aad3 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +Adafruit-MAX31855>=1.6.1 \ No newline at end of file