1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
| // *** LA GESTION DE LA CARTE SD ***
#include <SdFat.h>
SdFat carteSd;
const byte csPinSD = 4;
// *** LA GESTION ETHERNET ***
#include <Ethernet.h>
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; // notre adresse MAC
IPAddress ip(192, 168, 1, 200); // notre adresse IP, à adapter à votre réseau local
EthernetServer serveurHTTP(80); // 80 est le port standard du protocole HTTP
const byte tailleMaxGETBuffer = 60; // taille max pour la commande GET reçue, à adapter aux besoins
// *** LES PINS UTILISÉES ***
const byte ledPin = 2; // une LED sur la broche numérique 2
const byte LM35Pin = A0; // le capteur de température sur la broche analogique 0
// *** LES FONCTIONS UTILITAIRES ***
void arHtml(EthernetClient& nomClient, const __FlashStringHelper* type) // on passe le type en utilisant la macro F("...") pour économiser la mémoire SRAM
{
nomClient.println(F("HTTP/1.1 200 OK"));
nomClient.print(F("Content-Type: "));
nomClient.println(type);
nomClient.println(F("Connection: close"));
nomClient.println();
}
void envoiFichier(EthernetClient& nomClient, const char* fichierEnCours)
{
if (carteSd.exists(fichierEnCours))
{
File fichier = carteSd.open(fichierEnCours, FILE_READ);
if (fichier) { // si l'accès s'est bien passé
while (fichier.available()) nomClient.write(fichier.read()); // on envoie le contenu du fichier
fichier.close(); // puis on ferme le fichier
}
}
}
float temperature(byte broche, word iteration)
{
long lecture = 0;
for (word i = 0; i < iteration; i++)
{
lecture += analogRead(broche);
}
return (float(lecture) * 500.0 / 1024.0 / iteration);
}
void maj(EthernetClient& nomClient)
{
float temperatureMoyenne = temperature(LM35Pin, 10); // on calcule la moyenne de la température sur quelques échantillons
// on va renvoyer un JSON
arHtml(nomClient, F("application/json"));
// on construit et emet notre JSON
nomClient.print(F("{\"bouton\":\""));
if (digitalRead(ledPin) == HIGH)
nomClient.print(F("ledOn"));
else
nomClient.print(F("ledOff"));
nomClient.print(F("\",\"temperature\":"));
nomClient.print(temperatureMoyenne, 2); // on emet la température avec 2 chiffres après la virgule
nomClient.println(F("}"));
}
// *** LE PROGRAMME PRINCIPAL ***
void setup()
{
pinMode(ledPin, OUTPUT);
Serial.begin(115200);
carteSd.begin(csPinSD);
Ethernet.begin(mac, ip);
}
void loop()
{
EthernetClient client = serveurHTTP.available();
if (client)
{
if (client.connected())
{
char reception[tailleMaxGETBuffer + 1]; // +1 car une chaîne bien formée se termine par un '\0' invisible
byte nbCar = 0;
while (client.available()) // tant que des données sont disponibles
{
char carLu = client.read(); // on lit le prochain octet
if (carLu != '\n') // si ce n'est pas la marque de fin de ligne
{
if (nbCar < tailleMaxGETBuffer) reception[nbCar++] = carLu; // et si on a la place alors on conserve le caractère sinon on l'ignore
}
else break; // si on a reçu la fin de ligne on termine
}
reception[nbCar] = '\0'; // on met la marque de fin de notre chaîne correctement
// on analyse maintenant ce que l'on a reçu en cherchant des mots clés en utilisant strstr() (cf http://www.cplusplus.com/reference/cstring/strstr/)
// est-ce une demande de type ajax ?
char *ajaxPtr = strstr(reception, "ajax?");
if (ajaxPtr != NULL)
{
if (strstr(ajaxPtr, "ON") != NULL) digitalWrite(ledPin, HIGH); // si la requête demande d'allumer, on le fait
else if (strstr(ajaxPtr, "OFF") != NULL) digitalWrite(ledPin, LOW); // si la requête demande l'extinction, on le fait
// puis on envoie une réponse JSON avec mise à jour
maj(client);
}
// est-ce une demande pour telecommande.css
else if (strstr(reception, "telecommande.css") != NULL)
{
arHtml(client, F("text/css"));
envoiFichier(client, "telecommande.css");
}
// est-ce une demande pour telecommande.js
else if (strstr(reception, "telecommande.js") != NULL)
{
arHtml(client, F("application/javascript"));
envoiFichier(client, "telecommande.js");
}
// est-ce une demande pour icone.png
else if (strstr(reception, "icone.png") != NULL)
{
arHtml(client, F("image/png"));
envoiFichier(client, "icone.png");
}
// sinon on envoie la page standard
else
{
arHtml(client, F("text/html"));
envoiFichier(client, "telecommande.html");
}
delay(1);
}
client.stop(); // on se déconnecte du serveur. le buffer non lu est conservé jusqu'à disparition de l'instance client, ce qui se fait en fin de loop
}
} |
Partager