Here is the temperature controller. The furnace plugs into a socket which is turned on and off by a high current/voltage relay. The relay is driven by a TTL level signal from an Arduino processor. The Arduino makes the decision to turn on/off the furnace based on the readings it receives from a thermocouple.
The thermocouple is enclosed in protective ceramic material and slides into the oven chamber from the top.
The schematic at right shows the connections which are made in the temperature controller box.
A Fotek solid state relay SSR40 - DA (datasheet) allows very high current (up to 40A) which the furnace might draw (I have to admit that I never measured the maximum furnace load!). The thermocouple is connected to the Arduino through an AD595 chip which outputs 10mV per degree celcius based on a K type thermocouple. The K thermocouple is usable at temperatures up to 1250oC, which made it ideal for this furnace.
The AD595 chip could be run directly off the 9V power supply which runs the Arduino, but this would limit the range of temperatures it would return. According to the data sheet for the chip, a supply voltage of at least +15V will allow the chip to read the full range of temperatures from a K-type thermocouple. I bought an 18V supply. In retrospect, a 15V supply would probably have been better because then the Arduino and the AD595 could have been powered by the same supply (the Arduino input should be between 6-16V).
The picture above shows a PCB board setup for the AD595 chip. The schematic is shown at right. These were designed using Eagle software. The PCB files can be downloaded by clicking here. A power LED gives status, and an error LED goes off if something is wrong with the chip or thermocouple. The thermocouple leads are connected to pins 1 and 14 (the thermocouple is polarized with yellow = positive and red = negative). The signal comes from pins 8 and 9. I used two ground holes allowing me to have a common ground between the Arduino and the AD595 circuits.
When it first came to testing the temperature controller, I found that it worked fine for low temperature applications, but failed for high temperature application. The picture at left shows that the controller did a nice job of controlling a hotplate plugged into the controller. A LabPro with a stainless steel temperature probe was used to monitor the hotplate's actual temperature. Note the discrepancy between the thermocouple (which think the hotplate is at ~125oC) and the LabPro (which thinks the hotplate is at ~113oC). The controller clearly kept the hotplate at its setpoint. But when i tried to run the furnace at a setpoint of 700oC, the furnace quickly ramped up to its maximum temperature and stayed there.
After about a year hiatus from this project, I thought to measure the output from the AD595 chip at various temperatures using a multimeter, and comparing this to the temperature the Arduino was reading. I quickly realized that the Arduino thought anything above 500oC was 500oC... which explains why any setpoint above 500oC failed. This makes sense electrically... the output from the AD595 is running into an analog input on the Arduino. The Arduino is a +5V device, so any voltage above this value will be clipped to 5V. Any temperature above 500oC will output a voltage above five volts if the AD595 is used.
To fix this problem, I added a simple voltage divider. The maximum voltage from the AD595 will be 12.5V if the thermocouple measures its maximum temperature of 1250oC (remember the AD595 outputs 10mV per oC). The voltage divider should scale 12.5V down to 5V so that the Arduino won't clip anymore. A 40% reduction is required, so I used a voltage divider with 220 Ohm and 330 Ohm resistors, with 60% of the voltage (330/(220+330)) dissipated across the 330Ohm resistor.
The picture at left shows the completed AD595 chip circuit as well as the voltage divider. The thermocouple is attached a the bottom of the picture.
Various other pictures of the completed temperature controller are shown below. I ended up using a fan and remnants of a heat sink from a computer to cool the relay (which otherwise got hot enough to crack the acrylic box). I mounted the heat sink on the back of the relay using screws and some conductive glue.
The box is fairly ad-hoc and not as smooth as my latest projects. It is made by laser cutting 1/8" acrylic. I tried to pay special attention to isolating the 120V AC circuits from hands and low voltage DC circuits. DXF files which can be used to recreate the box can be downloaded.
The code for this project is fairly straight forward. You can download the code in Arduino format, or glance over the code by looking at the word document here.
Once the controller seemed to be working pretty well, I went about trying to calibrate it. First I tried to get a sense of what my thermocouple was reading relative to the built in thermocouple on the furnace, and relative to another K type thermcouple hooked up to a multimeter.
As you can see, the Arduino thermocouple consistently reads higher than either the multimeter thermocouple or the built in furnace thermocouple. In fact, the spread in temperatures is quite big... almost a 50oC difference between the Arduino and the built-in thermocouple, and almost a 90oC difference between the Arduino and the multimeter K-type thermocouple. I really don't know why these differences are so big... I tried to place the tips of all the thermocouples in the same region of the furnace. At this point I realized that precision temperature control was going to be very difficult to do and would require using pyrometric cones of some type. The data from the calibration run can be downloaded here.
Finally, I ran two runs with the furnace as a proof of concept to show the at controller would work if I calibrated it extensively. The first run at left was with a setpoint of 500oC. The furnace display shows the "actual" temperature to be 450oC. The excel file for this run can be downloaded.
The final run, shown below, was for a run which would ramp up to 300oC, hold for one hour, ramp up to 500oC, hold for another hour, then ramp up to 700oC, and hold for an hour and a half. The setpoints used in the code were actually 340, 560, and 760, which, based off the calibration curve above, should correspond to readings from the built-in furnace thermcouple of 300oC, 500oC, and 700oC. The graph below shows the Arduino readings, and the built-in readings were very close to 500 and 700 (I didn't check the built in thermocouple during the first hour). The excel file for this run can be downloaded.