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
}