Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //My Problem:
- //The device is supposed to pause the servo movement when I press the PAUSE button on Nextion display. However, while the servo is moving in the moveServo() loop, it doesn’t listen to the button presses.
- //Relevant Code:
- //pauseBTCallback() Function (Handles Pause Button):
- void pauseBTCallback(void *ptr) {
- sessionPaused = !sessionPaused; // Toggle pause state
- if (sessionPaused) {
- Serial.println("Session paused.");
- homeComing(isSAxis ? servoSide : servoTop, isSAxis); // Move to neutral
- } else {
- Serial.println("Session resumed.");
- }
- }
- //moveServo() Function (Servo Movement Loop):
- void moveServo() {
- int minAngle = isSAxis ? s_axis_left : f_axis_left; // Determine the minimum angle based on the active axis
- int maxAngle = isSAxis ? s_axis_right : f_axis_right; // Determine the maximum angle based on the active axis
- Servo &activeServo = isSAxis ? servoSide : servoTop; // Select the active servo (servoSide or servoTop)
- int lastDisplayedSpeed = -1; // Track the last displayed speed to avoid redundant updates
- remainingReps = currentReps; // Initialize the remaining repetitions
- for (int i = 1; i <= currentReps; i++) {
- remainingReps = currentReps - i + 1; // Update remaining reps count
- // Check if session is paused or canceled
- if (sessionPaused) {
- homeComing(activeServo, isSAxis); // Move to neutral position
- while (sessionPaused) {
- // Wait here until resumed (pauseBT toggles sessionPaused to false)
- if (endSession) {
- Serial.println("Session canceled by end button.");
- return; // Exit the loop entirely
- }
- delay(100); // Small delay to avoid busy-waiting
- }
- }
- if (endSession) {
- Serial.println("Session canceled by end button.");
- return; // Exit the loop entirely
- }
- // Display remaining repetitions
- char remainingRepsStr[10];
- sprintf(remainingRepsStr, "%dx", remainingReps);
- nexSerial.print("ActiveRepsTX.txt=\"");
- nexSerial.print(remainingRepsStr);
- nexSerial.print("\"");
- nexSerial.write(0xff);
- nexSerial.write(0xff);
- nexSerial.write(0xff);
- // Display the current speed
- if (currentSpeed != lastDisplayedSpeed) {
- char activeSpeedStr[10];
- sprintf(activeSpeedStr, "%d%%", currentSpeed);
- nexSerial.print("ActiveSpeedTX.txt=\"");
- nexSerial.print(activeSpeedStr);
- nexSerial.print("\"");
- nexSerial.write(0xff);
- nexSerial.write(0xff);
- nexSerial.write(0xff);
- lastDisplayedSpeed = currentSpeed;
- }
- // Move to minimum angle
- nexSerial.print("ActiveAngleTX.txt=\"");
- nexSerial.print(minAngle);
- nexSerial.write(0xB0); // Degree symbol
- nexSerial.print("\"");
- nexSerial.write(0xff);
- nexSerial.write(0xff);
- nexSerial.write(0xff);
- moveToAngle(activeServo, minAngle, isSAxis); // Move servo
- delay(extremePause); // Pause at extreme
- // Move to maximum angle
- nexSerial.print("ActiveAngleTX.txt=\"");
- nexSerial.print(maxAngle);
- nexSerial.write(0xB0); // Degree symbol
- nexSerial.print("\"");
- nexSerial.write(0xff);
- nexSerial.write(0xff);
- nexSerial.write(0xff);
- moveToAngle(activeServo, maxAngle, isSAxis); // Move servo
- delay(extremePause); // Pause at extreme
- }
- // Move servo to neutral position after finishing
- homeComing(activeServo, isSAxis);
- // Navigate to page 0
- nexSerial.print("page 0");
- nexSerial.write(0xff);
- nexSerial.write(0xff);
- nexSerial.write(0xff);
- Serial.println("Servo movement complete. Navigated to page 0.");
- }
- //moveToAngle() Function (Moves Servo to Target Angle):
- void moveToAngle(Servo &servo, int targetUserAngle, bool isSideServo) {
- int targetAngle = convertToServoAngle(targetUserAngle, isSideServo); // Convert user angle to servo angle
- int currentAngle = servo.read(); // Get the current servo angle
- Serial.print("Moving servo to: ");
- Serial.println(targetAngle); // Log the target angle to Serial Monitor
- int step = (currentAngle < targetAngle) ? 1 : -1; // Determine step direction (increment or decrement)
- while (currentAngle != targetAngle) {
- currentAngle += step; // Update the servo's current angle
- servo.write(currentAngle); // Move servo to the new angle
- // Speed-adjusted delay
- float speedFactor = currentSpeed / 100.0; // Convert speed percentage to a factor
- int dynamicDelay = (int)(10 / speedFactor); // Scale delay inversely with speed
- delay(dynamicDelay); // Pause briefly for smooth movement
- }
- servo.write(targetAngle); // Ensure servo finishes at the exact target angle
- }
- //homeComing() Function (Neutral Position Logic):
- void homeComing(Servo &servo, bool isSideServo) {
- int neutralAngle = isSideServo ? neutralAngleSide : neutralAngleTop; // Determine neutral angle
- int currentAngle = servo.read(); // Get the current servo angle
- Serial.println("Returning servo to neutral position...");
- int step = (currentAngle < neutralAngle) ? 1 : -1;
- float speedFactor = homeComingSpeed / 100.0; // Convert speed percentage to a factor
- int dynamicDelay = (int)(10 / speedFactor);
- while (currentAngle != neutralAngle) {
- currentAngle += step;
- servo.write(currentAngle);
- delay(dynamicDelay);
- }
- servo.write(neutralAngle);
- Serial.println("Servo returned to neutral position.");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement