// Ces trois bibliothèques sont indispensables pour le shield
        #include <SPI.h>
        #include <Ethernet.h>
        #include <SD.h>  // Pour la communication avec la carte SD
        
        // Fonctions permettant la lecture de fichiers html sur la carte SD
        // et leur envoi (avec modifications éventuelles) sur le port éthernet
        #include "trthtml.h"
        
        // Broche CS de la carte SD
        const byte SDCARD_CS_PIN = 4; // pour Arduino UNO c'est quelquefois indiqué 10
        
        // L'adresse MAC du shield
        byte mac[] = { 0x90, 0xA2, 0xDA, 0xHH, 0xHH, 0xHH };
        
        // L'adresse IP que prendra le shield
        IPAddress ip (192, 168, n1, n2);
        
        // Notre serveur écoutera sur le port 80
        EthernetServer serveur (80);
        
        // Nom du fichier à récupérer
        char url [14];
        
        
        // affiche l'adresse IP sur le moniteur série
        void affiche_ip ()
        {
            int i;
        
            for (i = 0; i < 4; )
            {
                Serial.print (ip [i]);
        
                if (++ i < 4)
                     Serial.print (".");
            }
        
            Serial.println ();
        }
        
        
        void setup ()
        {
            // On démarre la voie série pour déboguer
            Serial.begin (9600);
        
            // On démarre le shield Ethernet avec l'adresse IP et l'adresse MAC
            Ethernet.begin (mac, ip);
            Serial.println (F("ethernet ok "));
        
            // afficher l'adresse IP
            affiche_ip ();
        
            // Initialisation du port SPI
            pinMode (SDCARD_CS_PIN, OUTPUT);
        
            // Initialisation de la carte SD
            Serial.print ("Initialisation carte SD   ");
        
            if (!SD.begin (SDCARD_CS_PIN))
                Serial.println (F("Echec !"));
            else
                Serial.println (F("Succès"));
        
            // laisse du temps au shield pour s'initialiser
            delay (100);
        
            // on lance le serveur
            serveur.begin ();
            delay (100);
        
            Serial.println (F("Pret !"));
        }
        
        
        void loop ()
        {
            EthernetClient client;
            File descfic;
        
        
            // Regarde si un client est connecté et attend une réponse
            client = serveur.available ();
        
            // si c'est le cas, quelqu'un est connecté
            if (client)
            {
                // récupérer ce qu'il a envoyé
                lire_trame_client (client, url, sizeof (url));
        
                // si aucun nom de fichier ne figure dans l'url
                if (! url [1])
                    // mettre le nom du fichier d'accueil
                    strcpy (url, "index.htm");
        
                // tenter d'accéder à au fichier HTML
                descfic = SD.open (url, FILE_READ);
        
                // si on n'a pas réussi, tenter la page d'erreur
                if (! descfic)
                    descfic = SD.open (F("/err404.htm"), FILE_READ);
        
                // envoi de l'entête de la page web
                envoie_entete_reponse (client, url);
        
                // si on accède au fichier html
                if (descfic)
                {
                    // envoi de la page
                    copie_jusque_fin (descfic, client);
        
                    // ferner le fichier HTML
                    descfic.close ();
                }
                // sinon message d'erreur
                else
                    client.println (F("Probleme probable d'acces a la carte SD"));
        
                Serial.println (F("Page envoyée\n"));
        
                // Donne le temps au client de prendre les données
                delay (10);
        
                // Ferme la connexion avec le client
                client.stop ();
            }
        }