Radiant Heat Control

My first Arduino project.

Above is a photo of my first Arduino project. This Arduino Uno controls the delivery of hot water from a home heating boiler to heating coils in the basement slab (usually called radiant hydronic heating) through a custom-built heat exchanger.

The Arduino implements a proportional control algorithm to maintain the room air temperature at a user-set value.

Air temperature is measured with an AD590. The AD590 is a two-terminal linear device with current flow in microamps equal to the temperature in Kelvin. This current is biased and amplified by the 741 op amp you see in the lower left corner. The biasing and amplification allows the air temperature measurement to operate in the 45 F to 75 F range for maximum resolution. This biased/amplified voltage is fed to A0 on the Arduino.

The sketch below shows the 741 amplifier with the biasing/amplification arrangement. Final resistor values are: R1 = 1 K , R2 = 402 ohm , R3 = 32 K, R4 = 541 K, Rad = 9.85 K. The equation shown in the sketch would allow one to bias/amplify an AD590 to any range they wanted.

The temperature set point is derived from the pot you see on the right side of the photo. This voltage is fed to the A1 terminal on the Arduino.

I'm operating the AD590 off of 10 VDC supplied by the power supply board in the lower right corner. The AD590 has a minimum voltage drop of about 4 volts so the 10 VDC allows the use of most of the full 5 volt range of the Arduino ADC. I wanted to avoid the need for a +/- power supply for the 741 so I sacrificed the 0 to 2 volt output range.

Control output is via digital ch 2. This goes to a solid state relay which closes a mechanical relay which opens a flow control valve (FCV) in the boiler loop supplying hot water to the hot-side of the heat exchanger. Water flows continuously (24/7/365) through the slab-side of the heat exchanger. The two relays are housed in a separate enclosure, not shown.

My algorithm works like this:

read the two analog channels once per minute

at the end of each hour calculate the average for those 2 channels

apply a proportional gain to the difference between the 2 average values

if heat is needed, open the FCV for a period of minutes equal to the channel difference average.

In the upper right part of the first photo is a MAX232 chip to interface the TX/RX terminals of the Arduino with a serial port on my laptop. I decided this was the best way to work around the auto-reset feature of the Arduino. It will also allow me to log the serial data directly to a file.

By far, the most difficult part of this project was the heat exchanger fabrication and installation. The difficulty was mainly due to leaks at solder joints. I counted over 50 joints. Also, the complexity of the two loops was challenging. The partially assembled heat exchanger is shown in the photo below.

After looking at some of the commercial heat exchangers I decided to design one myself. Originally I wanted to use a tube-in-tube design due to simplicity, low cost, performance, and ease/accuracy in calculating performance. But a quick stress calculation showed that every cold-start would stress the inner tube close to yield. So, I used the configuration shown in the photo which is tube-in-tube-in-tube. This preserved all the benefits of the tube-in-tube design but allowed the inner tubes to freely expand. Cost of parts was very low. Heat transfer capacity is about 40,000 BTU/hr.

Completed installation is shown in the photo below. At the bottom of the photo you can see the radiant heat tubes as they emerge from the slab to the supply and return manifolds. The blue device is the pump that circulates water through the slab to the heat exchanger and back to the slab. The heating tubes have a total length of about 2000 feet and the slab comprises about 100,000 pounds of concrete which makes for a slow thermal response.

The upper part of the horizontal U-shape insulated tubing is the heat exchanger. The FCV is the white device with the small green circle in the riser that goes out the top of the photo. Above that is one of two red-handled block valves in the boiler loop. The boiler pump is just below the black rectangle near the right edge of the photo.

How well does it work? For the first time in the 23 years since I built the house, the basement temperature was stable and comfortable. I guessed at the initial value of the proportional gain and halved it after some tuning tests. I need some more cold weather for more tuning but it really is pretty good right now. The graph below shows a typical control scenario after a small upset.

Vertical axis is temperature on a scale of 0-1024 (the ADC output), approx 20 vertical units per degree F and around 65 F at the 854 line. Blue line is the set point and green line is the AD590 output. Note response to the step in set point of about +2 deg F. There is a lag time of about 6 hours and the total time for the process variable first hit the set point is about 14 hours. Cooldown time is much slower, as much as 48 hours.

Where's my sketch? It is pretty rough right now with a lot of commented out code and other things that helped me debug it and tune the controller but would make it miserable to interpret for someone else. I'll get it cleaned up and post it at some point in the future.

Great project. I'm hoping I can switch from forced air to radiant heating before next winter. So far I've only glanced at a couple systems and suffered some serious sticker shock - especially surprising considering how much labor is involved to install any of them. So when I get more serious I'll be looking at your project to see what I can manage on my own to save some money. Thanks for sharing.

Let me know if I can be of any help.

Apologies to all for the loss of photos. I rearranged my server and need to go back and put these photos in the right place.

Hello,

I am very interested in the work you have done here, as I am building a radiant floor in my home and need such a controller, such as you have made here...

Unfortunately, the images, etc got lost, is it possible for you to edit them back in?

Is it possible for you to post code for your project to this thread?

Also, did you consider using an outdoor sensor, in addition to your indoor sensor? I know that a lot of commercial controllers have such a set up.

I recently purchased a PID controller on ebay, it works just fine... and the most interesting part is that it has a learning mode (called AUTO), wherein it turns ON the heat source, and measures the time it takes to get to the set point, then it cuts power to the heat source and waits until overshoot heat dissipates and the temp drops back down to the set point, and it measures the time for that to happen... then it calculates the optimum PID settings from the above data. So all subsequent run cycles, it will ramp up heat, then progressively feather it off until the set point is reached and it applies 'maintainance pulses' of heat to keep the temp at the set point.

Have you thought about a learning feature?

Best,

-AC_Hacker