Thanks a lot for the help, guys. Here's the resulting code I have, I guess you can call it a "latch timer" or whatever. I know it's not pretty, but it works. I'm working on building the code for channel 3+, I'm sure there's a way to do this with arrays or something that would probably do the same thing in like 5 lines of code or something, oh well.
int buttonState1;
int buttonState2;
int buttonState3;
int buttonState4;
int buttonState20;
int lastButtonState1;
int lastButtonState2;
int lastButtonState3;
int lastButtonState4;
int lastButtonState20;
unsigned long startTime1;
unsigned long startTime2;
unsigned long startTime3;
unsigned long startTime4;
unsigned long startTime20;
#define relay1Pin 13 // the number of the relay pin
#define relay2Pin 12
#define relay3Pin 11
#define relay4Pin 10
#define relay20Pin 19
int relayState1 = LOW; // relayState used to evaluate relay
int relayState2 = LOW;
int relayState3 = LOW;
int relayState4 = LOW;
int relayState20 = LOW;
long interval = 5000; // interval for which to hold relay "HIGH" (milliseconds) (1 hour=3600 milliseconds)
void setup() {
pinMode(relay1Pin, OUTPUT);
pinMode(relay2Pin, OUTPUT);
pinMode(relay3Pin, OUTPUT);
pinMode(relay4Pin, OUTPUT);
pinMode(relay20Pin, OUTPUT);
pinMode(A0, INPUT);
pinMode(A1, INPUT);
pinMode(A2, INPUT);
pinMode(A3, INPUT);
pinMode(51, INPUT);
digitalWrite(A0, HIGH); // set pullup on analog pin A0
digitalWrite(A1, HIGH);
digitalWrite(A2, HIGH);
digitalWrite(A3, HIGH);
digitalWrite(50, HIGH);
digitalWrite(13, LOW);
digitalWrite(12, LOW);
digitalWrite(11, LOW);
digitalWrite(10, LOW);
digitalWrite(19, LOW);
}
void loop()
{
//-------------------------------------------------------------------------------------------------------------------------------------------------
// check for button press (1)
buttonState1 = digitalRead(A0); // read the button state and store
relayState1 = digitalRead(relay1Pin);
if (buttonState1 == LOW && lastButtonState1 == HIGH && relayState1 == LOW){ // check for a high to low transition
// if true then found a new button press while clock is not running - start the clock
startTime1 = millis(); // store the start time
delay(10); // short delay to debounce switch
digitalWrite(relay1Pin, HIGH);
lastButtonState1 = buttonState1; // store buttonState in lastButtonState, to compare next time
}
else if (buttonState1 == LOW && lastButtonState1 == HIGH && relayState1 == HIGH){ // check for a high to low transition
// if true then found a new button press while clock is running - stop the clock and report
digitalWrite(relay1Pin, LOW);
lastButtonState1 = buttonState1; // store buttonState in lastButtonState, to compare next time
}
else{
lastButtonState1 = buttonState1; // store buttonState in lastButtonState, to compare next time
}
if ( (millis() - startTime1 > interval) ) {
if (relayState1 == HIGH){
// if the LED is off turn it on and vice-versa.
if (relayState1 == HIGH)
relayState1 = LOW;
else
relayState1 = LOW;
digitalWrite(relay1Pin, relayState1);
}
else{
digitalWrite(relay1Pin, LOW); // turn off LED when not blinking
}
}
//----------------------------------------------------------------------------------------------------------------------------------------------------
// check for button press (2)
buttonState2 = digitalRead(A1);
relayState2 = digitalRead(relay2Pin);
if (buttonState2 == LOW && lastButtonState2 == HIGH && relayState2 == LOW){
startTime2 = millis();
delay(10);
digitalWrite(relay2Pin, HIGH);
lastButtonState2 = buttonState2;
}
else if (buttonState2 == LOW && lastButtonState2 == HIGH && relayState2 == HIGH){
digitalWrite(relay2Pin, LOW);
lastButtonState2 = buttonState2;
}
else{
lastButtonState2 = buttonState2;
}
if ( (millis() - startTime2 > interval) ) {
if (relayState2 == HIGH){
if (relayState2 == HIGH)
relayState2 = LOW;
else
relayState2 = LOW;
digitalWrite(relay2Pin, relayState2);
}
else{
digitalWrite(relay2Pin, LOW);
}
}
//----------------------------------------------------------------------------------------------------------------------------------------------------
// check for button press (3)
buttonState3 = digitalRead(A2);
relayState3 = digitalRead(relay3Pin);
if (buttonState3 == LOW && lastButtonState3 == HIGH && relayState3 == LOW){
startTime3 = millis();
delay(10);
digitalWrite(relay3Pin, HIGH);
lastButtonState3 = buttonState3;
}
else if (buttonState3 == LOW && lastButtonState3 == HIGH && relayState3 == HIGH){
digitalWrite(relay3Pin, LOW);
lastButtonState3 = buttonState3;
}
else{
lastButtonState3 = buttonState3;
}
if ( (millis() - startTime3 > interval) ) {
if (relayState3 == HIGH){
if (relayState3 == HIGH)
relayState3 = LOW;
else
relayState3 = LOW;
digitalWrite(relay3Pin, relayState3);
}
else{
digitalWrite(relay3Pin, LOW);
}
}
//----------------------------------------------------------------------------------------------------------------------------------------------------
}