Introduction: Arduino Wood Stove Insert Blower Controller

We recently installed a wood stove into our open fireplace to help with the heating bill. The model we chose does not have a thermostat. The user must manually turn the blower on when the fire is hot enough and manually turn it off when the fire is cold. The insert heats up more effectively if the blower is not turned on until the fire is hot enough so it is not advisable to just leave the blower on when starting the fire. After using the stove, I would often wake up in the morning with the stove cold and the blower still running.I thought it would be nice to have a thermostat to automatically turn the stove blower on and off based on the stove’s temperature so I built a simple thermostat using an Arduino Uno, a relay board, and a thermocouple.

Step 1: Gather Materials

1. Arduino Uno (I already had one but they are fairly cheap and readily available). Any other comparable micro controller would also work.

2. Thermocouple and module purchased online. There are many similar products out there. This is the one I chose for around $7.

3. Relay Board. Again there are many similar products available that would work. This one has two relays where I only needed one but is was fairly inexpensive at $6.79.

4. PVC Enclosure Box from hardware store. I purchased this box but a number of boxes would also work just fine.

5. I purchased a cheap extension cord so I didn't have to splice into the original cord that my wood stove insert has.

6. A number of jumper wires and a breadboard were used to connect everything. Alternatively, it could be soldered to make it more robust, but I didn't want to do any soldering and it is working just fine so far.

Step 2: Gather Tools

1. Drill and drill bits. I used a step drill bit to drill the various sized holes, but a drill bit size with bits up to 1/2" would also work.

2. Hot glue gun and glue. Not absolutely necessary, but the hot glue is quite handy for keeping the components and wires in place.

3. Wire strippers.

Step 3: Connecting All the Components

The components were connected to the Arduino as shown in the picture. The relay control pin was connected to digital pin 4 on the Arduino. For the thermocouple module, the pins were connected as follows:

SO-Digital Pin 8

CS-Digital Pin 9

SCK-Digital Pin 10

WARNING: This step involves wiring the extension cord to the relay. The extension cord will be connected to wall voltage of 120V AC, which can be dangerous, so take the necessary precautions. The extension cord should remain unplugged during this step. I am not an electrician, so proceed at your own risk.

The extension cord was wired to the relay so that power to the cord was shut off when Arduino energized the relay. This way, if I decide to unplug the Arduino, the blower would still have power.

Step 4: Enclosure

I enclosed all the components in a PVC electrical box. I used a drill to cut holes for the extension cord, thermocouple, and Arduino power cable. I used hot glue to hold all the components in place as well as to seal the holes where the wires went through the box.

Step 5: Mounting

I mounted the electrical box near the stove using screws near enough for the thermocouple to be placed in contact with the insert. I used a magnet to attach the thermocouple to the side of the stove semi-permanently. At this point, the extension cord can be plugged in. My setup required two outlets, one to power the blower and the other to power the Arduino. A USB wall adapter was used to power the Arduino.

Step 6: Program and Testing

I wrote a program to turn the blower on when the blower read 150 F and to turn it off when the temperature was less than 150 F. I chose this temperature based on what seemed to work best. This code also recorded the maximum and minimum temperatures once the stove is at temperature. Here is the code I am using:

#include "max6675.h"
int relay=4; int ktcSO = 8; int ktcCS = 9; int ktcCLK = 10; float Th=100; float Tl=100; float T; float T1; float T2; float T3; float T4; float(T5); float T6; float T7; float T8; float T9; float T10; MAX6675 ktc(ktcCLK, ktcCS, ktcSO);

void setup() { Serial.begin(9600); delay(500); pinMode(4,OUTPUT); Tl=ktc.readFahrenheit(); Th=ktc.readFahrenheit(); }

void loop() { // basic readout test

Serial.print("\t Deg F = "); T10=ktc.readFahrenheit();delay(100); T1=ktc.readFahrenheit();delay(100); T2=ktc.readFahrenheit();delay(100); T3=ktc.readFahrenheit();delay(100); T4=ktc.readFahrenheit();delay(100); T5=ktc.readFahrenheit();delay(100); T6=ktc.readFahrenheit();delay(100); T7=ktc.readFahrenheit();delay(100); T8=ktc.readFahrenheit();delay(100); T9=ktc.readFahrenheit();delay(100); T=(T1+T2+T3+T4+T5+T6+T7+T8+T9+T10)/10; Serial.println(T1);Serial.println(T2);Serial.println(T3);Serial.println(T4);Serial.println(T5);Serial.println(T5);Serial.println(T6);Serial.println(T7);Serial.println(T8);Serial.println(T9);Serial.println(T10);Serial.println(" ");

delay(1000); Serial.println(T); if (T>Th) { Th=T;}

if (T

if (T<150){ digitalWrite(relay,LOW); delay(60000); } if (T>150){ digitalWrite(relay,HIGH); delay(60000); } delay(500); }

Source for code: some bits and pieces from here and here.

Step 7: ​Problems

1. When I first started using the thermocouple, it would stop reading when it was in contact with the insert. I believe that this was due to it being a "grounded" type thermocouple. I solved this by wrapping a piece of paper around the thermocouple, insulating it electrically. The insert does not get hot enough to char the paper, but eventually, I may replace it with something better suited to this task.

2. When I first started using this controller, it would cycle on and off repeatedly when initially heating up and again when cooling down. This was a minor annoyance and probably also bad for the blower motor. I solved this by adding delays into the code. The delays allow the stove to either heat up or cool down well past the set point before checking the temperature again. Two one-minute delays were used and this seems to work well.

Step 8: Possible Improvements

1. A LCD display could be added to show the current temperature of the stove. Many of the available LCDs also have inputs, so the code could be modified such that the set-point could be adjusted without reloading the code on the Arduino.

2. A servo could be added to control the air intake to allow more air in as the stove gets to the lower set-point and less air as the stove gets to the upper set-point.

3. Any other suggestions or comments are welcome.