aide pour code girouette avec un shield ethernet

En fait je me suis mal exprimé hier,
je veux héberger le serveur sur l'arduino, c'est à dire avoir l'arduino en mode server.
Je veux donc avoir la page HTML sur l'arduino.
Excuse moi j'était tellement fatigué que je comprenais même plus ce que j'écrivais lol

Voici mon code qui me permet de créer mon petit serveur sur l'arduino :

// EtherShield webserver demo
#include "EtherShield.h"
#include <HMC5883L.h>
#include <Wire.h>

// please modify the following two lines. mac and ip have to be unique
// in your local area network. You can not have the same numbers in
// two devices:
static uint8_t mymac[6] = {
  0x54,0x55,0x58,0x10,0x00,0x25}; 
  
static uint8_t myip[4] = {
  192,168,1,30};

#define MYWWWPORT 80
#define BUFFER_SIZE 550

// déclare notre boussole comme une variable.
HMC5883L compass;

// Enregistre toute erreur provoquée par la boussole.
int error = 0;

static uint8_t buf[BUFFER_SIZE+1];

// The ethernet shield
EtherShield es=EtherShield();

uint16_t http200ok(void)
{
  return(es.ES_fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nPragma: no-cache\r\n\r\n")));
}




void setup(){

 { // Initialise SPI interface
  es.ES_enc28j60SpiInit();

  // initialize enc28j60
  es.ES_enc28j60Init(mymac);

  // init the ethernet/ip layer:
  es.ES_init_ip_arp_udp_tcp(mymac,myip, MYWWWPORT);
}

{

   // Initialise le port série.
  Serial.begin(9600);

  Serial.println("Starting the I2C interface.");
  Wire.begin(); // Démarre l'interface I2C.

  Serial.println("Constructing new HMC5883L");
  compass = HMC5883L(); // Construit une nouvelle boussole HMC5883L
    
  Serial.println("Setting scale to +/- 1.3 Ga");
  error = compass.SetScale(1.3); // Règle l'échelle de la boussole.
  if(error != 0) // Si il y a une erreur, l'afficher.
    Serial.println(compass.GetErrorText(error));
  
  Serial.println("Setting measurement mode to continous.");
  error = compass.SetMeasurementMode(Measurement_Continuous); // Réglez le mode de mesure Continu.
  if(error != 0) // Si il y a une erreur, l'afficher.
    Serial.println(compass.GetErrorText(error));
}}
void loop(){
 { uint16_t plen, dat_p;

  while(1) {
    // read packet, handle ping and wait for a tcp packet:
    dat_p=es.ES_packetloop_icmp_tcp(buf,es.ES_enc28j60PacketReceive(BUFFER_SIZE, buf));

    /* dat_p will be unequal to zero if there is a valid 
     * http get */
    if(dat_p==0){
      // no http request
      continue;
    }
    // tcp port 80 begin
    if (strncmp("GET ",(char *)&(buf[dat_p]),4)!=0){
      // head, post and other methods:
      dat_p=http200ok();
      dat_p=es.ES_fill_tcp_data_p(buf,dat_p,PSTR("<h1>200 OK</h1>"));
      goto SENDTCP;
    }
    // just one web page in the "root directory" of the web server
    if (strncmp("/ ",(char *)&(buf[dat_p+4]),2)==0){
      dat_p=print_webpage(buf);
      goto SENDTCP;
    }
    else{
      dat_p=es.ES_fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 401 Unauthorized\r\nContent-Type: text/html\r\n\r\n<h1>401 Unauthorized</h1>"));
      goto SENDTCP;
    }
SENDTCP:
    es.ES_www_server_reply(buf,dat_p); // send web page data
    // tcp port 80 end

  }

}

{
  // Récupérer les valeurs de ligne de la boussole (pas à l'échelle)
  MagnetometerRaw raw = compass.ReadRawAxis();
  // Récupérée les valeurs mises à l'échelle de la boussole (à l'échelle de l'échelle configurée).
  MagnetometerScaled scaled = compass.ReadScaledAxis();
  
  // Valeurs de la boussole :
  int MilliGauss_OnThe_XAxis = scaled.XAxis;// (ou YAxis, ou ZAxis)

  // Calculer la position 
  float heading = atan2(raw.YAxis, raw.XAxis);
  
  // Une fois que nous avez notre position, nous devez ajouter notre angle de déclinaison, qui est l'erreur du champ magnétique dans notre région.
  // On peut la trouver ici: http://www.magnetic-declination.com/
  // A Enghien les bains : 0° 37' W, qui correspond à 0.8727 milliradians.
  // on convertit les milliradians en radians :
  float declinationAngle = 0.8727/1000.0;
  heading -= declinationAngle;
  
  // Corrige si le signe est inversé
  if(heading < 0)
    heading += 2*PI;
    
  if(heading > 2*PI)
    heading -= 2*PI;
   
  // Convertit radian en degré pour la lecture
  float headingDegrees = heading * 180/M_PI; 

  // Sortie des données via le port série.
  Output(raw, scaled, heading, headingDegrees);


}
}

 // Sortie des données via le port série.
void Output(MagnetometerRaw raw, MagnetometerScaled scaled, float heading, float headingDegrees)
{
   Serial.print("Raw:\t");
   Serial.print(raw.XAxis);
   Serial.print("   ");   
   Serial.print(raw.YAxis);
   Serial.print("   ");   
   Serial.print(raw.ZAxis);
   Serial.print("   \tScaled:\t");
   
   Serial.print(scaled.XAxis);
   Serial.print("   ");   
   Serial.print(scaled.YAxis);
   Serial.print("   ");   
   Serial.print(scaled.ZAxis);

   Serial.print("   \tHeading:\t");
   Serial.print(heading);
   Serial.print(" Radians   \t");
   Serial.print(headingDegrees);
   Serial.println(" Degrees   \t");
}

// prepare the webpage by writing the data to the tcp send buffer
uint16_t print_webpage(uint8_t *buf)
{
  uint16_t plen;
  plen=http200ok();
  plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<html><meta charset='UTF-8'><head><title>Projet PPE 2014</title></head><body>"));
  plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("
</font></h2>") );
  plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("</center><hr>"));
  plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<center>"));
  plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<table width= '200' border= '1' >"));
  plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<tr>"));
  plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<td>raw</td>"));
  plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<td>scaled</td>"));
  plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<td>heading(rad)</td>"));
  plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<td>heading(°)</td>"));
  plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("</tr>"));
  plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<tr>"));
  plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<td>&nbsp;</td>"));
  plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<td>&nbsp;</td>"));
  plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<td>&nbsp;</td>"));
  plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<td>&nbsp;</td>"));
  plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("</tr>"));
  plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("</table>"));
  plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("</center>"));
  plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<hr>"));
  plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<p>&nbsp;</p>"));
  plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<p>"));
  plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<a href=\"http://www.lyc-monod-enghien.ac-versailles.fr/\">Lycée Gustave Monod</a>"));
  plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("</body></html>"));

  return(plen);
}

et voici une capture de mon serveur.

Comme on le vois, j'ai bien mon tableau mais dans la deuxième colonne, je voudrais les valeurs de mes variables mais dès que je remplace les "&nbsp" par le nom d'une de mes variables en faisant

 plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<td>"));
  plen=es.ES_fill_tcp_data_p(buf,plen,PSTR(heading));
  plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("</td>"));

j'ai une erreur qui est "heading was not declared in this scope" alors je l'ai déclaré juste au dessus pour avoir mes variables sur le port série.

Comment résoudre ce problème?
Et oui c'est pour le bac
Merci