/*******************************************************************************
* Title: Reflow Oven Controller
* Version: 1.10
* Date: 22-12-2011
* Company: Rocket Scream Electronics
* Website: [url=http://www.rocketscream.com]www.rocketscream.com[/url]
*
* Brief
* =====
* This is an example firmware for our Arduino compatible reflow oven controller.
* The reflow curve used in this firmware is meant for lead-free profile
* (it's even easier for leaded process!). Please check our wiki
* ([url=http://www.rocketscream.com/wiki]www.rocketscream.com/wiki[/url]) for more information on using this piece of code
* together with the reflow oven controller.
*
* Temperature (Degree Celcius) Magic Happens Here!
* 245-| x x
* | x x
* | x x
* | x x
* 200-| x x
* | x | | x
* | x | | x
* | x | |
* 150-| x | |
* | x | | |
* | x | | |
* | x | | |
* | x | | |
* | x | | |
* | x | | |
* 30 -| x | | |
* |< 60 - 90 s >|< 90 - 120 s >|< 90 - 120 s >|
* | Preheat Stage | Soaking Stage | Reflow Stage | Cool
* 0 |_ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
* Time (Seconds)
*
* This firmware owed very much on the works of other talented individuals as
* follows:
* ==========================================
* Brett Beauregard ([url=http://www.brettbeauregard.com]www.brettbeauregard.com[/url])
* ==========================================
* Author of Arduino PID library. On top of providing industry standard PID
* implementation, he gave a lot of help in making this reflow oven controller
* possible using his awesome library.
*
* ==========================================
* Limor Fried of Adafruit ([url=http://www.adafruit.com]www.adafruit.com[/url])
* ==========================================
* Author of Arduino MAX6675 library. Adafruit has been the source of tonnes of
* tutorials, examples, and libraries for everyone to learn.
*
* Disclaimer
* ==========
* Dealing with high voltage is a very dangerous act! Please make sure you know
* what you are dealing with and have proper knowledge before hand. Your use of
* any information or materials on this reflow oven controller is entirely at
* your own risk, for which we shall not be liable.
*
* Licences
* ========
* This reflow oven controller hardware and firmware are released under the
* Creative Commons Share Alike v3.0 license
* http://creativecommons.org/licenses/by-sa/3.0/
* You are free to take this piece of code, use it and modify it.
* All we ask is attribution including the supporting libraries used in this
* firmware.
*
* Revision Description
* ======== ===========
* 1.10 Arduino IDE 1.0 compatible.
* 1.00 Initial public release.
*******************************************************************************/
// ***** INCLUDES *****
#include <LiquidCrystal.h>
#include <max6675.h>
#include <PID_v1.h>
// ***** TYPE DEFINITIONS *****
typedef enum REFLOW_STATE{
REFLOW_STATE_IDLE,
REFLOW_STATE_PREHEAT,
REFLOW_STATE_SOAK,
REFLOW_STATE_REFLOW,
REFLOW_STATE_COOL,
REFLOW_STATE_COMPLETE,
REFLOW_STATE_ERROR
} reflowState_t;
typedef enum REFLOW_STATUS{
REFLOW_STATUS_OFF,
REFLOW_STATUS_ON
} reflowStatus_t;
typedef enum DEBOUNCE_STATE{
DEBOUNCE_STATE_IDLE,
DEBOUNCE_STATE_CHECK,
DEBOUNCE_STATE_RELEASE
} debounceState_t;
// ***** CONSTANTS *****
#define TEMPERATURE_ROOM 50
#define TEMPERATURE_SOAK_MIN 150
#define TEMPERATURE_SOAK_MAX 200
#define TEMPERATURE_REFLOW_MAX 250
#define TEMPERATURE_COOL_MIN 100
#define SENSOR_SAMPLING_TIME 1000
#define SOAK_TEMPERATURE_STEP 5
#define SOAK_MICRO_PERIOD 9000
#define DEBOUNCE_PERIOD_MIN 50
#define THERMOCOUPLE_DISCONNECTED 10000
// ***** PID PARAMETERS *****
// ***** PRE-HEAT STAGE *****
#define PID_KP_PREHEAT 300
#define PID_KI_PREHEAT 0.05
#define PID_KD_PREHEAT 400
// ***** SOAKING STAGE *****
#define PID_KP_SOAK 300
#define PID_KI_SOAK 0.05
#define PID_KD_SOAK 250
// ***** REFLOW STAGE *****
#define PID_KP_REFLOW 300
#define PID_KI_REFLOW 0.05
#define PID_KD_REFLOW 350
#define PID_SAMPLE_TIME 1000
// ***** LCD MESSAGES *****
const char* lcdMessagesReflowStatus[] = {
"Ready",
"Pre-heat",
"Soak",
"Reflow",
"Cool",
"Complete",
"Error"
};
// ***** DEGREE SYMBOL FOR LCD *****
unsigned char degree[8] = {140,146,146,140,128,128,128,128};
// ***** PIN ASSIGNMENT *****
int ssr = 5;
int thermocoupleSO = A5;
int thermocoupleCS = A4;
int thermocoupleCLK = A3;
int lcdRs = 7;
int lcdE = 8;
int lcdD4 = 9;
int lcdD5 = 10;
int lcdD6 = 11;
int lcdD7 = 12;
int ledRed = A1;
int ledGreen = A0;
int buzzer = 6;
int button1 = 2;
int button2 = 3;
// ***** PID CONTROL VARIABLES *****
double setpoint;
double input;
double output;
double kp = PID_KP_PREHEAT;
double ki = PID_KI_PREHEAT;
double kd = PID_KD_PREHEAT;
int windowSize;
unsigned long windowStartTime;
unsigned long nextCheck;
unsigned long nextRead;
unsigned long timerSoak;
unsigned long buzzerPeriod;
// Reflow oven controller state machine state variable
reflowState_t reflowState;
// Reflow oven controller status
reflowStatus_t reflowStatus;
// Button debounce state machine state variable
debounceState_t debounceState;
// Button debounce timer
long lastDebounceTime;
// Button press status
boolean buttonPressStatus;
// Seconds timer
int timerSeconds;
// Specify PID control interface
PID reflowOvenPID(&input, &output, &setpoint, kp, ki, kd, DIRECT);
// Specify LCD interface
LiquidCrystal lcd(lcdRs, lcdE, lcdD4, lcdD5, lcdD6, lcdD7);
// Specify MAX6675 thermocouple interface
MAX6675 thermocouple(thermocoupleCLK, thermocoupleCS, thermocoupleSO);
void setup()
{
// SSR pin initialization to ensure reflow oven is off
digitalWrite(ssr, LOW);
pinMode(ssr, OUTPUT);
// Buzzer pin initialization to ensure annoying buzzer is off
digitalWrite(buzzer, LOW);
pinMode(buzzer, OUTPUT);
// LED pins initialization and turn on upon start-up (active low)
digitalWrite(ledRed, LOW);
digitalWrite(ledGreen, LOW);
pinMode(ledRed, OUTPUT);
pinMode(ledGreen, OUTPUT);
// Push button pins initialization
pinMode(button1, INPUT);
pinMode(button2, INPUT);
// Start-up splash
digitalWrite(buzzer, HIGH);
lcd.begin(8, 2);
lcd.createChar(0, degree);
lcd.clear();
lcd.print("Reflow");
lcd.setCursor(0, 1);
lcd.print("Oven 1.1");
digitalWrite(buzzer, LOW);
delay(2500);
lcd.clear();
// Serial communication at 57600 bps
Serial.begin(57600);
// Turn off LED (active low)
digitalWrite(ledRed, HIGH);
digitalWrite(ledGreen, HIGH);
// Set window size
windowSize = 2000;
// Initialize time keeping variable
nextCheck = millis();
// Initialize thermocouple reading varible
nextRead = millis();
}
void loop()
{
// Current time
unsigned long now;
// Time to read thermocouple?
if (millis() > nextRead)
{
// Read thermocouple next sampling period
nextRead += SENSOR_SAMPLING_TIME;
// Read current temperature
input = thermocouple.readCelsius();
// If thermocouple is not connected
if (input == THERMOCOUPLE_DISCONNECTED)
{
// Illegal operation without thermocouple
reflowState = REFLOW_STATE_ERROR;
reflowStatus = REFLOW_STATUS_OFF;
}
}
if (millis() > nextCheck)
{
// Check input in the next seconds
nextCheck += 1000;
// If reflow process is on going
if (reflowStatus == REFLOW_STATUS_ON)
{
// Toggle red LED as system heart beat
digitalWrite(ledRed, !(digitalRead(ledRed)));
// Increase seconds timer for reflow curve analysis
timerSeconds++;
// Send temperature and time stamp to serial
Serial.print(timerSeconds);
Serial.print(" ");
Serial.print(setpoint);
Serial.print(" ");
Serial.print(input);
Serial.print(" ");
Serial.println(output);
}
else
{
// Turn off red LED
digitalWrite(ledRed, HIGH);
}
// Clear LCD
lcd.clear();
// Print current system state
lcd.print(lcdMessagesReflowStatus[reflowState]);
// Move the cursor to the 2 line
lcd.setCursor(0, 1);
// If currently in error state
if (reflowState == REFLOW_STATE_ERROR)
{
// No thermocouple wire connected
lcd.print("No TC!");
}
else
{
// Print current temperature
lcd.print(input);
#if ARDUINO >= 100
lcd.write((uint8_t)0);
#else
// Print degree Celsius symbol
lcd.print(0, BYTE);
#endif
lcd.print("C ");
}
}
// Reflow oven controller state machine
switch (reflowState)
{
case REFLOW_STATE_IDLE:
// If button is pressed to start reflow process
if (buttonPressStatus)
{
// Ensure current temperature is comparable to room temperature
// TO DO: To add indication that temperature is still high for
// reflow process to start
if (input <= TEMPERATURE_ROOM)
{
// Send header for CSV file
Serial.println("Time Setpoint Input Output");
// Intialize seconds timer for serial debug information
timerSeconds = 0;
// Initialize PID control window starting time
windowStartTime = millis();
// Ramp up to minimum soaking temperature
setpoint = TEMPERATURE_SOAK_MIN;
// Tell the PID to range between 0 and the full window size
reflowOvenPID.SetOutputLimits(0, windowSize);
reflowOvenPID.SetSampleTime(PID_SAMPLE_TIME);
// Turn the PID on
reflowOvenPID.SetMode(AUTOMATIC);
// Proceed to preheat stage
reflowState = REFLOW_STATE_PREHEAT;
}
}
break;
case REFLOW_STATE_PREHEAT:
reflowStatus = REFLOW_STATUS_ON;
// If minimum soak temperature is achieve
if (input >= TEMPERATURE_SOAK_MIN)
{
// Chop soaking period into smaller sub-period
timerSoak = millis() + SOAK_MICRO_PERIOD;
// Set less agressive PID parameters for soaking ramp
reflowOvenPID.SetTunings(PID_KP_SOAK, PID_KI_SOAK, PID_KD_SOAK);
// Ramp up to first section of soaking temperature
setpoint = TEMPERATURE_SOAK_MIN + SOAK_TEMPERATURE_STEP;
// Proceed to soaking state
reflowState = REFLOW_STATE_SOAK;
}
break;
case REFLOW_STATE_SOAK:
// If micro soak temperature is achieved
if (millis() > timerSoak)
{
timerSoak = millis() + SOAK_MICRO_PERIOD;
// Increment micro setpoint
setpoint += SOAK_TEMPERATURE_STEP;
if (setpoint > TEMPERATURE_SOAK_MAX)
{
// Set agressive PID parameters for reflow ramp
reflowOvenPID.SetTunings(PID_KP_REFLOW, PID_KI_REFLOW, PID_KD_REFLOW);
// Ramp up to first section of soaking temperature
setpoint = TEMPERATURE_REFLOW_MAX;
// Proceed to reflowing state
reflowState = REFLOW_STATE_REFLOW;
}
}
break;
case REFLOW_STATE_REFLOW:
// We need to avoid hovering at peak temperature for too long
// Crude method that works like a charm and safe for the components
if (input >= (TEMPERATURE_REFLOW_MAX - 5))
{
// Set PID parameters for cooling ramp
reflowOvenPID.SetTunings(PID_KP_REFLOW, PID_KI_REFLOW, PID_KD_REFLOW);
// Ramp down to minimum cooling temperature
setpoint = TEMPERATURE_COOL_MIN;
// Proceed to cooling state
reflowState = REFLOW_STATE_COOL;
}
break;
case REFLOW_STATE_COOL:
// If minimum cool temperature is achieve
if (input <= TEMPERATURE_COOL_MIN)
{
// Retrieve current time for buzzer usage
buzzerPeriod = millis() + 1000;
// Turn on buzzer and green LED to indicate completion
digitalWrite(ledGreen, LOW);
digitalWrite(buzzer, HIGH);
// Turn off reflow process
reflowStatus = REFLOW_STATUS_OFF;
// Proceed to reflow Completion state
reflowState = REFLOW_STATE_COMPLETE;
}
break;
case REFLOW_STATE_COMPLETE:
if (millis() > buzzerPeriod)
{
// Turn off buzzer and green LED
digitalWrite(buzzer, LOW);
digitalWrite(ledGreen, HIGH);
// Reflow process ended
reflowState = REFLOW_STATE_IDLE;
}
break;
case REFLOW_STATE_ERROR:
// If thermocouple is still not connected
if (input == THERMOCOUPLE_DISCONNECTED)
{
// Wait until thermocouple wire is connected
reflowState = REFLOW_STATE_ERROR;
}
else
{
// Clear to perform reflow process
reflowState = REFLOW_STATE_IDLE;
}
break;
}
// If button is pressed
if (buttonPressStatus == true)
{
// If currently reflow process is on going
if (reflowStatus == REFLOW_STATUS_ON)
{
// Button press is for cancelling
// Turn off reflow process
reflowStatus = REFLOW_STATUS_OFF;
// Reinitialize state machine
reflowState = REFLOW_STATE_IDLE;
}
}
// Simple button debounce state machine (for button #1 only)
// TO DO: To be replaced with interrupt version in next revision
switch (debounceState)
{
case DEBOUNCE_STATE_IDLE:
// No valid button press
buttonPressStatus = false;
// If button #1 is pressed
if (digitalRead(button1) == LOW)
{
// Intialize debounce counter
lastDebounceTime = millis();
// Proceed to check validity of button press
debounceState = DEBOUNCE_STATE_CHECK;
}
break;
case DEBOUNCE_STATE_CHECK:
// If button #1 is still pressed
if (digitalRead(button1) == LOW)
{
// If minimum debounce period is completed
if ((millis() - lastDebounceTime) > DEBOUNCE_PERIOD_MIN)
{
// Proceed to wait for button release
debounceState = DEBOUNCE_STATE_RELEASE;
}
}
// False trigger
else
{
// Reinitialize button debounce state machine
debounceState = DEBOUNCE_STATE_IDLE;
}
break;
case DEBOUNCE_STATE_RELEASE:
if (digitalRead(button1) == HIGH)
{
// Valid button press
buttonPressStatus = true;
// Reinitialize button debounce state machine
debounceState = DEBOUNCE_STATE_IDLE;
}
break;
}
// PID computation and SSR control
if (reflowStatus == REFLOW_STATUS_ON)
{
//unsigned long now;
now = millis();
reflowOvenPID.Compute();
if((now - windowStartTime) > windowSize)
{
// Time to shift the Relay Window
windowStartTime += windowSize;
}
if(output > (now - windowStartTime)) digitalWrite(ssr, HIGH);
else digitalWrite(ssr, LOW);
}
// Reflow oven process is off, ensure oven is off
else
{
digitalWrite(ssr, LOW);
}
}Nice idea. Hope that you make the schematics available for download :DThere will be one of those in there too, and I could just connect that to one of the cheap eBay PID controllers, but no fun in that. I like to make things more than actually use them. It's the climb to the top that is more fun than being there. :)
But why don't you have a temperature probe in there? perhaps something like these can be used: https://www.elfaelektronik.dk/elfa3~dk_da/elfa/init.do?item=55-890-11&toc=19437 (https://www.elfaelektronik.dk/elfa3~dk_da/elfa/init.do?item=55-890-11&toc=19437)
for the English speaking part of the community https://www.elfaelectronics.com/elfa3~ex_en/elfa/init.do?item=55-890-11&toc=0 (https://www.elfaelectronics.com/elfa3~ex_en/elfa/init.do?item=55-890-11&toc=0)
Yeah, I broke it somehow. No idea how. I was having issues with uploading attachment picture, so I posted it without it. Then I uploaded it to my website and went to edit the post. I clicked on edit, edited the message, posted it. Some error about "this message has been already sent" appeared and since then the PHP script crashes at my post. I can see replies through REPLY only ;DYeah, it is the same thing I am currently doing... I wonder if there is a cache or something that it stuck...
Seen it happen with all the SMFForums time to time ... this isn't the first time i've seen it happen hereYeah, I broke it somehow. No idea how. I was having issues with uploading attachment picture, so I posted it without it. Then I uploaded it to my website and went to edit the post. I clicked on edit, edited the message, posted it. Some error about "this message has been already sent" appeared and since then the PHP script crashes at my post. I can see replies through REPLY only ;DYeah, it is the same thing I am currently doing... I wonder if there is a cache or something that it stuck...
Got any known fix for it too? Would make it a lot easier to read all this. :)Seen it happen with all the SMFForums time to time ... this isn't the first time i've seen it happen hereYeah, I broke it somehow. No idea how. I was having issues with uploading attachment picture, so I posted it without it. Then I uploaded it to my website and went to edit the post. I clicked on edit, edited the message, posted it. Some error about "this message has been already sent" appeared and since then the PHP script crashes at my post. I can see replies through REPLY only ;DYeah, it is the same thing I am currently doing... I wonder if there is a cache or something that it stuck...
Oh well.Looks like what I got in mind too... if I read it right :P still learning...
Meanwhile you can look at the schematics HERE (http://public.myxboard.net/oven.png).
Since now it works again, I can also post picture of the display I will be using. And also the board layout as it looks now.Page 1 is still borked... But looking good, will also make the oven look more or less stock when done?
Why the display? Because I have got too much stuff lying around! Better than buying some HD44780 and stocking more and more parts.
Now now, the advantage of SSRs over triacs are isolation and pure simplicity ... with a TRIAC it's much cheaper and you only need a snubber cap or two (Might even need a DIAC)Oh well.Looks like what I got in mind too... if I read it right :P still learning...
Meanwhile you can look at the schematics HERE (http://public.myxboard.net/oven.png).
I am planning on using SSR instead of triacs, just because I got multiple of them laying around.
I might make a controller with triac's on too... but this first one will be as simple as possible... I haven't made that many things yet, so I start simple then adds more and more :)Now now, the advantage of SSRs over triacs are isolation and pure simplicity ... with a TRIAC it's much cheaper and you only need a snubber cap or two (Might even need a DIAC)Oh well.Looks like what I got in mind too... if I read it right :P still learning...
Meanwhile you can look at the schematics HERE (http://public.myxboard.net/oven.png).
I am planning on using SSR instead of triacs, just because I got multiple of them laying around.
few small points, thermocouples on there own generally are just the junction of 2 dissimilar metals, if you want it instead of hunting around a very tight set point to stabalise near it you add some mass to it, even say a metal beer cap, but that depends on how you want the system to function (t4p's type have high mass and will respond very slowly)Yeah i'm aware. Only the small junction types can perform well for low thermal mass. Those thermocouples i've shown is usually used for mostly hotplates
equally it is better to average out 4 thermocouples placed around the thing than a single one, to average the voltaqge of thermocouples just add them in parrellel, while this will mean there will be a tiny bit of error introduced from tiny amounts of current flow it would result in a better representation of the entire oven, and thermocouples are pretty cheap at those temperatures,
Cheap chinese reflow oven from 200$ ... hmm DIY doesn't look so interesting anymore
http://www.ebay.com/itm/T962-INFRARED-SMD-BGA-IC-HEATER-REFLOW-OVEN-800W-180-235MM-T-962-BRAND-NEW-k2-/180736333541?pt=UK_Home_Garden_Conservatory_Patio_bbq_Patio_Covers_Heating&hash=item2a14b996e5 (http://www.ebay.com/itm/T962-INFRARED-SMD-BGA-IC-HEATER-REFLOW-OVEN-800W-180-235MM-T-962-BRAND-NEW-k2-/180736333541?pt=UK_Home_Garden_Conservatory_Patio_bbq_Patio_Covers_Heating&hash=item2a14b996e5)
Not a review but here it is what i found about it on different forums:
(Don't use them inside, use them in a garage or similar as they do burn off paint & of course, smelly, and most likely highly toxic solderflux gases)
There are 2 elements in the unit, mark the position of these on the bottom of the PCB drawer. Align your PCB's longitudily with these elements, ie as much in line and centered between them as possible
Always put your target PCB's on top of 2 layers of old PCB's to prevent the PCB drawers metal bottom from sinking the heat away from your PCB's
I have one of these. I've had it for about a year and a half and I've done quite a few boards with it now. It works very well. It follows the temp profiles fairly well that I choose (as monitored by an external source). I have no complaints about it and would definitely pick it up again instead of kludging together a toaster oven.
I use on of their shields on an Arduino with their stock code, I just made a box for the SSR's that control the heater element and cooling fan, and the arduino plus the shield and an LCD with control buttions and it has performed excellently for the last year or so with my breville toaster oven.
Cheers,
Hugh
i am wrapping up on a controller for such an oven.
few small points, thermocouples on there own generally are just the junction of 2 dissimilar metals, if you want it instead of hunting around a very tight set point to stabalise near it you add some mass to it
Pcb can be ordered through elektor. Full plans (schematics) are in the new labworx book 'mastering surface mount technology ( there's also an uv exposure unit , a ringlight for microscope or magnifier and an led tester for smt leds's)i am wrapping up on a controller for such an oven.
Would love to see the details!
Cheap chinese reflow oven from 200$ ... hmm DIY doesn't look so interesting anymore
i am wrapping up on a controller for such an oven. simple 2x8 lcd , two thermocouple sensors ( one for temp regulation one to monitor pcb ) usb for logging and programming , memory for 9 recipes.
We've been using a Breville BOV800 convection oven to do small batches of SMD boards.
(http://www.thegoodguys.com.au/wcsstore/TGGCAS/idcplg?IdcService=GET_FILE&RevisionSelectionMethod=LatestReleased&noSaveAs=1&dDocName=10179228_0&Rendition=FullImage)
It's not cheap (AUD $249) but has much better heating than the crappy cheap ovens. Yet to make a controller for it. Just using it manually for now.
That looks like the go, in convection mode.
Could probably even hack the keypad to control the thing instead of replacing all the electronics.
I got a $250 ebay "T-962" reflow oven (came with a complete set of spare IR tubes). They are controlled by two thermocouples (hanging from the top into the compartment), and one of them had a bad contact in its connector. My first test board was completely fried :). After fixing and calibrating it (properly), now it works. Heat dirtribution is not even though, the outer 20% of the drawer area is nearly useless (has a lot lower temp).I have the bigger -A version, and I consider it garbage.
EDIT: Maybe the drawer is a bit bigger than the specified area (did not measure it).
We've been using a Breville BOV800 convection oven to do small batches of SMD boards.
...
...Looks nice. Bottom heater and convection fan sound good.
I like the oven I bought as the extra height and 5 heater bars seem to give quite reasonable performance.
However, reading the manual, I see mention of the temperature range no more than 230 degrees.
That means the oven would be unsuitable for lead-free soldering...
Perhaps performance can be improved bigtime by adding a convecion fan and
replacing the controller with a more reliable and useful thing.
I considered one of the 962 series units but saw many negative reviews, ranging from "poor heat distribution" to "caught fire" ! :o
I like the oven I bought as the extra height and 5 heater bars seem to give quite reasonable performance.
Perhaps performance can be improved bigtime by adding a convecion fan andOK so that should be good but the last time i checked hot air ovens are VERY high-power and VERY huge plus thousands of dollars for "smaller" ones
replacing the controller with a more reliable and useful thing.
Yes, I've been wondering this.
They are about AU$250 delivered.
Any real advantages to the DIY approach?, and has someone standardised on a kit controller board?, or is each build a unique hack?
Just temped to get the commercial one at that price and save the dicking around...
Dave.
You probably won't get the full 1800W from the oven though. Here in the states I had a 1500W oven that actually only ran at 1300W measured (house voltage is 112V not 120/125V). So I pulled the elements from a second oven and wired them in series with the existing 4 elements and run it on 220V for a functioning 2600W. With the convection fan running on 110V I get nice even heating and good ramp slope. But the heaters have a LOT of mass with respect to the air in the oven and therefore the internal temperature overshoots if I don't shut the heaters off before the setpoint.Perhaps performance can be improved bigtime by adding a convecion fan andOK so that should be good but the last time i checked hot air ovens are VERY high-power and VERY huge plus thousands of dollars for "smaller" ones
replacing the controller with a more reliable and useful thing.
Nope, convection ovens for me. Getting one that is around 1800W and if i read correctly 4 heaters :o
3.5kW ... argh, need a 15amp plug