Code pour ServeurWeb Arduino : XML

Cette article est une annexe de l’article « Faire communiquer Jeedom et un Arduino en DIY« 

Vous trouverez ci-dessous le sketch pour l’Arduino. Il faudra personnaliser les lignes suivantes :

  • ligne 25, l’@IP de votre box Jeedom
  • ligne 28, l’@IP de l’Arduino (pour le mettre en IP fixe)
  • ligne 31, l’@IP de votre BOX

A noter que les 30 premières secondes, la sonde n’est pas interrogée donc ne renverra pas de résultat (algo à améliorer).

Voici le code :

#include <SPI.h>
#include <Ethernet2.h>

#include "dht22.h"

#include "TM1637_modif.h"
//{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
//0~9,A,b,C,d,E,F

#define DHT11PIN 2     // PIN pour la sonde DHT11

#define CLK 3 // Pins pour l'afficheur TM1637
#define DIO 4

// On créé l'objet pour la sonde DHT11
DHT dht(DHT11PIN, DHT11);

// On créé l'objet pour l'afficheur 4 digit
TM1637 tm1637(CLK,DIO);

// L'adresse MAC pour le shield
byte mac[] = { 0xAE, 0xAD, 0xAE, 0xAE, 0xAE, 0xAD };

// IP de la box Jeedom
IPAddress IPjeedom(192,168,45,250);

// IP de cet arduino (ip fixe)
IPAddress IParduino(192, 168, 45, 88);

// IP de la freebox (va servir pour : dns, passerelle)
IPAddress IPfreebox(192,168,45,254);

// On initialise la librairie server
EthernetServer server(80);

// Variables pour comparer l'ancienne valeur des sondes à la nouvelle
int t_old = 0;
int h_old = 0;

// POUR DEBUG
// Variable pour compter le nombre de connexion échouée de client.connect
int NombreErreurReseau = 0 ;
int NombreErreurReseau_old = -1;
int NombreProblemeDeconnexion = 0 ;

// Variable de Tempo pour déclenchement de lecture
unsigned long previousMillis = 0;

// Pour faire clignoter les deux point du 4digit (permet de voir si le code n'est pas planté)
boolean StatutDoublePoint=0;

void setup() {
  // On initialise la sonde DHT11
  dht.begin();

  // On initialise l'afficheur à 4 digit
  tm1637.init();
  tm1637.set(BRIGHT_TYPICAL); 
  
  // On ouvre le port série pour DEBUG
  Serial.begin(9600);

  // On initialise le shield avec IP fixe
  Ethernet.begin(mac, IParduino , IPfreebox , IPfreebox);
  
  // On attend que le shield s'initialise
  delay(500);

  server.begin();
  Serial.print(F("Le serveur est disponible ici : "));
  Serial.println(Ethernet.localIP());
 
  Serial.println(F("*** Fin de la configuration ***"));
}
 
void loop()
{
    unsigned long currentMillis = millis();
    
    int h = dht.readHumidity();
    int t = dht.readTemperature();
      
    // S'il s'est écoulé 30 secondes,
    if ( currentMillis - previousMillis >= 30000 ) 
    {
      previousMillis = currentMillis;
   
      int h = dht.readHumidity();
      int t = dht.readTemperature();

      Serial.print(F("T11 "));
      Serial.print(t);
      Serial.print(F("C - H11 "));
      Serial.print(h);
      Serial.print(F("%"));
      Serial.print(F("C || Millis : "));
      Serial.print(millis()/1000);
      Serial.print(F(" || NbPbDeco : "));
      Serial.print(NombreProblemeDeconnexion);
      Serial.print(F(" || NbErReseau : "));
      Serial.println(NombreErreurReseau);
  
      // Lance la fonction pour afficher la température sur l'afficheur 4 digit
      Affiche4Digit(t,h);
    }

    // On écoute pour voir si un client (Jeedom) se connecte au serveur (Arduino)
    LireTrame(t,h);
}

void Affiche4Digit(int temp, int hum)
{
    int digitoneT = temp / 10; // on récupère le premier des deux chiffres
    int digittwoT = temp % 10; // on récupère le second des deux chiffres
 
    // Si les deux points ne sont pas présent, on les mets. Sinon on les enlève
    // Permet de vérifier si le sketch est planté : chgmt d'état toutes les 30 sec
    if(StatutDoublePoint==0)
    {
      tm1637.point(1);  
      StatutDoublePoint=1;
    }
    else
    {
      tm1637.point(0);  
      StatutDoublePoint=0;
    }
    
    tm1637.clearDisplay(); // On enlève ce qui est affiché
    tm1637.display(0,digitoneT); // on affiche le premier chiffre à la position 1 (0)
    tm1637.display(1,digittwoT); // on affiche le premier chiffre à la position 2 (1)
    tm1637.display(3,12);  // on affiche un "C" (12) en position 4 (3)
}

// Fonction permettant de lire les requêtes HTTP d'un client
// et de renvoyer un fichier XML au client
// Premier paramétre correspond à la température de la sonde
// Deuxième paramètre correspond à l'humidité de la sonde
// Ce choix de passer les données en argument de la fonction n'est pas très judicieux à terme mais c'était pour le test.
void LireTrame(int temp11Lu, int hum11Lu)
{
  EthernetClient clientIncoming = server.available();
  if (clientIncoming) 
  {
    Serial.println("new client");
    boolean currentLineIsBlank = true;
    while (clientIncoming.connected()) 
    {
      if (clientIncoming.available()) {
        char c = clientIncoming.read();
        Serial.write(c);
        if (c == '\n' && currentLineIsBlank) {
          clientIncoming.println("HTTP/1.1 200 OK");
          clientIncoming.println("Content-Type: text/xml");
          clientIncoming.println("Connection: close");
          clientIncoming.println();
          clientIncoming.println("<root>");
          clientIncoming.println("<temp11>");
          clientIncoming.println(temp11Lu);
          clientIncoming.println("</temp11>");
          clientIncoming.println("<humidite11>");
          clientIncoming.println(hum11Lu);
          clientIncoming.println("</humidite11>");
          clientIncoming.println("</root>");
          break;
        }
        if (c == '\n') {
          currentLineIsBlank = true;
        } else if (c != '\r') {
          currentLineIsBlank = false;
        }
      }
    }
    // On laisse le temps au serveur de recevoir les données
    delay(50);
    // On ferme la connexion
    clientIncoming.stop();
    Serial.println("client disconnected");
  }
}
Code pour ServeurWeb Arduino : XML
Si vous souhaitez partager cet article...Share on Facebook
Facebook
Share on Google+
Google+
Tweet about this on Twitter
Twitter