byte limitswitch = 3; // wired: PIN .. SWITCH (N.O.) .. GND
byte forward = 14, reverse = 15; // DC motor direction
int pausetime = 5; // seconds
bool direction; // choose DC motor start direction 0 becomes forward
unsigned long timer, timeout = 500; // LED_BUILTIN BLINK
void setup() {
Serial.begin(115200); // start Serial communication
pinMode(limitswitch, INPUT_PULLUP); // both limit switches HIGH = released, LOW = pressed
pinMode(forward, OUTPUT); // DC motor driver forward
pinMode(reverse, OUTPUT); // DC motor driver reverse
pinMode(LED_BUILTIN, OUTPUT); // notification LED
Serial.print("Waiting for limit switch. ");
while (digitalRead(limitswitch)) { // wait for limit switch
blink();
}
}
void loop() {
if (digitalRead(limitswitch) == 0) { // LOW = WAS PRESSED
delay(200); // debounce switch to stay in if()
Serial.print("Limit switch detected. ");
direction = !direction; // change motor drive direction
scoot(direction); // move away from limit switch
while (digitalRead(limitswitch) == 0) { // if switch is PRESSED
if (direction) // forward
driveforward();
else // reverse
drivereverse();
}
stop(); // stop the scoot
pause(pausetime);
drivemotor(direction); // continue moving
}
blink(); // heartbeat
}
void blink() {
if (millis() - timer >= timeout) {
timer = millis();
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
}
}
void pause(int seconds) {
digitalWrite(LED_BUILTIN, HIGH); // LED ON - start pausing
Serial.print("Pausing ");
Serial.print(seconds);
Serial.print(" seconds: ");
for (int i = 0; i < seconds + 1; i++) {
Serial.print(i); // display second
delay(1000); // counti down seconds
}
digitalWrite(LED_BUILTIN, LOW); // LED OFF - finished pausing
}
void drivemotor(bool dir) {
Serial.print(". DC motor drive ");
Serial.print(dir ? "forward" : "reverse");
if (dir) // check direction
driveforward();
else
drivereverse();
Serial.print(".\nWaiting for limit switch. ");
}
void driveforward() {
digitalWrite(forward, HIGH); // forward
digitalWrite(reverse, LOW); // stop
}
void drivereverse() {
digitalWrite(forward, LOW); // stop
digitalWrite(reverse, HIGH); // reverse
}
void stop() {
Serial.println(" (stop)");
digitalWrite(forward, LOW); // stop
digitalWrite(reverse, LOW); // stop
}
void scoot(bool dir) { // move away from limit switch until it is RELEASED
Serial.print("(scoot ");
if (dir) { // forward
Serial.print("fwd)");
driveforward();
} else {
Serial.print("rev)");
drivereverse();
}
}REV
FWD
DC MOTOR DRIVER
LIMIT SWITCHES
(one pin)