const byte PinMotorUp   = 12;
const byte PinMotorDown = 11;
const byte PinLedUp     = 13;
const byte PinLedDown   = 10;
const byte PinBut       = A3;
enum { LedOff   = HIGH, LedOn   = LOW };
enum { MotorOff = HIGH, MotorOn = LOW };
enum { DoorDown, DoorUp };
int doorPos = DoorDown;
enum { S_Idle, S_Raise, S_Lower };
int state = S_Idle;
const int DistanceUp   = 30;
const int DistanceDown =  0;
// -----------------------------------------------------------------------------
int
getDistance ()
{
    int dist = analogRead (A0);
    Serial.println (dist);
    delay  (1000);
    return dist;
}
// -----------------------------------------------------------------------------
void
loop (void)
{
    switch (state)  {
    case S_Idle:
        digitalWrite  (PinMotorDown, MotorOff);
        digitalWrite  (PinMotorUp,   MotorOff);
        if (LOW == digitalRead (PinBut))  {
            if (DoorDown == doorPos)  {
                state = S_Raise;
                digitalWrite   (PinMotorUp, MotorOn);
                digitalWrite   (PinLedDown,  LedOff);
                Serial.println ("Raise Door");
            }
            else {
                state = S_Lower;
                digitalWrite   (PinMotorDown, MotorOn);
                digitalWrite   (PinLedUp,    LedOff);
                Serial.println ("Lower Door");
            }
        }
        break;
    case S_Raise:
        if (DistanceUp <= getDistance ())  {
            state = S_Idle;
            doorPos = DoorUp;
            digitalWrite (PinLedUp, LedOn);
            Serial.println ("Door Up");
        }
        break;
    case S_Lower:
        if (DistanceDown >= getDistance ())  {
            state = S_Idle;
            doorPos = DoorDown;
            digitalWrite (PinLedDown, LedOn);
            Serial.println ("Door Down");
        }
        break;
    }
}
// -----------------------------------------------------------------------------
void
setup (void)
{
    Serial.begin (9600);
    digitalWrite  (PinMotorUp,   MotorOff);
    digitalWrite  (PinMotorDown, MotorOff);
    pinMode       (PinMotorUp,   OUTPUT);
    pinMode       (PinMotorDown, OUTPUT);
    digitalWrite  (PinLedUp,     LedOff);
    digitalWrite  (PinLedDown,   LedOff);
    pinMode       (PinLedUp,     OUTPUT);
    pinMode       (PinLedDown,   OUTPUT);
    pinMode       (PinBut,       INPUT_PULLUP);
    if (DistanceDown >= getDistance ())  {
        digitalWrite  (PinLedDown,   LedOn);
        doorPos = DoorDown;
        Serial.println ("Door Down");
    }
    else if (DistanceUp <= getDistance ())  {
        digitalWrite  (PinLedUp,     LedOn);
        doorPos = DoorUp;
        Serial.println ("Door Up");
    }
    else
        Serial.println ("Door partially open");
}