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(){ val=digitalRead(ZwavePin); // read the input pin 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; int state = digitalRead(ZwavePin); 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.