How to make compass degrees "circular"?

Take a look at this test code. I think method 1 essentially is what you are doing at the moment. Method 2 hopefully solves your issue.

void setup() {
  Serial.begin(115200);

  Serial.println("\nTesting error angle calculation method 1");
  // These should all cause the same error angle (+2 deg)
  calculate1(358,  0);
  calculate1(359,  1);
  calculate1(  0,  2);
  // These should all cause the same error angle (-2 deg)
  calculate1(  0, 358);
  calculate1(  1, 359);
  calculate1(  2,  0);

  Serial.println("\nTesting error angle calculation method 2");
  // These should all cause the same error angle (+2 deg)
  calculate2(358,  0);
  calculate2(359,  1);
  calculate2(  0,  2);
  // These should all cause the same error angle (-2 deg)
  calculate2(  0, 358);
  calculate2(  1, 359);
  calculate2(  2,  0);
}

void loop() {

}

void calculate1(int courseDeg, int headingDeg) {
  int errorAngle = (headingDeg - courseDeg); //calculate difference between heading and course
  printAngle("headingDeg", headingDeg);
  printAngle("courseDeg", courseDeg);
  printAngle("errorAngle", errorAngle);
  Serial.println();
}

void calculate2(int courseDeg, int headingDeg) {
  int errorAngle = (headingDeg - courseDeg); //calculate difference between heading and course
  if (errorAngle < -180) errorAngle += 360;
  else if (errorAngle > 180) errorAngle -= 360;
  printAngle("headingDeg", headingDeg);
  printAngle("courseDeg", courseDeg);
  printAngle("errorAngle", errorAngle);
  Serial.println();
}

void printAngle(const char* text, int angle) {
  Serial.print(text);
  Serial.print("=");
  Serial.print(angle);
  Serial.print(" ");
}

This produces the following output on the serial monitor


Testing error angle calculation method 1
headingDeg=0 courseDeg=358 errorAngle=-358 
headingDeg=1 courseDeg=359 errorAngle=-358 
headingDeg=2 courseDeg=0 errorAngle=2 
headingDeg=358 courseDeg=0 errorAngle=358 
headingDeg=359 courseDeg=1 errorAngle=358 
headingDeg=0 courseDeg=2 errorAngle=-2 

Testing error angle calculation method 2
headingDeg=0 courseDeg=358 errorAngle=2 
headingDeg=1 courseDeg=359 errorAngle=2 
headingDeg=2 courseDeg=0 errorAngle=2 
headingDeg=358 courseDeg=0 errorAngle=-2 
headingDeg=359 courseDeg=1 errorAngle=-2 
headingDeg=0 courseDeg=2 errorAngle=-2 

2 Likes