Ensuite le serveur arduino :
//***********************************************************************************************************/
// Programme du Serveur BambooProbe Humidité du sol, humidité de l'air, température de l'air et Luminosité
//
// Code inspiré de http://geeklaboratories.com/408-comment-monitorer-le-climat-de-son-domicile-avec-arduino
//
// Shield Ethernet, nRF24L01+, led Temoin d'alerte secheresse
//
// David M - plantesvertes.net
//***********************************************************************************************************/
//La bibliothèque gérant les connexions SPI
#include <SPI.h>
//La bibliothèque gérant les nrf24L01+
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
//La bibliothèque gérant le serveur sur Ethernet
#include <Ethernet.h>
//L'adresse MAC du shield Ethernet
byte mac[] = { ici votre adresse mac du shield ethernet };
//L'objet contenant le serveur écoutant sur le port 80
EthernetServer server(80);
//L'adresse FIXE sur laquelle le serveur écoute
IPAddress ip(ici l ip du shield ethernet);
//Les dernières valeurs des capteurs
int lastTemp = 0;
int lastHumi = 0;
int lastSol = 0;
int lastSolGood = 0;
int lastLight = 0;
int lastSecheresse = 0;
int Secheresse =0;
int PinLed=6; //LED témoin de seuil de sécheresse
//Les valeurs des capteurs ont-elles changé depuis le dernier envoi de données via Ethernet ?
boolean valuesHaveChanged = false;
void setup()
{
//On initie la connexion Série (via USB)
Serial.begin(9600);
Serial.println("Démarrage du capteur.");
/*
* On initialise le nrf24L01
*/
Mirf.spi = &MirfHardwareSpi;
Mirf.init();
Mirf.setRADDR((byte *)"serv0");//Le nom du serveur dans le réseau d'émetteurs-recepteurs.
Mirf.payload = 12;//La longueur d'un paquet exprimée en octets
Mirf.config();
Serial.println( "nRF24L01+ initialise!" );
//On démarre le serveur en lui fournissant une adresse MAC et une IP
Ethernet.begin(mac, ip);
server.begin();
//On affiche l'ip du serveur de manière à voir si tout va bien
Serial.print("Adresse du serveur obtenue sans DHCP: ");
Serial.println(Ethernet.localIP());
}
void loop()
{
//On récupère une connexion entrante sur le serveur web, si une se présente
EthernetClient client = server.available();
//Si des données sont disponibles via les ondes (nrf24L01+)
if(Mirf.dataReady())
{
//On crée le tableau qui va contenir les données
byte datas[6];
//On récupère et place les données dans le tableau
Mirf.getData(datas);
//On les affiche via le port série pour débugger
Serial.print("Temp:");
Serial.println(datas[1]);
Serial.print("Humi:");
Serial.println(datas[2]);
Serial.print("Sol:");
Serial.println(datas[3]);
Serial.print("Light:");
Serial.println(datas[4]);
Serial.print("Secheresse:");
Serial.println(datas[5]);
/* Si le serveur detecte un seuil de secheresse a 1 on allume la led d'alerte */
int Secheresse = (datas[5]);
Serial.print(Secheresse);
if (Secheresse==1) // si le capteur est au sec (valeur 1 numerique)
{
digitalWrite(PinLed, HIGH); // LED allumée
}
else {
digitalWrite(PinLed, LOW); // LED off car tout vas bien
}
//On les stocke afin de pouvoir les renvoyer
lastTemp = datas[1];
lastHumi = datas[2];
lastSol = datas[3];
lastSolGood = lastSol*4;
lastLight = datas[4];
lastSecheresse = datas[5];
//On indique au programme que les valeurs ont changés et qu'il y a donc des choses à renvoyer
valuesHaveChanged = true;
}
//Si on recupéré un client sur le serv' web
if (client)
{
Serial.println("Nouveau client");
boolean currentLineIsBlank = true;
//Tant que le client est connecté
while (client.connected())
{
//Tant qu'on a pas fini de lire sa requête
if (client.available())
{
//On lit un octet de la requete du client et on l'affiche sur le port série
char c = client.read();
Serial.write(c);
//Si on est face à un saut de ligne et que la ligne actuelle est déjà vide
if (c == '\n' && currentLineIsBlank)
{
//On répond à la requête avec nos données
client.println("HTTP/1.1 200 OK");//Code 200 = Tout s'est bien déroulé
client.println("Content-Type: application/xml");//On spécifie le MIME-TYPE des données qu'on envoit (XML)
client.println("Connection: close");
client.println();
client.println("<?xml version=\"1.0\"?>");//Entête du document XML
//L'element racine du document XML
client.println("<sensors>");
//On parcours tout nos capteurs
for (int i = 0; i < 1; i++)
{
//On crée un élement correspondant à chaque capteur
client.print("<sensor name=\"sns");
client.print(i);//Id du capteur
client.println("\">");
//On crée un élément enfant contenant les valeurs de température
client.print("<temperature>");
//Si les valeurs de capteurs ont changé, on les envoit
if(valuesHaveChanged)
client.print(lastTemp);
//Sinon on renvoit une chaine non-numérique
else
client.print("NaN");
client.println("</temperature>");
//On créé un élément enfant contenant les valeurs d'humidité
client.print("<humidity>");
//Si les données ont changé, on les envoit
if(valuesHaveChanged)
client.print(lastHumi);
//Sinon on renvoit une chaine non-numérique
else
client.print("NaN");
client.println("</humidity>");
//******
//On créé un élément enfant contenant les valeurs d'humidité du sol
client.print("<Sol>");
//Si les données ont changé, on les envoit
if(valuesHaveChanged)
client.print(lastSolGood);
//Sinon on renvoit une chaine non-numérique
else
client.print("NaN");
client.println("</Sol>");
//On créé un élément enfant contenant les valeurs de lumiere
client.print("<Light>");
//Si les données ont changé, on les envoit
if(valuesHaveChanged)
client.print(lastLight);
//Sinon on renvoit une chaine non-numérique
else
client.print("NaN");
client.println("</Light>");
client.println("</sensor>");
}
//On ferme l'élement racine
client.println("</sensors>");
break;
}
//Si on saute une ligne
if (c == '\n')
{
//C'est qu'on démarre une nouvelle ligne
currentLineIsBlank = true;
}
else if (c != '\r')
{
//On a un caractère sur la ligne courante, elle n'est pas vide
currentLineIsBlank = false;
}
}
}
//On laisse au navigateur client le temps de récuperer les données
delay(1);
//On déconnecte le client
client.stop();
Serial.println("client deconnecte");
}
}