Solar Collectors integrated with Domestic Hot Water System

This project will focus on using an Arduino and Cayenne to monitor, and eventually control, my solar hot water system. We recently moved into a house that has an older solar collector system, storage tanks, hot water boiler and radiant heating system throughout the house. I’ve never had a solar system or hot water heating before so this is a new experience. The “mechanical room” is small but packed with pipes, pumps, valves, and tanks. I have begun the process to map out the system so I can hopefully understand how it all works. I was encouraged by gamoxristos project posting as it is very similar to what I am facing. The first sketch of the components is incomplete but will help me get started. I am beginning to make some sense of it and will soon be able to separate the various sub-systems into individual schematics and create some better drawings.

The existing controller is an old analog C-100 System Manager by Independent Energy, Inc. which still works fine but is limited to displaying the temps of the collector and storage tank only. I would prefer to get much more information on how the entire system is operating. I’ll be using an Arduino on this project and I have ordered the following to support the project:

  • SunFounder DS3231 RTC Real Time Clock Module High Precision
  • SunFounder Ethernet Shield W5100
  • SunFounder 5V Relay Shield Module
  • DS18B20 Waterproof Temperature Sensors (x5)

My analog controller is set to turn on the circulation pump based on the temperature differential between the collector and storage tank. It turns the pump on when the collector is 20 deg F hotter than the storage, and turns it off when the difference is 5 deg F. It also has a “high limit” feature which is currently set to 163 deg F. If the storage tank reaches the high limit then the circulation pump is turned off.

I plan to monitor the following points in the system:

  • Collector Temp
  • Storage Tank Temp
  • Solar Intensity (not sure how to do this)
  • Boiler Status (on/off)
  • Piping Temps to/from collector (this is a drain down system and there may be a problem with improper drainage and potential freezing)

Eventually, I would like to replace the analog controller and control the pump from the Arduino.

Waiting for the parts to arrive…

Progress made…over the holidays I received all the parts. Then connected up the W5100 Ethernet shield and connected it to my network. I had some challenges trying to utilize an older HP laptop for my development platform with the Arduino IDE. It used to run fairly well on Win7 but I had loaned it to someone and it got that ‘auto’ upgrade to Win10 somewhere along the way. Now you would get more satisfaction watching “paint dry”…it is horrendously slow. So, I nuked the drive and installed Fedora 25 but that had some nasty flickering display issues. Temporarily abandoned that and decided to use my usual desktop computer for the moment. Installed the Arduino IDE and added the Cayenne library.

Wired up a DS18B20 Temp sensor and added that device to my Dashboard. Pasted the provided code into the IDE and compiled-uploaded it to the Arduino. It is now showing up and reporting accurately on the Dashboard.

Next Step - Wire in the existing temp sensors for the Collector and Storage Tank. I have no clue what these sensors are other than:

  • two wires
  • measurements with VOM indicate a 0 - 5V range

I took a few measurements at the existing controller and recorded the following data points:
5.0V - 32F or below
3.5V - 62F
3.0V - 73F
1.7V - 117F

So, since there is no Add Device - Mystery Sensor on your Solar Collector option…
I am looking for help on how to add this sensor to my Dashboard and also how to wire it to the Arduino.

Any suggestions are appreciated.

Oh, and I did get my diagram more-or-less finished. I have not detailed out radiant heating system yet but here is the bulk of the piping.

2 Likes

Hi Matt,

One popular sensor used with solar heating systems is PT1000 Remember that especially at the panels, temperatures can go quite high, have seen 125+C temps in my system. You’ll probably be fine with DS18B20 sensors within the heating system and tanks, but might well max out at the collector.

Yours may well be different… might want to check Goldline Solar Control GL30 as it seems to indicate use of 10k ohm thermistors. There are some instructions on this page showing a value conversion chart.

From the link above:

All of the GoldLine (formally Independent Energy) controls (including C30, CM30, G30 and GL30 series) and some of the Heliotrope General (HG) DTT series controls incorporated the use of 10k sensors.

I think your first challenge is finding out which sensors are being used. Do they look like these? https://www.amazon.com/Hayward-GLX-PC-12-KIT-Thermistor-Temperature-Replacement/dp/B004RR90GM

I also see in your diagram that you are using expansion tanks for both heating and hot water tank circuits… this would seem to indicate a closed, pressurized system that would have some type of antifreeze (glycol) to help keep from freezing and boiling over.

I’m just starting out with RPi and Arduino so can’t help you (yet) with integrating the thermistors into your dashboard. I’m looking at how best to wire new sensors in my system first rather than using the old PT1000’s. I’m hoping cable lengths won’t be too much of a challenge.

Looks like a fun project! I’ll be doing something similar here and am familiar with solar water heating systems so will be following your progress :slight_smile: Feel free to ask or post pictures as I might be able to help figure out what is what in your system.

1 Like

Brian,
I think you are probably right about the existing collector sensor being the 10K thermistor. Unfortunately, there is too much snow on the roof right now to get up there and do a visual inspection. I am going to proceed on the assumption that it is a 10K thermistor and try adding that device to my dashboard and see if I can come up with a factor to apply to the reading that will give the correct temperatures. I’ll take a look at the conversion chart you referenced and see if it helps. I did find the manual for the C-100 controller but although it references the sensors in several places it never provides any specifics.

[Edit] I measured the resistance of both sensors. The storage tank is matching the conversion chart so it is apprently a 10K thermistor. The collector is reading about 39K with the outside temp at 35 deg F. So it appears to be about 10 deg off. Could be the age as well as the additional resistance from the leads. I would estimate the run is around 60-70 feet in length on 18AWG thermostat wire. [end-Edit]

The solar system is actually a non-pressurized drain down system using plain old water. My drawings may be a little confusing yet. I am still trying to put a name on the so-called mystery box which is about 16" on each side and nearly 7 foot tall. It is covered by some kind of insulation and if I have my flow directions correct, is one the receiving end of the solar collector. It’s a bit cramped in the mechanical room for pictures but I took a picture of both the lower and upper parts of the mystery box.

General question for anyone…

When I added my DS18B20 temp sensor on the dashboard I used the provided code to upload to the Arduino everything worked well. Now that I have added a second device for the 10K thermistor i get some new code. My assumption is that I need to manually combine the relevant parts of the two bits of code, save that as my new “main” file, and upload that to the Arduino. Correct?

Yep, just combine and keep it as one sketch when you upload.

I was thinking about your ‘mystery box’… Since it’s in your radiant heater circuit, it’s probably some type of collector for all the pipes going to the heating system. It might also contain some mixing valves to control temperature to the radiant heating system (floor?) that are controlled by the thermostat in the house or rooms. Since a lot of piping is involved in such that’s probably why it’s in an insulated box. I see there might be some kind of controller way up there that might control that part of your system.

Actually, it’s not part of the radiant heating system. I have not diagrammed that out yet. Everything on the top half of my diagram is the solar system. The output of the 120 Gal storage tank (Hot) is what feeds into the rest of the system. I think of it as being “not-so-cold” input into the rest of the system.

It’s a challenging thing to wrap your head around since many pipes are connected back on each other (loops) and I am more used to linear thinking.

I saw a book on Amazon: Classic Hydronics: How To Get The Most From Those Older Hot-Water Heating Systems by Dan Holohan that looked intriguing. Might help me understand more of this.

@adam
I could use some sample code for dealing with multiple sensors. Documentation would be helpful too. Right now I’m just guessing at the syntax. I haven’t written any C code in ages.The code below (relevant portions extracted) was my attempt but it does not seem to work. Not getting any readings on the thermistor.

#define VIRTUAL_PIN1 V1	// Virtual Pin of the DS18B20 widget.
#define VIRTUAL_PIN2 V2	// Virtual Pin of the thermistor widget.

const int tmpPin = 2;	// Digital pin the DS18B20 is connected to.
const int thermistorPin = 0;	// Analog pin the thermistor is connected to.
const float resistance = 10000;	// Resistance of the resistor.

CAYENNE_OUT(VIRTUAL_PIN1)
 {
   // Send the command to get temperatures.
   sensors.requestTemperatures();
   Cayenne.fahrenheitWrite(VIRTUAL_PIN1, sensors.getTempFByIndex(0));
}
// This function is called when the Cayenne widget requests data for the Virtual Pin.
CAYENNE_OUT(VIRTUAL_PIN2)
{
  Cayenne.fahrenheitWrite(VIRTUAL_PIN2, thermistor.getFahrenheit());
}

Is that your full sketch?

Just the relevant Cayenne parts.

Cool, could you post your full sketch? I’ll try it out and see if I can get it working.

#define CAYENNE_PRINT Serial  // Comment this out to disable prints and save space
#include <OneWire.h>
#include <DallasTemperature.h>
#include <CayenneTemperature.h>

// If you're not using the Ethernet W5100 shield, change this to match your connection type. See Communications examples.
#include <CayenneEthernet.h>


#define VIRTUAL_PIN1 V1	// Virtual Pin of the DS18B20 widget.
#define VIRTUAL_PIN2 V2	// Virtual Pin of the thermistor widget.
 
const int tmpPin = 2;	// Digital pin the DS18B20 is connected to.
const int thermistorPin = 0;	// Analog pin the thermistor is connected to.
const float resistance = 10000;	// Resistance of the resistor.

OneWire oneWire(tmpPin);
DallasTemperature sensors(&oneWire);
Thermistor thermistor(thermistorPin, resistance);

// Cayenne authentication token. This should be obtained from the Cayenne Dashboard.
char token[] = "0n2b31xswg";

void setup()
{
  Serial.begin(9600);
  Cayenne.begin(token);
  sensors.begin();
}

void loop()
{
  Cayenne.run();
}

// This function is called when the Cayenne widget requests data for the Virtual Pin.
CAYENNE_OUT(VIRTUAL_PIN1)
{
  // Send the command to get temperatures.
  sensors.requestTemperatures();
  // To send the temperature in Fahrenheit use the corresponding code below.
  Cayenne.fahrenheitWrite(VIRTUAL_PIN1, sensors.getTempFByIndex(0));
}
// This function is called when the Cayenne widget requests data for the Virtual Pin.
CAYENNE_OUT(VIRTUAL_PIN2)
{
  // To send the temperature in Fahrenheit use the corresponding code below.
  Cayenne.fahrenheitWrite(VIRTUAL_PIN2, thermistor.getFahrenheit());
}