maybe this gets you a bit closer to a solution based on your code and the state model above:
int led1Up = 2;
int led2Down = 3;
int buttonUp = 4;
int buttonDown = 6;
enum State {
MOVING_UP = 1 ,
MOVING_DOWN,
STOPPED
} state ;
boolean buttonPressed( byte buttonPin ) {
// with crude button debounce
if ( digitalRead( buttonPin ) == LOW ) {
delay( 500 ) ;
return true ;
}
else {
return false ;
}
}
void setup()
{
pinMode(buttonUp, INPUT_PULLUP);
pinMode(led1Up, OUTPUT);
pinMode(buttonDown, INPUT_PULLUP);
pinMode(led2Down, OUTPUT);
state = STOPPED ;
}
void loop()
{
static unsigned long upButtonPressedAtMs ;
static unsigned long downButtonPressedAtMs ;
// actions dependent on current state
if ( state == STOPPED ) {
digitalWrite( led1Up, false ) ;
digitalWrite( led2Down, false ) ;
}
else if ( state == MOVING_UP ) {
digitalWrite( led1Up, true ) ;
digitalWrite( led2Down, false ) ;
}
else if ( state == MOVING_DOWN ) {
digitalWrite( led1Up, false ) ;
digitalWrite( led2Down, true ) ;
}
// check if a state transition necessary
if ( state == MOVING_UP && millis() - upButtonPressedAtMs > 5000 ) {
state = STOPPED ;
}
if ( state == MOVING_UP && buttonPressed( buttonUp ) ) {
state = STOPPED ;
}
if ( state == MOVING_UP && buttonPressed( buttonDown ) ) {
downButtonPressedAtMs = millis() ;
state = MOVING_DOWN ;
}
if ( state == MOVING_DOWN && millis() - downButtonPressedAtMs > 5000 ) {
state = STOPPED ;
}
if ( state == MOVING_DOWN && buttonPressed( buttonDown ) ) {
state = STOPPED ;
}
if ( state == MOVING_DOWN && buttonPressed( buttonUp ) ) {
upButtonPressedAtMs = millis() ;
state = MOVING_UP ;
}
if ( state == STOPPED && buttonPressed( buttonUp ) ) {
upButtonPressedAtMs = millis() ;
state = MOVING_UP ;
}
if ( state == STOPPED && buttonPressed( buttonDown ) ) {
downButtonPressedAtMs = millis() ;
state = MOVING_DOWN ;
}
}