// Motor 1 control pins
const int motor1ForwardPin = 14;
const int motor1BackwardPin = 13;
// Motor 2 control pins
const int motor2ForwardPin = 19;
const int motor2BackwardPin = 17;
// Stop buttons
const int stop1ForwardPin = 26;
const int stop1BackwardPin = 27;
const int stop2ForwardPin = 23;
const int stop2BackwardPin = 22;
// Shared Run-once button
const int runOncePin = 2;
// Duration arrays (ms)
unsigned int durations1[] = {1000, 2000, 3000, 4000};
unsigned int durations2[] = {1500, 2500, 3500, 4500};
// Motor state tracking
bool motor1Running = false;
bool motor2Running = false;
bool motor1Direction = false;
bool motor2Direction = false;
unsigned long motor1EndTime = 0;
unsigned long motor2EndTime = 0;
// Button press tracking
bool runOncePressed = false;
void setup() {
Serial.begin(115200);
// Motor pins
pinMode(motor1ForwardPin, OUTPUT);
pinMode(motor1BackwardPin, OUTPUT);
pinMode(motor2ForwardPin, OUTPUT);
pinMode(motor2BackwardPin, OUTPUT);
// Stop buttons
pinMode(stop1ForwardPin, INPUT);
pinMode(stop1BackwardPin, INPUT);
pinMode(stop2ForwardPin, INPUT);
pinMode(stop2BackwardPin, INPUT);
// Run-once button
pinMode(runOncePin, INPUT_PULLUP);
// Start with motors off
stopMotor1();
stopMotor2();
}
void loop() {
// Stop logic for Motor 1
if (motor1Running) {
if (digitalRead(stop1ForwardPin) == HIGH && motor1Direction == false) {
stopMotor1();
Serial.println("Motor 1 stopped by Forward Button");
}
if (digitalRead(stop1BackwardPin) == HIGH && motor1Direction == true) {
stopMotor1();
Serial.println("Motor 1 stopped by Backward Button");
}
}
// Stop logic for Motor 2
if (motor2Running) {
if (digitalRead(stop2ForwardPin) == HIGH && motor2Direction == false) {
stopMotor2();
Serial.println("Motor 2 stopped by Forward Button");
}
if (digitalRead(stop2BackwardPin) == HIGH && motor2Direction == true) {
stopMotor2();
Serial.println("Motor 2 stopped by Backward Button");
}
}
// Shared Run-once trigger
if (digitalRead(runOncePin) == LOW && !runOncePressed && !motor1Running && !motor2Running) {
runOncePressed = true;
startMotor1();
startMotor2();
}
// Reset trigger when button is released
if (digitalRead(runOncePin) == HIGH) {
runOncePressed = false;
}
// Auto-stop Motor 1
if (motor1Running && millis() >= motor1EndTime) {
stopMotor1();
Serial.println("Motor 1 stopped (Time Expired)");
}
// Auto-stop Motor 2
if (motor2Running && millis() >= motor2EndTime) {
stopMotor2();
Serial.println("Motor 2 stopped (Time Expired)");
}
}
// Motor 1 control
void startMotor1() {
motor1Direction = random(0, 2);
unsigned int duration = durations1[random(0, 4)];
if (motor1Direction == false) {
Serial.println("Motor 1 moving FORWARD");
digitalWrite(motor1ForwardPin, HIGH);
digitalWrite(motor1BackwardPin, LOW);
} else {
Serial.println("Motor 1 moving BACKWARD");
digitalWrite(motor1ForwardPin, LOW);
digitalWrite(motor1BackwardPin, HIGH);
}
motor1Running = true;
motor1EndTime = millis() + duration;
}
void stopMotor1() {
digitalWrite(motor1ForwardPin, LOW);
digitalWrite(motor1BackwardPin, LOW);
motor1Running = false;
}
// Motor 2 control
void startMotor2() {
motor2Direction = random(0, 2);
unsigned int duration = durations2[random(0, 4)];
if (motor2Direction == false) {
Serial.println("Motor 2 moving FORWARD");
digitalWrite(motor2ForwardPin, HIGH);
digitalWrite(motor2BackwardPin, LOW);
} else {
Serial.println("Motor 2 moving BACKWARD");
digitalWrite(motor2ForwardPin, LOW);
digitalWrite(motor2BackwardPin, HIGH);
}
motor2Running = true;
motor2EndTime = millis() + duration;
}
void stopMotor2() {
digitalWrite(motor2ForwardPin, LOW);
digitalWrite(motor2BackwardPin, LOW);
motor2Running = false;
}