diff --git a/rotating-display-controller/rotating-display-controller.ino b/rotating-display-controller/rotating-display-controller.ino index 99df830..705d985 100644 --- a/rotating-display-controller/rotating-display-controller.ino +++ b/rotating-display-controller/rotating-display-controller.ino @@ -104,6 +104,34 @@ void runStep() { } } +// --- Serial Output Helpers --- + +void printStatus() { + Serial.print("Mode: "); + Serial.print(autoMode == AUTO ? "AUTO" : "MANUAL"); + Serial.print(" | State: "); + Serial.print(_currState == MOVE ? "MOVE" : "WAIT"); + Serial.print(" | Steps Left: "); + Serial.print(_stepsRemaining); + Serial.print(" | Speed: "); + Serial.print(turnSpeed); + Serial.print(" deg/s | Wait: "); + Serial.print(waitInterval); + Serial.println("s"); +} + +void printCommandAck(char cmd, String payload) { + Serial.print("> Command '"); + Serial.print(cmd); + Serial.print(payload); + Serial.println("' received."); +} + +void printError(String msg) { + Serial.print("ERROR: "); + Serial.println(msg); +} + // --- Setup --- void setup() { // Initialize pins @@ -116,6 +144,8 @@ void setup() { Serial.begin(9600); while (!Serial) { ; } // Wait for serial port (optional for native USB) + Serial.println("=== Stepper Motor Controller Initialized ==="); + // Initial State Setup autoMode = AUTO; waitInterval = 8.0; @@ -131,6 +161,9 @@ void setup() { // Ensure we start in MOVE if we want immediate action, or WAIT if idle // Based on your logic: "initialized in MOVE state" _currState = MOVE; + + Serial.println("Ready. Commands: m[0|1], a[deg], s[deg/s], i[sec]"); + printStatus(); } // --- Loop --- @@ -140,27 +173,46 @@ void loop() { String command = Serial.readString(); command.trim(); // Remove whitespace - if (command.length() < 2) return; // Need at least 'a' + number + if (command.length() < 2) { + printError("Invalid command format (too short)."); + return; + } char cmdType = command.charAt(0); String payload = command.substring(1); + printCommandAck(cmdType, payload); + switch (cmdType) { case 'm': // 'm0' for AUTO, 'm1' for MANUAL if (payload.length() > 0) { char modeChar = payload.charAt(0); - if (modeChar == '0' && autoMode != AUTO) { - autoMode = AUTO; - _currState = MOVE; - _stepsRemaining = _stepCount; - _stepTime = millis(); - } else if (modeChar == '1' && autoMode != MANUAL) { - autoMode = MANUAL; - _currState = MOVE; // Start moving immediately on switch - _stepsRemaining = _stepCount; - _stepTime = millis(); + if (modeChar == '0') { + if (autoMode != AUTO) { + autoMode = AUTO; + _currState = MOVE; + _stepsRemaining = _stepCount; + _stepTime = millis(); + Serial.println(" -> Mode switched to AUTO. Starting move cycle."); + } else { + Serial.println(" -> Already in AUTO mode."); + } + } else if (modeChar == '1') { + if (autoMode != MANUAL) { + autoMode = MANUAL; + _currState = MOVE; // Start moving immediately on switch + _stepsRemaining = _stepCount; + _stepTime = millis(); + Serial.println(" -> Mode switched to MANUAL. Moving once, then waiting."); + } else { + Serial.println(" -> Already in MANUAL mode."); + } + } else { + printError("Invalid mode. Use 'm0' (AUTO) or 'm1' (MANUAL)."); } + } else { + printError("Missing mode argument (0 or 1)."); } break; @@ -168,7 +220,19 @@ void loop() { // 'a90' -> move 90 degrees { float angle = payload.toFloat(); - calculateStepsForAngle(angle); + if (payload.length() == 0 || (angle == 0 && payload != "0")) { + printError("Invalid angle format."); + } else { + calculateStepsForAngle(angle); + Serial.print(" -> Moving "); + Serial.print(_stepCount); + Serial.print(" steps ("); + Serial.print(angle); + Serial.println(" degrees)."); + if (_stepCount == 0) { + Serial.println(" -> No movement required (0 degrees)."); + } + } } break; @@ -176,10 +240,16 @@ void loop() { // 's10' -> 10 deg/s { float speed = payload.toFloat(); - if (speed > 0) { + if (payload.length() == 0 || speed <= 0) { + printError("Invalid speed. Must be > 0."); + } else { turnSpeed = speed; updateStepInterval(); - // If currently in MOVE, the new interval applies on next step + Serial.print(" -> Speed set to "); + Serial.print(turnSpeed); + Serial.print(" deg/s (Step interval: "); + Serial.print(_stepInterval * 1000, 2); + Serial.println(" ms)."); } } break; @@ -188,12 +258,24 @@ void loop() { // 'i5' -> 5 seconds wait { float interval = payload.toFloat(); - if (interval >= 0) { + if (payload.length() == 0 || interval < 0) { + printError("Invalid interval. Must be >= 0."); + } else { waitInterval = interval; + Serial.print(" -> Wait interval set to "); + Serial.print(waitInterval); + Serial.println(" seconds."); } } break; + + default: + printError("Unknown command. Use m, a, s, or i."); + break; } + + // Print status after every command for immediate feedback + printStatus(); } // --- EXECUTION LOGIC --- @@ -202,6 +284,14 @@ void loop() { if (_currState == MOVE && _stepsRemaining == 0) { _currState = WAIT; _waitTime = millis(); + Serial.println("--- State: MOVE -> WAIT ---"); + if (autoMode == AUTO) { + Serial.print(" Waiting "); + Serial.print(waitInterval); + Serial.println(" seconds before next cycle..."); + } else { + Serial.println(" Waiting indefinitely for new command (MANUAL mode)."); + } } // 2. Check if we should restart in AUTO mode @@ -210,6 +300,10 @@ void loop() { _currState = MOVE; _stepsRemaining = _stepCount; _stepTime = millis(); // Reset step timer to prevent burst + Serial.println("--- State: WAIT -> MOVE ---"); + Serial.print(" Auto-restart! Moving "); + Serial.print(_stepsRemaining); + Serial.println(" steps."); } // If MANUAL: Stay in WAIT indefinitely until new command } @@ -221,6 +315,14 @@ void loop() { runStep(); _stepTime = currentTime; _stepsRemaining--; + + // Optional: Print progress every 10 steps to avoid spam + // if (_stepCount > 0 && (_stepCount - _stepsRemaining) % 10 == 0) { + // Serial.print(" Step: "); + // Serial.print(_stepCount - _stepsRemaining); + // Serial.print("/"); + // Serial.println(_stepCount); + // } } } } \ No newline at end of file