View Single Post
Old 02-17-15, 07:55 PM   #21
buffalobillpatrick
Master EcoRenovator
 
Join Date: Mar 2014
Location: Florissant, Colorado
Posts: 599
Thanks: 814
Thanked 59 Times in 55 Posts
Default

Mike, Is this a good EEV?

http://www.emersonclimate.com/Docume...d-Electric.pdf

PID with PWM for 6sec. for the above EEV looks pretty easy.

Use a SSR that can withstand millions of cycles.

I also stole this code:

Code:
/********************************************************
 * Arduino PID Relay Output Example
 * The output is going to digital pin 6 which is controlling
 * a relay.
 * The current temperature, PSI etc............ is read via pin A0
 * 
 * The pid Library is designed to only output an analog value,
 * but the relay can only be On/Off.
 *
 * To connect them together we use "time proportioning control"  
 * It's a really a long duration version of Pulse Width Modulation (PWM).
 * First we decide on a window size (6000mS say.) 6 seconds
 * We then set the pid to adjust its output between 0 and that window size.  
 * Lastly, we add some logic that translates the PID
 * output into "Relay On Time" with the remainder of the 
 * window being "Relay Off Time"
 ********************************************************/



#include <PID_v1.h>
#define RelayPin 6    //D6
#define T_pin   A0    //A0

//Define Variables we'll be connecting to
double Setpoint, Input, Output;

//Define the Tuning Parameters
double Kp=2, Ki=5, Kd=1;

//Specify the PID links
PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);

int WindowSize = 6000;          //6 sec

unsigned long windowStartTime;


void setup()
{
  windowStartTime = millis();    //get current time

  Setpoint = 100;                //Desired Temperature, PSI, etc................

  //tell the PID to range between 0 and the full window size
  myPID.SetOutputLimits(0, WindowSize);

  //turn the PID on
  myPID.SetMode(AUTOMATIC);
}
 
void loop()
{
  Input = analogRead(T_pin);  //Pass current temperature as Input to PID
  
  myPID.Compute();

  unsigned long now = millis();  //get now time
  
  if(now - windowStartTime > WindowSize)
  { //time to shift the Relay Window
    windowStartTime += WindowSize;
  }
  if(Output > now - windowStartTime) digitalWrite(RelayPin,HIGH);   //ON
  else digitalWrite(RelayPin,LOW);                                  //OFF

}

buffalobillpatrick is offline   Reply With Quote