Making a Servo spin for set amount of time

consider (a bit involved than i expected)
(Capitalize constant)

#include <Servo.h>

Servo Servo1;


const byte LedTimeout = 12;
const byte LedActive  = 13;

const int SensorPin = A0;
const int ServoPin  = 3;

const unsigned long MsecOn   = 3000;    // a few seconds
const unsigned long MsecOff  = 10000;   // change to a few minutes

int   pos           = 1500;
int   posStop       = 1400;

float sensorValue   = 0;
const int  Tval     = 10;

enum { ST_IDLE, ST_ACTIVE, ST_TIMEOUT };
int state = ST_IDLE;

unsigned long msecLst;

enum { Off = HIGH, On = LOW };

// -----------------------------------------------------------------------------
void loop () {
    unsigned long msec = millis ();

    sensorValue += (analogRead (SensorPin) - sensorValue) / 100;
    Serial.println (sensorValue);

    switch (state)  {
    case ST_IDLE:
        if (sensorValue > Tval) {
            Servo1.write (pos);
            digitalWrite (LedActive, On);
            state   = ST_ACTIVE;
            msecLst = msec + MsecOn;
        }
        break;
        
    case ST_ACTIVE:
        if (msec > msecLst)  {
            Servo1.write (posStop);
            digitalWrite (LedActive,  Off);
            digitalWrite (LedTimeout, On);
            msecLst = msec + MsecOff;
            state   = ST_TIMEOUT;
        }
        break;
        
    case ST_TIMEOUT:
        if (msec > msecLst)  {
            digitalWrite (LedTimeout, Off);
            state = ST_IDLE;
        }
        break;
    }
}

// -----------------------------------------------------------------------------
void setup () {
    Serial.begin (9600);

    pinMode      (LedTimeout, OUTPUT);
    digitalWrite (LedTimeout, Off);

    pinMode      (LedActive,  OUTPUT);
    digitalWrite (LedActive,  Off);

    Servo1.attach (ServoPin);
}
1 Like