//renamed some vars from really old english..
//i understood it though.. :)
const int BTN_RETRACT = 5; //retract button
const int BTN_EXTEND = 6;// extend button
const int SEN_MIDDLE = 7;//middle sensor
const int LIN_ACT = 3;//linear activator
const int CTL_DIRECTION = 12;//was sens
#define STATE_RET 1
#define STATE_EXT 2
#define STATE_MID 3
#define STATE_STOP 4
//vars to track samples
bool Retract = false;
bool Extend = false;
bool InMiddle = false;
//0=before 1=at 2=after
byte MidPosition = 0;
int lastState = 0;
//millis from last sample
unsigned long lastSample = 0;
//sampling rate in millis
int SampleRate = 100;
void setup() {
// Serial.begin(115200);
pinMode (BTN_RETRACT, INPUT);
pinMode (BTN_EXTEND, INPUT);
pinMode (SEN_MIDDLE, INPUT);
pinMode (LIN_ACT, OUTPUT);
pinMode (CTL_DIRECTION, OUTPUT);
lastState = 3 ;//start in middle
// Serial.println("Ready..");
}
void SampleInputs()
{
unsigned long currMilli = millis();
if (currMilli-lastSample>=SampleRate)
{
lastSample = currMilli;
Retract = digitalRead(BTN_RETRACT);
Extend = digitalRead(BTN_EXTEND);
InMiddle = digitalRead(SEN_MIDDLE);
if (InMiddle){
MidPosition = 1;
}else {
switch (lastState){
case STATE_RET: MidPosition = 0;break;
case STATE_EXT: MidPosition = 2;break;
}
}
}
}
void loop() {
SampleInputs();
int newState;
if ((Retract&&Extend)||(!Retract&&!Extend)){
newState = STATE_MID;
}else
if (Retract){
newState = STATE_RET;
} else
if (Extend){
newState = STATE_EXT;
}
//if we're moving to mid and we're there, STOP
if (newState==STATE_MID && InMiddle) newState = STATE_STOP;
lastState = newState;
switch (lastState) {
case STATE_RET: //retract
// Serial.println("Retracting");
digitalWrite(CTL_DIRECTION, LOW);
analogWrite(LIN_ACT, 255);
break;
case STATE_EXT: //extend
// Serial.println("Extending");
digitalWrite(CTL_DIRECTION, HIGH);
analogWrite(LIN_ACT, 255);
break;
case STATE_MID: //go middle
// Serial.println("Middle");
if (MidPosition==0)
{digitalWrite(CTL_DIRECTION, HIGH);}
else
{digitalWrite(CTL_DIRECTION, HIGH);}
analogWrite(LIN_ACT, 255);
break;
case STATE_STOP: //stop
// Serial.println("Stop");
digitalWrite(CTL_DIRECTION, LOW);
analogWrite(LIN_ACT, 0);
break;
}
// delay(1000); used for debuging slows the serial prints down..
}