XE TECH - Arduino Singapore



Water Tank Heating Temperature Control 

Control Functions


 Water tank is heated by a 800W heating rod. Power is always kept on. Water temperature needs to maintain at about 50 degC.


Hardware Required


  • Arduino Board
  • Breadboard
  • Terminal Block
  • 2 Channel Relay
  • DC 5V Power Supply Unit
  • Heating Rod
  • Temperature Sensor DS18B20 (waterproof)


Challenges


Sensor and heating rod installation inside the water tank. Water resistant housing and connections. 


Highlights


Temperature Sensor power supply is best to be from separate source. Drawing power directly from arduino would affect the temperature readings. 


Code


#include <OneWire.h>


int DS18S20_Pin = 2; //DS18S20 Signal pin on digital 2
// int pinNumber = 3 //output relay
//Temperature chip i/o
OneWire ds(DS18S20_Pin); // on digital pin 8
const float baselineTemp = 40.0;  //units in degC.

//set the baseline temperature a bit lower than the temperature you want in your water tank, because heat needs time to travel from the heating rod to the sensor location. You get delayed response. And the resulting temperature in the water tank is about 50degC. The result might differ with various ambient temperatures.
void setup(void) {
Serial.begin(9600);
pinMode(3, OUTPUT);
digitalWrite(3, HIGH);
float temperature = getTemp();
delay (1000);
temperature = getTemp();
delay (1000);
temperature = getTemp();
delay (1000);
temperature = getTemp();
delay (1000);
temperature = getTemp();
delay (1000);
}


void loop(void) {
float temperature = getTemp();
Serial.print("DegC = ");
Serial.println(temperature);


delay(1000); //just here to slow down the output so it is easier to read




// if the current temperature is lower than the baseline
// turn on heater


if (temperature < baselineTemp) {
digitalWrite(3, HIGH);
Serial.print("heating = ");
Serial.println(digitalRead (3));
} // if the temperature is higher tham baseline tempreture
//turn off heater.
else if (temperature >= baselineTemp) {
digitalWrite(3, LOW);
Serial.print("heating = ");
Serial.println(digitalRead (3));
delay(10000); //cool down time 10 second. After 10 seconds, if the water is still over baseline temperature, it will delay another 10 sec, it goes on and on, until the temperature eventually drops below baseline temperature.
}
}
float getTemp() {
//returns the temperature from one DS18S20 in DEG Celsius


byte data[12];
byte addr[8];


if ( !ds.search(addr)) {
//no more sensors on chain, reset search
ds.reset_search();
return -1000;
}


if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
return -1000;
}


if ( addr[0] != 0x10 && addr[0] != 0x28) {
Serial.print("Device is not recognized");
return -1000;
}


ds.reset();
ds.select(addr);
ds.write(0x44, 1); // start conversion, with parasite power on at the end


byte present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad



for (int i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
}


ds.reset_search();


byte MSB = data[1];
byte LSB = data[0];


float tempRead = ((MSB << 8) | LSB); //using two's compliment
float TemperatureSum = tempRead / 16;


return TemperatureSum;


}


Download

OneWire.zip (Version 2.2)


Make a Free Website with Yola.