Introduction: Arduino Controlled Air-pulsed Heating System


Our central air-pulsed heating system (Multicalor Sphere 30: is circulating the air in all the rooms of our house while the thermostat is only in the living room. The non-living rooms are temperature controlled via the amount of air-flow going to each room. Such system has low flexibility. Recently, we started to use our hall as a secondary living room, mainly for watching a large screen Sony TV in the evening. To obtain an independent controllable temperature in the hall, I designed an air-flow mouth with a stepper motor driven valve under control of a second thermostat linked to an arduino Uno board. The mechanics are rather simple and I am proud to say that I managed the programming all on my own.

A critical element was the noise coming from the electricity net via the power supply (an old IBM laptop power supply). I had to add several ferrite cores ( to remove high-frequency electronic noise from the net over the DC power wire entering the system. A second system was the control of the valve position with an attached magnet and a magnet sensor.

Step 1: Components Used

Arduino Uno (

Ferrite core 7 mm (

Step-down DC converter (Ebay: LM2596HV LM2596S DC-DC Step Down CC-CV Adjustable Power Supply Module).

Stepper motor (

Stepper motor driver (

Two valve attached magnets were from an old hard drive.

Valve magnet sensor was bought from Gotron (

Honeywell thermostat: Round non-programmable model (

Two metal bars with screws 6 mm.

Two U-form metal bars to connect the system to the air duct.

Wooden board of 5 mm thickness.

Step 2: Assembly of the Valve and Electronics

A wooden board was cut to the size of the opening of the air duct outflow (rectangular in this case) and connected to the stepper motor with an aluminium bar. Furthermore, two magnets were added to the wooden board as shown in the picture above. The connection of the aluminium bar to the stepper is with a piece of PVC tube. There are no heavy forces around in the system and the speed of closing and opening is easily controlled in the code by setting the step time.

The set-up of the electronics, the stepper motor and Power supply is shown in the second picture. The components are listed at the right side of the photo. The stepper motor has 4 wires to connect to the driver, the magnet sensor has two wires which are connected to A2. The thermostat has two wires which are connected to 5V and analogue A0.

The electronic heart is in the plastic box (regular electricity shop). It contains the arduino board, the power supply converter (19 V for the stepper and 5 V for the arduino board, right region) and the stepper driver (left under).

The LED is directly on the board pin 13.

Step 3: The Arduino Code and Testing

The code is rather simple while only two variables are used: val for the themperature and val2 for the valve position. In this way the valve position is always known and even if the current falls away, the program will restore itself. The only problem not foreseen would be when the current falls away during the stepping of the motor. As the movement always goes for 90 degrees, the valve would probably continue to stay half open. After a full Winter of operation, this has not happened to me. The stepper allows manual repositioning after the current has been cut off.

It is possible to play with the delay times. My experience is that the circling time should not be too short. Reading of the temperature every 5 minutes is more than sufficient.

The lower analogue value reading is not zero, nor unique. It is around 700. The high value reading (closed circuit is much more stable and it is much better to use this value.

//Stepper Motor on digital 8 en 9, 8 is dirpin, 9 is steppin
//Thermostate with LED on when Tset larger than Tenvironment

//careful with polarity of LED, long leg on 13, when no resistor is used //magnet sensor only at 1 side of air duct (upper side) int ledPin = 13;

//13 has resistor in line, led is connected to pin 13 int dirPin = 8; int stepPin = 9; int inputPin = 0;

//sensorpin on analogue 0 int inputPin2 = 2;

//magnetsensor on analoog 2 int valveOpen;

//situation of valve, 0 = open, 1 = closed

void setup(){

Serial.begin(9600);//open serial port, to communicate with temp sensor

pinMode(ledPin,OUTPUT);//pin 13 is an output voor de led

pinMode(dirPin,OUTPUT);//direction of stepper

pinMode(stepPin,OUTPUT);//stepper pin of motor

pinMode(inputPin,INPUT);//sensorpin from thermost on analoge A0

pinMode(inputPin,INPUT);//sensorpin magnet on A2

digitalWrite(8,LOW);// set dirpin op low


void loop(){ int val2=analogRead(inputPin2);//read magnet sensor


int val=analogRead(inputPin);//read temperature

Serial.println(val); Serial.println(val2);//print


if (val > 1020 && val2 > 1020)//check if the input is higher than 800 (infact it reads 1023 if circuit is closed), {digitalWrite(ledPin,HIGH);//LED on means heating is on

int i;

for (i = 0; i <= 799; i++)//open valve with loop1

{ digitalWrite(stepPin, LOW);

digitalWrite(stepPin, HIGH); delay(3);}//opens the valve

delay(180000);}//time with open valve

else { if (val > 1020 && val2 < 1020 )

digitalWrite(ledPin,HIGH); delay (180000); }//

if (val < 1020 && val2 < 1020) { digitalWrite(ledPin,LOW);

int i;

for (i = 0; i <= 799; i++)//open valve with loop1

{ digitalWrite(stepPin, LOW);

digitalWrite(stepPin, HIGH);

delay(3); }//close the valve

delay(180000); }

else { if (val < 1020 && val2 > 1020)


delay(180000); } }}