Advertisement
Guest User

Untitled

a guest
Mar 20th, 2025
71
0
96 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.94 KB | None | 0 0
  1. //My Problem:
  2. //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.
  3.  
  4. //Relevant Code:
  5.  
  6. //pauseBTCallback() Function (Handles Pause Button):
  7.     void pauseBTCallback(void *ptr) {
  8.       sessionPaused = !sessionPaused;  // Toggle pause state
  9.       if (sessionPaused) {
  10.         Serial.println("Session paused.");
  11.         homeComing(isSAxis ? servoSide : servoTop, isSAxis);  // Move to neutral
  12.       } else {
  13.         Serial.println("Session resumed.");
  14.       }
  15.     }
  16.  
  17. //moveServo() Function (Servo Movement Loop):
  18.     void moveServo() {
  19.       int minAngle = isSAxis ? s_axis_left : f_axis_left;    // Determine the minimum angle based on the active axis
  20.       int maxAngle = isSAxis ? s_axis_right : f_axis_right;  // Determine the maximum angle based on the active axis
  21.  
  22.       Servo &activeServo = isSAxis ? servoSide : servoTop;  // Select the active servo (servoSide or servoTop)
  23.  
  24.       int lastDisplayedSpeed = -1;  // Track the last displayed speed to avoid redundant updates
  25.       remainingReps = currentReps;  // Initialize the remaining repetitions
  26.  
  27.       for (int i = 1; i <= currentReps; i++) {
  28.         remainingReps = currentReps - i + 1;  // Update remaining reps count
  29.  
  30.         // Check if session is paused or canceled
  31.         if (sessionPaused) {
  32.           homeComing(activeServo, isSAxis);  // Move to neutral position
  33.           while (sessionPaused) {
  34.             // Wait here until resumed (pauseBT toggles sessionPaused to false)
  35.             if (endSession) {
  36.               Serial.println("Session canceled by end button.");
  37.               return;  // Exit the loop entirely
  38.             }
  39.             delay(100);  // Small delay to avoid busy-waiting
  40.           }
  41.         }
  42.         if (endSession) {
  43.           Serial.println("Session canceled by end button.");
  44.           return;  // Exit the loop entirely
  45.         }
  46.  
  47.         // Display remaining repetitions
  48.         char remainingRepsStr[10];
  49.         sprintf(remainingRepsStr, "%dx", remainingReps);
  50.         nexSerial.print("ActiveRepsTX.txt=\"");
  51.         nexSerial.print(remainingRepsStr);
  52.         nexSerial.print("\"");
  53.         nexSerial.write(0xff);
  54.         nexSerial.write(0xff);
  55.         nexSerial.write(0xff);
  56.  
  57.         // Display the current speed
  58.         if (currentSpeed != lastDisplayedSpeed) {
  59.           char activeSpeedStr[10];
  60.           sprintf(activeSpeedStr, "%d%%", currentSpeed);
  61.           nexSerial.print("ActiveSpeedTX.txt=\"");
  62.           nexSerial.print(activeSpeedStr);
  63.           nexSerial.print("\"");
  64.           nexSerial.write(0xff);
  65.           nexSerial.write(0xff);
  66.           nexSerial.write(0xff);
  67.  
  68.           lastDisplayedSpeed = currentSpeed;
  69.         }
  70.  
  71.         // Move to minimum angle
  72.         nexSerial.print("ActiveAngleTX.txt=\"");
  73.         nexSerial.print(minAngle);
  74.         nexSerial.write(0xB0);  // Degree symbol
  75.         nexSerial.print("\"");
  76.         nexSerial.write(0xff);
  77.         nexSerial.write(0xff);
  78.         nexSerial.write(0xff);
  79.  
  80.         moveToAngle(activeServo, minAngle, isSAxis);  // Move servo
  81.         delay(extremePause);                          // Pause at extreme
  82.  
  83.         // Move to maximum angle
  84.         nexSerial.print("ActiveAngleTX.txt=\"");
  85.         nexSerial.print(maxAngle);
  86.         nexSerial.write(0xB0);  // Degree symbol
  87.         nexSerial.print("\"");
  88.         nexSerial.write(0xff);
  89.         nexSerial.write(0xff);
  90.         nexSerial.write(0xff);
  91.  
  92.         moveToAngle(activeServo, maxAngle, isSAxis);  // Move servo
  93.         delay(extremePause);                          // Pause at extreme
  94.       }
  95.  
  96.       // Move servo to neutral position after finishing
  97.       homeComing(activeServo, isSAxis);
  98.  
  99.       // Navigate to page 0
  100.       nexSerial.print("page 0");
  101.       nexSerial.write(0xff);
  102.       nexSerial.write(0xff);
  103.       nexSerial.write(0xff);
  104.  
  105.       Serial.println("Servo movement complete. Navigated to page 0.");
  106.     }
  107.  
  108. //moveToAngle() Function (Moves Servo to Target Angle):
  109.     void moveToAngle(Servo &servo, int targetUserAngle, bool isSideServo) {
  110.         int targetAngle = convertToServoAngle(targetUserAngle, isSideServo); // Convert user angle to servo angle
  111.         int currentAngle = servo.read();  // Get the current servo angle
  112.         Serial.print("Moving servo to: ");
  113.         Serial.println(targetAngle);  // Log the target angle to Serial Monitor
  114.  
  115.         int step = (currentAngle < targetAngle) ? 1 : -1; // Determine step direction (increment or decrement)
  116.         while (currentAngle != targetAngle) {
  117.             currentAngle += step;  // Update the servo's current angle
  118.             servo.write(currentAngle);  // Move servo to the new angle
  119.  
  120.             // Speed-adjusted delay
  121.             float speedFactor = currentSpeed / 100.0;  // Convert speed percentage to a factor
  122.             int dynamicDelay = (int)(10 / speedFactor);  // Scale delay inversely with speed
  123.             delay(dynamicDelay);  // Pause briefly for smooth movement
  124.         }
  125.  
  126.         servo.write(targetAngle);  // Ensure servo finishes at the exact target angle
  127.     }
  128.  
  129. //homeComing() Function (Neutral Position Logic):
  130.     void homeComing(Servo &servo, bool isSideServo) {
  131.       int neutralAngle = isSideServo ? neutralAngleSide : neutralAngleTop;  // Determine neutral angle
  132.       int currentAngle = servo.read();                                      // Get the current servo angle
  133.       Serial.println("Returning servo to neutral position...");
  134.  
  135.       int step = (currentAngle < neutralAngle) ? 1 : -1;
  136.       float speedFactor = homeComingSpeed / 100.0;  // Convert speed percentage to a factor
  137.       int dynamicDelay = (int)(10 / speedFactor);
  138.  
  139.       while (currentAngle != neutralAngle) {
  140.         currentAngle += step;
  141.         servo.write(currentAngle);
  142.         delay(dynamicDelay);
  143.       }
  144.  
  145.       servo.write(neutralAngle);
  146.       Serial.println("Servo returned to neutral position.");
  147.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement