Code pour ServeurWeb Arduino : GET

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 16, la clé API Jeedom que vous trouverez dans « configuration » – « configuration générale » – « Clef API »
  • ligne 28 et ligne 182, l’@IP de votre box Jeedom
  • ligne 31, l’@IP de l’Arduino (pour le mettre en IP fixe)
  • ligne 34, 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.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

// la clé API de Jeedom pour le 'virtuel'
String APIKEYJEEDOM = "blablablablablabla"; 

// 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 créé l'objet client pour la connexion au serveur
EthernetClient client;

// 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);

  Serial.println(F("*** Fin de la configuration ***"));
}
 
void loop()
{
    unsigned long currentMillis = millis();
    
    // 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);
  
      if(t_old != t)
      {
        // POUR DEBUG
        // unsigned long DebutEnvoi = millis();
        
        // lance la fonction pour envoyer en GET les infos
        EnvoiTrame(388,t);
        t_old = t ;
        
        /* POUR DEBUG
        unsigned long FinEnvoi = millis();
        Serial.print(F("Debut envoi : "));
        Serial.print(DebutEnvoi);
        Serial.print(F(" - Fin envoi : "));
        Serial.print(FinEnvoi);
        Serial.print(F(" - Duree totale : "));
        int DureeEnvoi = FinEnvoi - DebutEnvoi;
        Serial.println(DureeEnvoi);*/
      }
      
      if(h_old > (h+2) || h_old < (h-2) )
      {
        EnvoiTrame(390,h);
        h_old = h ;
      }

      if(NombreErreurReseau_old != NombreErreurReseau)
      {
        // Pour le DEBUG, j'envoi dans un virtuel le nombre d erreur réseau survenue
        EnvoiTrame(396,NombreErreurReseau);
        NombreErreurReseau_old = NombreErreurReseau;
      }
  
      // Lance la fonction pour afficher la température sur l'afficheur 4 digit
      Affiche4Digit(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 d'envoyer en HTTP, une commande type GET au serveur
// Premier paramétre correspond à l'ID du virtuel dans Jeedom (un ID par valeur à récupérer)
// Deuxième paramètre correspond à la valeur à envoyer pour cet ID
void EnvoiTrame(int ID,int ValeurAEnvoyer)
{
  // On connecte le client au serveur
  int StatutConnexion = client.connect(IPjeedom, 80);

  // Si le client est bien connecté au serveur
  if (StatutConnexion) {
    // POUR DEBUG
    //Serial.print("Connexion OK || ");
  
    client.print(F("GET /core/api/jeeApi.php?apikey="));
    client.print(APIKEYJEEDOM);
    client.print(F("&type=virtual&id="));
    client.print(ID);
    client.print(F("&value="));
    client.print(ValeurAEnvoyer);
    client.println(F(" HTTP/1.1"));
   
    client.println(F("Host: 192.168.45.250"));
    client.println(F("Connection: close"));
    client.println();
  }
  // Sinon (le client n'est pas connecté au serveur)
  else 
  {
    NombreErreurReseau++;
    //POUR DEBUG
    /*Serial.print(F("** Connection failed-code erreur :  "));
    Serial.print(StatutConnexion);
    Serial.print(F(" - ID/Valeur = "));
    Serial.print(ID);
    Serial.print(F("/"));
    Serial.println(ValeurAEnvoyer);*/
  }

  client.flush();
  
  // Petite tempo pour que l'envoi et la réception de la réponse se fasse
  delay (250);

  // Pour DEBUG
  /*
  int CompteurCodeHTTP = 0; // Pour compter les 15 premiers caractères de la réponse du serveur

  // S'il y a une réponse du serveur
  // client.available() = Retourne le nb de bit disponible pour les lire
  while (client.available()) 
  {
    char c = client.read();
    // Affiche la première ligne de ce que retourne le serveur (code HTTP)
    if (CompteurCodeHTTP != 15)
    {
      Serial.print(c);
      CompteurCodeHTTP++;
    }
  }
  Serial.println();
  */
   
  // Si le client est déconnecté
  if (!client.connected()) {
    // POUR DEBUG
    //Serial.println("Deconnexion OK");
    //Serial.println();
  }
  else
  {
      // POUR DEBUG
      // Serial.println(F("Deconnexion : le client etait encore connecte")); // C'est normal si on ne lit pas la réponse du client
      NombreProblemeDeconnexion++;
  }
  // On arrête le client avant de sortir (même s'il est encore connecté)
  client.stop();
}
Code pour ServeurWeb Arduino : GET
Si vous souhaitez partager cet article...Share on Facebook
Facebook
Share on Google+
Google+
Tweet about this on Twitter
Twitter