// Motor control pins
const int LEFT = 5;
const int RIGHT = 2;
const int UP = 17;
const int DOWN = 18;
const int LED_BUILTIN = 12;
// Button pins
const int RandomButton = 4;
const int StopLEFT = 15;
const int StopRIGHT = 16;
const int StopUP = 13;
const int StopDOWN = 14;
// Time arrays (ms)
unsigned int durations1[] = {1000, 2000, 3000, 4000}; // Motor1
unsigned int durations2[] = {1000, 2000, 3000, 4000}; // Motor2
// Motor states
struct Motor {
bool isRunning;
bool direction; // false=forward, true=backward
unsigned long endTime;
};
Motor motor1 = {false, false, 0};
Motor motor2 = {false, false, 0};
void setup() {
// Motor pins
pinMode(LEFT, OUTPUT);
pinMode(RIGHT, OUTPUT);
pinMode(UP, OUTPUT);
pinMode(DOWN, OUTPUT);
pinMode(LED_BUILTIN, OUTPUT);
// Button pins
pinMode(RandomButton, INPUT);
pinMode(StopLEFT, INPUT);
pinMode(StopRIGHT, INPUT);
pinMode (StopUP, INPUT);
pinMode(StopDOWN, INPUT);
}
void loop() {
randomButton();
}
void randomButton(){
// Check trigger button
if (digitalRead(RandomButton)) {
delay(5); // Debounce
while (digitalRead(RandomButton)); // Wait release
startRandomRun(&motor1, LEFT, RIGHT, durations1);
startRandomRun(&motor2, UP, DOWN, durations2);
}
// Check stop buttons for Motor1
if (digitalRead(StopLEFT) && motor1.isRunning && !motor1.direction) {
stopMotor(&motor1, LEFT, RIGHT);
}
else if (digitalRead(StopRIGHT) && motor1.isRunning && motor1.direction) {
stopMotor(&motor1, LEFT, RIGHT);
}
// Check stop buttons for Motor2
if (digitalRead (StopUP) && motor2.isRunning && !motor2.direction) {
stopMotor(&motor2, UP, DOWN);
}
else if (digitalRead(StopDOWN) && motor2.isRunning && motor2.direction) {
stopMotor(&motor2, UP, DOWN);
}
// Auto-stop check
if (motor1.isRunning && millis() >= motor1.endTime) {
stopMotor(&motor1, LEFT, RIGHT);
}
else if (motor2.isRunning && millis() >= motor2.endTime) {
stopMotor(&motor2, UP, DOWN);
}
// Completion check - NEW CODE
static bool wasRunning = false;
if ((motor1.isRunning || motor2.isRunning)) {
wasRunning = true;
}
else if (wasRunning) { // Just finished
delay(2000);
wasRunning = false;
onMotorsComplete(); // Call completion handler
}
}
void startRandomRun(Motor* motor, int pinF, int pinB, unsigned int* durations) {
if (motor->isRunning) return;
motor->direction = random(0, 2);
unsigned int runTime = durations[random(0, 4)];
digitalWrite(pinF, motor->direction ? LOW : HIGH);
digitalWrite(pinB, motor->direction ? HIGH : LOW);
motor->isRunning = true;
motor->endTime = millis() + runTime;
}
void stopMotor(Motor* motor, int pinF, int pinB) {
digitalWrite(pinF, LOW);
digitalWrite(pinB, LOW);
motor->isRunning = false;
}
// NEW FUNCTION - Called when both motors finish
void onMotorsComplete() {
Serial.println("Both motors completed their runs!");
// Add your custom code here:
// - Turn on an LED
// - Send a notification
// - Start another process
// Example:
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// #define buttonBPin 11
// #define buttonCPin 12
// #define led5Pin 13
// #define led6Pin 14
// bool led5Off = true;
// bool led6Off = true;
// // Action flags to ensure one-time execution
// bool actionStartTriggered = false;
// bool actionSBTriggered = false;
// bool actionStopTriggered = false;
// bool actionBackTriggered = false;
// bool actionFullStopTriggered = false;
// void setup() {
// Serial.begin(115200);
// pinMode(buttonBPin, INPUT);
// pinMode(buttonCPin, INPUT);
// pinMode(led5Pin, OUTPUT);
// pinMode(led6Pin, OUTPUT);
// }
// void loop() {
// int ButtonBState = digitalRead(buttonBPin);
// int ButtonCState = digitalRead(buttonCPin);
// // SB Start
// if (ButtonBState == HIGH && ButtonCState == LOW && led5Off && led6Off && !actionStartTriggered) {
// digitalWrite(led5Pin, HIGH);
// digitalWrite(led6Pin, LOW);
// led5Off = false;
// led6Off = true;
// actionStartTriggered = true;
// Serial.println("SB Start");
// }
// // SB
// if (ButtonBState == LOW && ButtonCState == LOW && !led5Off && led6Off && !actionSBTriggered) {
// digitalWrite(led5Pin, HIGH);
// digitalWrite(led6Pin, LOW);
// led5Off = false;
// led6Off = true;
// actionSBTriggered = true;
// Serial.println("SB");
// }
// // Stop
// if (ButtonBState == LOW && ButtonCState == HIGH && !led5Off && led6Off && !actionStopTriggered) {
// digitalWrite(led5Pin, LOW);
// digitalWrite(led6Pin, HIGH);
// led5Off = true;
// led6Off = false;
// actionStopTriggered = true;
// Serial.println("Stop");
// }
// // Back
// if (ButtonBState == LOW && ButtonCState == LOW && led5Off && !led6Off && !actionBackTriggered) {
// digitalWrite(led5Pin, LOW);
// digitalWrite(led6Pin, HIGH);
// led5Off = true;
// led6Off = false;
// actionBackTriggered = true;
// Serial.println("Back");
// }
// // FullStop
// if (ButtonBState == HIGH && ButtonCState == LOW && led5Off && !led6Off && !actionFullStopTriggered) {
// digitalWrite(led5Pin, LOW);
// digitalWrite(led6Pin, LOW);
// led5Off = true;
// led6Off = true;
// actionFullStopTriggered = true;
// Serial.println("FullStop");
// }
// // Reset all triggers when buttons change state
// if (ButtonBState == LOW && ButtonCState == LOW) {
// actionStartTriggered = false;
// actionSBTriggered = false;
// actionStopTriggered = false;
// actionBackTriggered = false;
// actionFullStopTriggered = false;
// }
// delay(10); // Small delay to stabilize loop
// }