View Single Post
Old 08-09-14, 04:02 PM   #1
buffalobillpatrick
Master EcoRenovator
 
Join Date: Mar 2014
Location: Florissant, Colorado
Posts: 599
Thanks: 814
Thanked 59 Times in 55 Posts
Default Solar Differential Controller Arduino Code

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


Last edited by buffalobillpatrick; 08-09-14 at 10:44 PM..
buffalobillpatrick is offline   Reply With Quote
The Following User Says Thank You to buffalobillpatrick For This Useful Post:
where2 (08-09-14)