kopia lustrzana https://github.com/jbruce12000/kiln-controller
				
				
				
			
		
			
				
	
	
		
			227 wiersze
		
	
	
		
			9.1 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			227 wiersze
		
	
	
		
			9.1 KiB
		
	
	
	
		
			Python
		
	
	
| import logging
 | |
| import os
 | |
| from digitalio import DigitalInOut
 | |
| import busio
 | |
| 
 | |
| try:
 | |
|     import board
 | |
| except NotImplementedError:
 | |
|     print("not running on blinka recognized board, probably a simulation")
 | |
| 
 | |
| # FIX how to choose a thermocouple control board
 | |
| # FIX how to choose a microcontrol board (like rpi)
 | |
| 
 | |
| ########################################################################
 | |
| #
 | |
| #   General options
 | |
| 
 | |
| ### Logging
 | |
| log_level = logging.INFO
 | |
| log_format = '%(asctime)s %(levelname)s %(name)s: %(message)s'
 | |
| 
 | |
| ### Server
 | |
| listening_port = 8081
 | |
| 
 | |
| ########################################################################
 | |
| # Cost Information
 | |
| #
 | |
| # This is used to calculate a cost estimate before a run. It's also used
 | |
| # to produce the actual cost during a run. My kiln has three
 | |
| # elements that when my switches are set to high, consume 9460 watts.
 | |
| kwh_rate        = 0.1319  # cost per kilowatt hour per currency_type to calculate cost to run job
 | |
| kw_elements     = 9.460 # if the kiln elements are on, the wattage in kilowatts
 | |
| currency_type   = "$"   # Currency Symbol to show when calculating cost to run job
 | |
| 
 | |
| ########################################################################
 | |
| #
 | |
| # Hardware Setup (uses BCM Pin Numbering)
 | |
| #
 | |
| # kiln-controller.py uses SPI interface from the blinka library to read
 | |
| # temperature data from the adafruit-31855 or adafruit-31856.
 | |
| # Blinka supports many different boards. I've only tested raspberry pi.
 | |
| #
 | |
| # SPI uses 3 or 4 pins. On the raspberry pi, you MUST use predefined
 | |
| # pins. In the case of the adafruit-31855, only 3 pins are used:
 | |
| #
 | |
| #    SPI0_SCLK = BCM pin 11 = CLK on the adafruit-31855
 | |
| #    SPI0_MOSI = BCM pin 10 = not connected
 | |
| #    SPI0_MISO = BCM pin 9  = D0 on the adafruit-31855
 | |
| #   
 | |
| # plus a GPIO output to connect to CS. You can use any GPIO pin you want.
 | |
| # I chose gpio pin 5:
 | |
| #
 | |
| #    GPIO5    = BCM pin 5   = CS on the adafruit-31855
 | |
| #
 | |
| # To control the kiln, one gpio pin is used as an output. Pick any 
 | |
| # you like. I chose gpio pin 23. This output is used to control a
 | |
| # zero-cross solid-state-relay.
 | |
| 
 | |
| spi_sclk  = board.D11 #spi clock
 | |
| spi_mosi  = board.D10 #spi Microcomputer Out Serial In (not connected) 
 | |
| spi_miso  = board.D9  #spi Microcomputer In Serial Out
 | |
| spi_cs    = board.D5  #spi Chip Select
 | |
| gpio_heat = board.D23 #output that controls relay
 | |
| 
 | |
| ### Thermocouple Adapter selection:
 | |
| #   max31855 - bitbang SPI interface
 | |
| #   max31856 - bitbang SPI interface. must specify thermocouple_type.
 | |
| max31855 = 1
 | |
| max31856 = 0
 | |
| # uncomment this if using MAX-31856
 | |
| #thermocouple_type = ThermocoupleType.S
 | |
| 
 | |
| # here are the possible max-31856 thermocouple types
 | |
| #   ThermocoupleType.B
 | |
| #   ThermocoupleType.E
 | |
| #   ThermocoupleType.J
 | |
| #   ThermocoupleType.K
 | |
| #   ThermocoupleType.N
 | |
| #   ThermocoupleType.R
 | |
| #   ThermocoupleType.S
 | |
| #   ThermocoupleType.T
 | |
| 
 | |
| ########################################################################
 | |
| #
 | |
| # duty cycle of the entire system in seconds
 | |
| # 
 | |
| # Every N seconds a decision is made about switching the relay[s] 
 | |
| # on & off and for how long. The thermocouple is read 
 | |
| # temperature_average_samples times during and the average value is used.
 | |
| sensor_time_wait = 2
 | |
| 
 | |
| 
 | |
| ########################################################################
 | |
| #
 | |
| #   PID parameters
 | |
| #
 | |
| # These parameters control kiln temperature change. These settings work
 | |
| # well with the simulated oven. You must tune them to work well with 
 | |
| # your specific kiln. Note that the integral pid_ki is
 | |
| # inverted so that a smaller number means more integral action.
 | |
| #pid_kp = 25   # Proportional 25,200,200
 | |
| #pid_ki = 10   # Integral
 | |
| #pid_kd = 200  # Derivative
 | |
| pid_kp = 14.22801211254364
 | |
| pid_ki = 4.747842807629315
 | |
| pid_kd = 240.283966775251
 | |
| 
 | |
| ########################################################################
 | |
| #
 | |
| # Initial heating and Integral Windup
 | |
| #
 | |
| # this setting is deprecated and is no longer used. this happens by
 | |
| # default and is the expected behavior.
 | |
| stop_integral_windup = True
 | |
| 
 | |
| ########################################################################
 | |
| #
 | |
| #   Simulation parameters
 | |
| simulate = True
 | |
| sim_t_env      = 60.0   # deg C
 | |
| sim_c_heat     = 500.0  # J/K  heat capacity of heat element
 | |
| sim_c_oven     = 5000.0 # J/K  heat capacity of oven
 | |
| sim_p_heat     = 5450.0 # W    heating power of oven
 | |
| sim_R_o_nocool = 0.5   # K/W  thermal resistance oven -> environment
 | |
| sim_R_o_cool   = 0.05   # K/W  " with cooling
 | |
| sim_R_ho_noair = 0.1    # K/W  thermal resistance heat element -> oven
 | |
| sim_R_ho_air   = 0.05   # K/W  " with internal air circulation
 | |
| 
 | |
| 
 | |
| ########################################################################
 | |
| #
 | |
| #   Time and Temperature parameters
 | |
| #
 | |
| # If you change the temp_scale, all settings in this file are assumed to
 | |
| # be in that scale.
 | |
| temp_scale          = "f" # c = Celsius | f = Fahrenheit - Unit to display
 | |
| time_scale_slope    = "h" # s = Seconds | m = Minutes | h = Hours - Slope displayed in temp_scale per time_scale_slope
 | |
| time_scale_profile  = "m" # s = Seconds | m = Minutes | h = Hours - Enter and view target time in time_scale_profile
 | |
| 
 | |
| # emergency shutoff the profile if this temp is reached or exceeded.
 | |
| # This just shuts off the profile. If your SSR is working, your kiln will
 | |
| # naturally cool off. If your SSR has failed/shorted/closed circuit, this
 | |
| # means your kiln receives full power until your house burns down.
 | |
| # this should not replace you watching your kiln or use of a kiln-sitter
 | |
| emergency_shutoff_temp = 2264 #cone 7
 | |
| 
 | |
| # If the current temperature is outside the pid control window,
 | |
| # delay the schedule until it does back inside. This allows for heating
 | |
| # and cooling as fast as possible and not continuing until temp is reached.
 | |
| kiln_must_catch_up = True
 | |
| 
 | |
| # This setting is required. 
 | |
| # This setting defines the window within which PID control occurs.
 | |
| # Outside this window (N degrees below or above the current target)
 | |
| # the elements are either 100% on because the kiln is too cold
 | |
| # or 100% off because the kiln is too hot. No integral builds up
 | |
| # outside the window. The bigger you make the window, the more
 | |
| # integral you will accumulate. This should be a positive integer.
 | |
| pid_control_window = 5 #degrees 
 | |
| 
 | |
| # thermocouple offset
 | |
| # If you put your thermocouple in ice water and it reads 36F, you can
 | |
| # set set this offset to -4 to compensate.  This probably means you have a
 | |
| # cheap thermocouple.  Invest in a better thermocouple.
 | |
| thermocouple_offset=0
 | |
| 
 | |
| # number of samples of temperature to average over each duty cycle.
 | |
| # The larger the number, the more load on the board. K type 
 | |
| # thermocouples have a precision of about 1/2 degree C. This 
 | |
| # averaging smooths out the stair step jumps of this imprecision.
 | |
| temperature_average_samples = 40 
 | |
| 
 | |
| # Thermocouple AC frequency filtering - set to True if in a 50Hz locale, else leave at False for 60Hz locale
 | |
| ac_freq_50hz = False
 | |
| 
 | |
| ########################################################################
 | |
| # Emergencies - or maybe not
 | |
| ########################################################################
 | |
| # There are all kinds of emergencies that can happen including:
 | |
| # - temperature is too high (emergency_shutoff_temp exceeded)
 | |
| # - lost connection to thermocouple
 | |
| # - unknown error with thermocouple
 | |
| # - too many errors in a short period from thermocouple
 | |
| # but in some cases, you might want to ignore a specific error, log it,
 | |
| # and continue running your profile instead of having the process die.
 | |
| #
 | |
| # You should only set these to True if you experience a problem
 | |
| # and WANT to ignore it to complete a firing.
 | |
| ignore_temp_too_high = False
 | |
| ignore_tc_lost_connection = False
 | |
| ignore_tc_cold_junction_range_error = False
 | |
| ignore_tc_range_error = False
 | |
| ignore_tc_cold_junction_temp_high = False
 | |
| ignore_tc_cold_junction_temp_low = False
 | |
| ignore_tc_temp_high = False
 | |
| ignore_tc_temp_low = False
 | |
| ignore_tc_voltage_error = False
 | |
| ignore_tc_short_errors = False 
 | |
| ignore_tc_unknown_error = False
 | |
| 
 | |
| # This overrides all possible thermocouple errors and prevents the 
 | |
| # process from exiting.
 | |
| ignore_tc_too_many_errors = False
 | |
| 
 | |
| ########################################################################
 | |
| # automatic restarts - if you have a power brown-out and the raspberry pi
 | |
| # reboots, this restarts your kiln where it left off in the firing profile.
 | |
| # This only happens if power comes back before automatic_restart_window
 | |
| # is exceeded (in minutes). The kiln-controller.py process must start
 | |
| # automatically on boot-up for this to work.
 | |
| # DO NOT put automatic_restart_state_file anywhere in /tmp. It could be
 | |
| # cleaned up (deleted) by the OS on boot.
 | |
| # The state file is written to disk every sensor_time_wait seconds (2s by default)
 | |
| # and is written in the same directory as config.py.
 | |
| automatic_restarts = True
 | |
| automatic_restart_window = 15 # max minutes since power outage
 | |
| automatic_restart_state_file = os.path.abspath(os.path.join(os.path.dirname( __file__ ),'state.json'))
 | |
| 
 | |
| ########################################################################
 | |
| # load kiln profiles from this directory
 | |
| # created a repo where anyone can contribute profiles. The objective is
 | |
| # to load profiles from this repository by default.
 | |
| # See https://github.com/jbruce12000/kiln-profiles
 | |
| kiln_profiles_directory = os.path.abspath(os.path.join(os.path.dirname( __file__ ),"storage", "profiles")) 
 | |
| #kiln_profiles_directory = os.path.abspath(os.path.join(os.path.dirname( __file__ ),'..','kiln-profiles','pottery')) 
 | |
| 
 |