Wednesday, May 4, 2011

Dual water tank heater thermostat

I am just finishing up a project at work, which requires two water tanks to be maintained at 180F. Each tank has twin 1500 watt, 240vac heating elements, each controlled by a SSR (Solid State Relay). My Arduino Mega 2560 reads two DS18B20 temp sensors (one in each tank), and maintains the temperature with a 5 degree window. I display both tank temperatures on a LCD, and control the color of two RGB LED's, blue for under temp, green for correct temp, red for over temp. The photo's are here. The following is the working code for the project.

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>

// Connections:
// rs (LCD pin 4) to Arduino pin 12
// rw (LCD pin 5) to Arduino pin 11
// enable (LCD pin 6) to Arduino pin 10
// LCD pin 15 to Arduino pin 13
// LCD pins d4, d5, d6, d7 to Arduino pins 5, 4, 3, 2
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);

int tank1BLED = 37;
int tank1GLED = 39;
int tank1RLED = 41;
int tank2BLED = 43;
int tank2GLED = 45;
int tank2RLED = 47;

// Data wire is plugged into pin 8 on the Arduino
#define ONE_WIRE_BUS 8

// Setup a oneWire instance to 
//communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

// Assign the addresses of your 1-Wire temp sensors.

DeviceAddress tank2Thermometer = { 0x28, 0x46, 0x3C, 0x16, 0x03, 0x00, 0x00, 0xA9 };
DeviceAddress tank1Thermometer = { 0x28, 0xDF, 0x21, 0x16, 0x03, 0x00, 0x00, 0x1E };

int tank1 = 31; // heater control pins
int tank2 = 33; // heater control pins

float tank1temp = 0;
float tank2temp = 0;

void setup(void)
  // Start up the library
  // set the resolution to 10 bit (good enough?)
  sensors.setResolution(tank1Thermometer, 10);
  sensors.setResolution(tank2Thermometer, 10);
  pinMode(tank1BLED, OUTPUT); // Tank LED's
  pinMode(tank1GLED, OUTPUT);
  pinMode(tank1RLED, OUTPUT);
  pinMode(tank2BLED, OUTPUT);
  pinMode(tank2GLED, OUTPUT);
  pinMode(tank2RLED, OUTPUT);
  digitalWrite(tank1BLED, HIGH); // set Tank LED's off
  digitalWrite(tank1GLED, HIGH);
  digitalWrite(tank1RLED, HIGH);
  digitalWrite(tank2BLED, HIGH);
  digitalWrite(tank2GLED, HIGH);
  digitalWrite(tank2RLED, HIGH);

// columns, rows. use 16,2 for a 16x2 LCD, etc.
// start with a blank screen

pinMode(tank1, OUTPUT); // Tank heaters
pinMode(tank2, OUTPUT);


void printTemperature(DeviceAddress deviceAddress)
  float tempC = sensors.getTempC(deviceAddress);
  float t1tempC = sensors.getTempC(tank1Thermometer);
  float t2tempC = sensors.getTempC(tank2Thermometer);
  if (tempC == -127.00) {
} else {
// lcd.print(tempC);
// lcd.print("/");
tank1temp = (DallasTemperature::toFahrenheit(t1tempC));
tank2temp = (DallasTemperature::toFahrenheit(t2tempC));

void loop(void)

lcd.print("Tank 1: ");


lcd.print("Tank 2: ");


if (tank1temp <=178.9)
  digitalWrite(tank1, HIGH);
  digitalWrite(tank1BLED, LOW);
  digitalWrite(tank1GLED, HIGH);
  digitalWrite(tank1RLED, HIGH);

if (tank1temp >= 179 && tank1temp <= 181.9)

  digitalWrite(tank1GLED, LOW);
  digitalWrite(tank1RLED, HIGH);
  digitalWrite(tank1BLED, HIGH);

if (tank1temp >= 182)
  digitalWrite(tank1, LOW);
  digitalWrite(tank1RLED, LOW);
  digitalWrite(tank1GLED, HIGH);
  digitalWrite(tank1BLED, HIGH);

if (tank2temp <=178.9)
  digitalWrite(tank2, HIGH);
  digitalWrite(tank2BLED, LOW);
  digitalWrite(tank2GLED, HIGH);
  digitalWrite(tank2RLED, HIGH);

if (tank2temp >= 179 && tank2temp <= 181.9)

  digitalWrite(tank2GLED, LOW);
  digitalWrite(tank2RLED, HIGH);
  digitalWrite(tank2BLED, HIGH);

if (tank2temp >= 182)
  digitalWrite(tank2, LOW);
  digitalWrite(tank2RLED, LOW);
  digitalWrite(tank2GLED, HIGH);
  digitalWrite(tank2BLED, HIGH);



  1. Is there any reason this could not be done on an Arduino UNO? I'm wondering why you chose to run on a mega.

  2. It's a nice build, I'd like to do something similar but for a room heater. I especially like the idea of using colored LEDs to quickly see them temp. Maybe I'll borrow some code if you don't mind. My LCD only uses 4 pins and I don't need 2 heating elements so my UNO should work.

  3. This also works well for heating a fish tank, just limit the temperatures in the two variables, tank1temp and tank2temp.

  4. For extra credit, try a PID controller.

  5. Thanks for sharing your project with us. It can help.

    Heating and Cooling Vaughan

  6. Thanks for sharing such an amazing article. It helps me with the thermostat.

    Heating and Cooling Richmond Hill


Related Posts Plugin for WordPress, Blogger...