Re: Capteur pour plantes vertes - WIP - Les codes et pb d'alim

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");
  }
  

}