Code:
/********************************************************
*
* ARDUINO SOLAR Differential Controller.
*
* In Setup: Read & Display the 2x Control Pots:
* ON_DELTA & OFF_DELTA
*
* In Forever Loop: Read & display 2x 10K NTC Sensors:
* PANEL_TEMP & TANK_TEMP
*
* If Pump is ON:
* If (PANEL_TEMP - OFF_DELTA) is less than or = TANK_TEMP
* or TANK_TEMP is greater than or = TANK_MAX_TEMP
* Then Turn Pump & LED OFF and set PUMP_BOOL to false
*
* Else Pump is OFF:
* If (PANEL_TEMP - ON_DELTA) is greater than or = TANK_TEMP
* AND TANK_TEMP is Less than or = TANK_MAX_TEMP
* Then Turn Pump & LED ON and set PUMP_BOOL to true
*
* Next display PUMP_BOOL status: 0 = OFF, 1 = ON
*
*
*
* INPUTS:
*
* Reset switch //Reset pin switched to Gnd & released
*
* ON_DELTA_POT //control pots
* OFF_DELTA_POT
*
* PANEL_sensor //2X 10K NTC Thermisters
* TANK_sensor
*
*
* OUTPUTS:
*
* LCD Display: Status & Progression through code
*
* PUMP_RLY
* PUMP_LED //LED Pin 13 on Arduino board
*
********************************************************/
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#define I2C_ADDR 0x3F // <<----- Add your address here. Find it from I2C Scanner
#define BACKLIGHT_PIN 3 //define LCD digital pins
#define En_pin 2
#define Rw_pin 1 //can't use D0 & D1 Tx Rx
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5 //can use 2 -> 12 below in code
#define D6_pin 6
#define D7_pin 7
LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
#define SDA A4 //RESERVE I2C for LCD
#define SCL A5
#define ON_DELTA_POT A0
#define OFF_DELTA_POT A1
#define PANEL_sensor A2
#define TANK_sensor A3
// D0 = RX, D1 = TX, reserved
// digital output pin relay control
#define PUMP_RLY 2
#define PUMP_LED 13
#define TANK_MAX_TEMP 160
int PANEL_TEMP;
int TANK_TEMP;
//int I;
int ON_DELTA;
int OFF_DELTA;
static bool PUMP_BOOL = false;
void setup(void)
{
pinMode (PUMP_RLY, OUTPUT);
pinMode (PUMP_LED, OUTPUT);
digitalWrite (PUMP_RLY, LOW); //OFF
digitalWrite (PUMP_LED, LOW); //OFF
pinMode (TANK_sensor, INPUT);
pinMode (PANEL_sensor, INPUT);
lcd.begin (16,2); // <<----- My LCD is 16x2
lcd.clear();
//Switch on the backlight
lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
lcd.setBacklight(HIGH);
lcd.clear();
lcd.home (); // go home
lcd.print(F("DIFFER-DUINO"));
lcd.setCursor(0,1);
lcd.print(F("1_0"));
delay(5000);
ON_DELTA = ((Read_10K_NTC (ON_DELTA_POT) / 10)); // 15
OFF_DELTA = ((Read_10K_NTC (OFF_DELTA_POT) / 50)); // 2
lcd.clear();
lcd.home (); // go home
lcd.print(F("ON DELTA = "));
lcd.print(ON_DELTA);
lcd.setCursor(0,1);
lcd.print(F("OFF DELTA = "));
lcd.print(OFF_DELTA);
delay(5000);
} //end setup
void loop ()
{
//read & display the 2 10K NTC Sensors
PANEL_TEMP = (Read_10K_NTC (PANEL_sensor));
TANK_TEMP = (Read_10K_NTC (TANK_sensor));
lcd.clear();
lcd.home (); // go home
lcd.print(F("PANEL TEMP="));
lcd.print(PANEL_TEMP);
lcd.setCursor(0,1);
lcd.print(F("TANK TEMP="));
lcd.print(TANK_TEMP);
delay(5000);
// If Pump is ON:
// If (PANEL_TEMP - OFF_DELTA) is less than or = TANK_TEMP
// or TANK_TEMP is greater than or = TANK_MAX_TEMP
// Then Turn Pump & LED OFF and set PUMP_BOOL to false
if ( PUMP_BOOL)
{
if ((( PANEL_TEMP - OFF_DELTA ) <= TANK_TEMP )
|| ( TANK_TEMP >= TANK_MAX_TEMP ))
{
digitalWrite (PUMP_RLY, LOW); //OFF
digitalWrite (PUMP_LED, LOW); //OFF
PUMP_BOOL =false;
}
}
// Else Pump is OFF:
// If (PANEL_TEMP - ON_DELTA) is greater than or = TANK_TEMP
// AND TANK_TEMP is Less Than or = TANK_MAX_TEMP
// Then Turn Pump & LED ON and set PUMP_BOOL to true
else if ((( PANEL_TEMP - ON_DELTA ) >= TANK_TEMP )
&& ( TANK_TEMP <= TANK_MAX_TEMP ) )
{
digitalWrite (PUMP_RLY, HIGH); //ON
digitalWrite (PUMP_LED, HIGH); //ON
PUMP_BOOL = true;
}
lcd.clear();
lcd.home (); // go home
lcd.print(F("PUMP = "));
lcd.print(PUMP_BOOL);
delay(5000);
} //end forever loop
int Read_10K_NTC (int which_sensor)
{
#define sample_cnt 30
float alpha = 0.9; // factor to tune
float average = 0.0;
float steinhart;
int I;
// resistance at 25 degrees C
#define THERMISTORNOMINAL 10000
// TEMP. for nominal resistance (almost always 25 C)
#define TEMPERATURENOMINAL 25
// The beta coefficient of the thermistor (usually 3000-4000)
#define BCOEFFICIENT 3892
// the value of the series resistor
#define SERIESRESISTOR 10000
for (I=0; I< sample_cnt; I++)
{
average = alpha * analogRead(which_sensor) + (1-alpha) * average;
delay(10);
}
// convert the value to resistance
average = 1023 / average - 1;
average = SERIESRESISTOR / average;
steinhart = average / THERMISTORNOMINAL; // (R/Ro)
steinhart = log(steinhart); // ln(R/Ro)
steinhart /= BCOEFFICIENT; // 1/B * ln(R/Ro)
steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To)
steinhart = 1.0 / steinhart; // Invert
steinhart -= 273.15; // convert to C
return (round(steinhart * 1.8) + 32); // round to whole number
// & convert to F
} // end of Read_10K_NTC