# Newbie timer question

• I'm new at arduino programming and I'm sure this will be obvious to most of you. I am trying to create a sketch that will control 2 relays based on the pin state of pin 2 for example.

So when pin 2 is HIGH relay 1 should turn on x seconds later relay 2 should turn on.

When pin 2 goes LOW I want relay 1 to turn off and x seconds later I want relay 2 to turn off.

So far I have no problem getting relay 1 to turn on and after x seconds relay 2 to turn on.

My confusion begins here. Right now both relays turn off when pin 2 goes low because both were turned on by an if then else under the condition pin 2 is HIGH.

Can you give me ideas conceptually how to approach this? I'm not asking you to code it just to give me some ideas on how to approach the problem.

Thanks!

``````
const int ZwavePin = 2; // controlled by zwave relay to turn fireplace on or off
const int FirePin = 7; // turns on gas
const int FanPin = 8; // turns on fan
float val;
//float voltage;
long previousMillis = 0;
long currentMillis;

void setup(){
Serial.begin(9600);

//initialize the fan and fire pins as an output:
pinMode(FirePin, OUTPUT);
pinMode(FanPin, OUTPUT);
pinMode(ZwavePin, INPUT);
digitalWrite(FirePin, LOW);
digitalWrite(FanPin, LOW);
// digitalWrite(ZwavePin, LOW);
}

void loop(){

if (val == HIGH){
digitalWrite(FirePin, LOW);    // sets the firepin to low to turn on gas
unsigned long currentMillis = millis();
Serial.print("Fire has been on for ");
Serial.println(currentMillis);

if (currentMillis > 5000)
digitalWrite(FanPin, LOW);    // sets the fanpin to low to turn on fan
}
else
{
digitalWrite(FirePin, HIGH);
digitalWrite(FanPin, HIGH);
}

``````

• I think it may be easier for you to look at timer library in arduino ide, also it could be better to use the interrupt to detect change state on the input and make it easier to calculate intervals

• @scottdube If your code is allowed to block during the wait, the implementation can be very straightforward (untested):

``````// ...setup etc...

void loop()
{
static int prevState = LOW;
if (state != prevState)
{
// ZWavePin state has changed
// Determine target state of relay
const int pinState = (state == HIGH) ? LOW : HIGH;
// Set Fire relay
digitalWrite(FirePin, pinState);
// Wait some ms
delay(5000);
// Set Fan relay
digitalWrite(FanPin, pinState);
// Remember current  ZWavePin state to be able to detect changes
prevState = state;
}
}
``````

As your description doesn't mention the source of the ZWavePin, it might require debouncing if it is a mechanical switch.

5

5

3

2

8

13

14

58