// Ces trois bibliothèques sont indispensables pour le shield #include #include #include // Pour la communication avec la carte SD // pour le capteur de température, pression, humidité #include // 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); // Capteur de température, pression, humidité Adafruit_BME280 capteur; // valeur numérique convertie en chaine de caractères char valconv [10]; // valeurs des mesures float temper; int pres_atm; int humidite; // 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 (F(".")); } Serial.println (); } // pour convertir une valeur entière en chaine de caractères char *conv_int_str (int valeur) { sprintf (valconv, "%d", valeur); return (valconv); } // pour convertir une valeur décimale en chaine de caractères char *conv_float_str (float valeur) { int val; // le format %f ne marchant pas, on découpe les parties entière et décimales comme 2 entiers // il faudrait faire un peu mieux pour les nombre négatifs val = valeur * 10; sprintf (valconv, "%d,%d", val / 10, val % 10); return (valconv); } // mesures float mesure_temper () { return (capteur.readTemperature ()); } int mesure_pres_atm () { return (capteur.readPressure () / 100); } int mesure_humidite () { return (capteur.readHumidity ()); } 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 (F("Initialisation carte SD ")); if (!SD.begin (SDCARD_CS_PIN)) Serial.println (F("Echec !")); else Serial.println (F("Succès")); // Initialisation du capteur Serial.print (F("Initialisation du capteur ")); if (! capteur.begin ()) 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; char fic_html [] = "meteo.htm"; 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); // envoi de l'entête de la page web envoie_entete_reponse (client); // tenter d'accéder à au fichier HTML descfic = SD.open (fic_html, FILE_READ); // si on n'a pas réussi, tenter la page d'erreur if (! descfic) descfic = SD.open (F("err404.htm"), FILE_READ); // si on accède au fichier html if (descfic) { // faire les mesures temper = mesure_temper (); pres_atm = mesure_pres_atm (); humidite = mesure_humidite (); // envoi de la page coprep_chaine (descfic, client, "XXXTEMP", conv_float_str (temper)); coprep_chaine (descfic, client, "XXXPRES", conv_int_str (pres_atm)); coprep_chaine (descfic, client, "XXXHUMID", conv_int_str (humidite)); 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 (); } }