Coordinate con magnetometro

Beh intanto il simulatore è, appunto, un simulatore e non è detto che funzioni al 100% come il mondo reale. Ma nel simulatore vedo anche l'"int", tu hai tolto la creazione di quella variabile locale?

A parte questo, se il codice è esattamente lo stesso (prendi quello del simulatore, togli "int" e caricalo) come anche le connessioni ed il potenziometro, in pratica sembra non avere senso.
Togli le variabili globali "val" e "val0" (che non usi) e prova a vedere via seriale cosa esce se modifichi la parte finale del loop in (metto un delay ampio per evitare troppi dati):

      int val = 0;
      Serial.print("val="); Serial.println(val);
      // Somma tre letture consecutive
      for (int i = 0; i < 3; ++i)
          val += analogRead(A0);
      Serial.print("val totale="); Serial.println(val);
 
      // Calcola la media
      val = val / 3;
      Serial.print("val media="); Serial.println(val);
      // Riporta il valore tra 0 e 100            
      val = map(val, 0, 1023, 0, 100);  // visualbasic cosi regolerà il volume del player
      Serial.print("val map="); Serial.println(val);
       
      sprintf(outBuf, "%d;%d", headingDegrees, val); // concatena i due valori separati da puntovirgola
      Serial.println(outBuf); // invii alla seriale
     
      delay(1000); // aggiustare valore per migliori prestazioni tra 50 e 500

Posta quindi qui con copia/incolla l'output seriale di Arduino.

PS: comunque quando funzionerà questa cosa ti conviene mandare i dati via seriale solamente se uno dei due cambia e non continuamente).