// conveyor runs
// bucket breaks light beam
// conveyor stops
// water dispenses for 5 sec
// conveyor starts again
// -repeat-
const int senseWaterStn = 3;  // Sensor pin (IR sensor, water station)
const int drive         = 7;  // conveyor belt
const int waterfill     = 11; // Water valve pin (water fill station) / relay 1
const int PinRunLed     = 13;
const unsigned long MsecWaterFill = 5000;
      unsigned long msecWater;
enum { DriveOff = LOW,  DriveOn = HIGH };
enum { WaterOff = LOW,  WaterOn = HIGH };
enum { LedOff   = LOW,  LedOn   = HIGH };
enum { Idle, Stop, Start, Move, Fill };
int    state = Idle;
// -----------------------------------------------------------------------------
void setup () {
    Serial.begin(9600);
    pinMode     (senseWaterStn, INPUT_PULLUP);
    pinMode      (drive,        OUTPUT);
    pinMode      (waterfill,    OUTPUT);
    pinMode      (PinRunLed,    OUTPUT);
    pinMode      (PinRunLed,    LedOff);
    state = Stop;
    Serial.println ("ready");
}
// -----------------------------------------------------------------------------
void loop ()
{
    unsigned long msec = millis ();
    // monitor serial interfae
    if (Serial.available ())  {
        switch (Serial.read ())  {
        case 'r':           // need to enter 'r' to run
            state = Start;
            break;
        case '\n':          // catch newline
            break;
        default:            // any key stops
            state = Stop;
            break;
        }
    }
    // state machine
    switch (state)  {
    case Idle:      // do nothing
        break;
    case Stop:
        Serial.println (" STOP");
        digitalWrite (waterfill, WaterOff);
        digitalWrite (drive,     DriveOff);
        digitalWrite (PinRunLed, LedOff);
        state = Idle;
        break;
    case Start:
        Serial.println ("start conveyor");
        digitalWrite (PinRunLed, LedOn);
        digitalWrite (drive,     DriveOn);
        state =  Move;
        break;
    case Move:
        if (digitalRead(senseWaterStn) == LOW)  {
            Serial.println ("water station sensor broken - water fill on");
            digitalWrite (drive,     DriveOff);
            digitalWrite (waterfill, WaterOn);
            msecWater = msec;
            state     = Fill;
        }
        break;
    case Fill:
        if (msec - msecWater >= MsecWaterFill)  {
            Serial.println ("water time-out - water fill off, conveyor on");
            digitalWrite (waterfill, WaterOff);
            digitalWrite (drive,     DriveOn);
            state     = Move;
        }
        break;
    }
}