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");
}