EcoRenovator  

Go Back   EcoRenovator > Improvements > Solar Heating
Advanced Search
 


Blog 60+ Home Energy Saving Tips Recent Posts Search Today's Posts Mark Forums Read


 
 
Thread Tools Display Modes
Prev Previous Post   Next Post Next
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)
 


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -5. The time now is 07:03 PM.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2024, vBulletin Solutions Inc.
Ad Management by RedTyger
Inactive Reminders By Icora Web Design