PrécédentUne amélioration possible4 / 10SuivantAccès global au réseau
4. Les serveurs Web

Mise en pratique avec les capteurs

Mise en pratique avec les capteurs

Les codes suivants seront utilisés avec le serveur Web mis en place avec l'ESP12.
Cela permettra de réaliser une interface plus élaborée avec des capteurs et actionneurs.

Utilisation du DHT11

Objectif

L'intégration du code permettant de lire la température permettra d'obtenir l'interface suivante, à savoir un graphique pour visualiser la température et l'humidité en temps réel.
Le rendu de l'interface
Le rendu de l'interface

Branchements

Le branchement du module DHT
Le branchement du module DHT

Programme de test

Avant de tester le code complet du DHT11/22 avec le serveur Web , on va essayer le module DHT sans le serveur. Pour cela, on va téléverser le programme suivant [1]FILEtemperature\_humidite.ino} :

💡

Le code complet est disponible en faisant un clic-droit puis Copy link Adress sur le lien suivant :

C++

Programme DHT11/22 minimaliste

#include "DHT.h"
    #define DHTPIN D2     //Broche du capteur
    
    #define DHTTYPE DHT11   // DHT 11
    //#define DHTTYPE DHT22   // DHT 22 
    //#define DHTTYPE DHT21   // DHT 21 
    
    DHT dht(DHTPIN, DHTTYPE);
    
    void setup() 
      
      Serial.begin(115200);
      dht.begin();          //Initialisation du capteur
    
    
    void loop() 
    
      float h = dht.readHumidity();       //Récupère la température
      float t = dht.readTemperature();    //récupère l'humidité
    
      Serial.print("Humidite: ");
      Serial.print(h);
      Serial.print("\%  Temperature: ");
      Serial.print(t);
      Serial.println("C ");
      
      delay(2000);
    
    

Si vous obtenez le résultat suivant en lançant la console série, c'est que le capteur est fonctionnel.

Le capteur DHT fonctionnel
Le capteur DHT fonctionnel

Il ne vous reste plus qu'à lancer le programme FILEServeur\_Web\_DHT11\_Graphe.ino.

Explications

Pour gérer les températures et les valeurs d'humidité dans le temps, un tableau 'circulaire' est utilisé dans le programme.
Il consiste à remplir au fur et à mesure un tableau et quand celui-ci est plein, on décale les valeurs pour ajouter la dernière.

Prenons un exemple avec un tableau de 5 éléments auquel on cherche à ajouter le cycle suivant : 21,22,21,22,23,24,25,26

Les tableaux 'circulaires' Etape Initial 0 0 0 0 0 Ajout de '21' 21 0 0 0 0 Ajout de '22' 21 22 0 0 0 Ajout de '21' 21 22 21 0 0 Ajout de '22' 21 22 21 22 0 Ajout de '23' 21 22 21 22 23 Ajout de '24' 22 21 22 23 24 Ajout de '25' 21 22 23 24 25 Ajout de '26' 22 23 24 25 26
Les tableaux 'circulaires'

Ce mouvement cyclique est géré par la fonction FUNCupdateRings dans le fichier LIBcircularRings.h

La fonction principale pour gérer le graphique est la fonction FUNCgetString :

C++

Lecture de la température et de l'humidité

temperature = dht.readTemperature();
    humidity  = dht.readHumidity();

Une fois ces deux données lues, on actualise les tableaux circulaires contenant les températures, les valeurs d'humidité et les références du graphique  [2].

C++

Actualisation des tableaux

updateRings(¤t_index, NB_DATA_TEMP, temperature, humidity); //Mise à jour des tableaux

On créer ensuite les chaînes de caractères pour générer le graphique :

C++

Génération du graphique

String dataTemperatures = concatenateArray(temperatures, current_index);
    String dataHumidities = concatenateArray(humidities, current_index);
    String dataReferences = concatenateArray(references, current_index); //Tableau contenant toutes les valeurs à 0, pour afficher la référence sur le graphique
    
    String dataTime ="[";
    for (int i=current_index;i>0;i–) 
      dataTime += "'"+String(i)+"',";
    
    dataTime += "]";

Une fois toutes les données, on génère la page dans son intégralité :

C++

Génération de la page

const String fullPageContent = "\
\
  Serveur Web CREPP\
   \
  \
  \
    \
  \
\
  

Interface ESP12


\

Contrôle de la LED sur la broche D4


\ \

\

Mesure de la température et humidité avec le module DHT11 sur la broche D2


\
\ >>> Temperature : "+String(temperature)+" C
\ >>> Humidite : "+String(humidity)+"
\ \ \ ";
💡

Le code complet est disponible en faisant un clic-droit puis Copy link Adress sur le lien suivant : Utilisation du HC-SR04

Branchements

Branchement du capteur
Branchement du capteur

Code complet

💡

Le code complet est disponible en faisant un clic-droit puis Copy link Adress sur le lien suivant :

C++

Code complet pour le capteur HCSR-04

#define TRIGGER_PIN D5  //Broche Trigger
#define ECHO_PIN D6     //Broche Echo

#define SOUND_VELOCITY 0.034 //Vitesse en cm/us

float distance = 0.0;

void setup()

Serial.begin(9600); //Communication à 9600 bauds pinMode(TRIGGER_PIN, OUTPUT); //Broche Trigger en sortie pinMode(ECHO_PIN, INPUT); //Broche Echo en entrée

digitalWrite(TRIGGER_PIN, LOW);

//End setup

void loop()

digitalWrite(TRIGGER_PIN, HIGH); //Envoie une impulsion de 10us delayMicroseconds(10); digitalWrite(TRIGGER_PIN, LOW); int duration = pulseIn(ECHO_PIN, HIGH); //Récupère le temps à l'état Haut de la broche ECHO

distance = duration * SOUND_VELOCITY/2; //Distance en cm, v=d/t

Serial.print("Distance (cm) = "); Serial.println(distance); delay(1000);

Utilisation d'un capteur PIR

Branchements

Branchement du capteur PIR
Branchement du capteur PIR

Code complet

💡

Le code complet est disponible en faisant un clic-droit puis Copy link Adress sur le lien suivant :

C++

Code complet

#define LED D2    //Broche de la LED
#define OUT D7     //Broche du capteur PIR
    
int status = LOW;     //Statut du mouvement : LOW : pas de mouvement détecté
bool outValue = 0;    //Valeur du capteur
long beginTime = 0;   //instant du déclenchement lors de la ldétection d'un mouvement
    
void setup() 

      
  pinMode(LED, OUTPUT); //LED en sortie
  pinMode(OUT, INPUT);  //Broche du capteur en entrée
  Serial.begin(9600);   //Vitesse de communication à 9600 bauds

//End setup void loop(){ outValue = digitalRead(OUT); //Lire létat du capteur if (outValue == HIGH) //Détection d'un mouvement { digitalWrite(LED, HIGH); //Allume la LED if (status == LOW) Serial.println(">>> Mouvement "); status = HIGH; //Mise à jour du statut du capteur beginTime = millis(); //Sauvegarde du temps //End if } else //Aucun mouvement { digitalWrite(LED, LOW); //Eteint la LED if(status == HIGH) //Fin de détection Serial.print(">>> Fin du mouvement"); status = LOW; //Mise à jour du statut du capteur unsigned long duree = millis() - beginTime; //Calcul de la durée du mouvement Serial.print(">>> Duree = "); Serial.print(duree); Serial.println(" ms"); //End if }//End else }//End loop

Utilisation d'un écran OLED

Récupération de l'adresse I2C

Pour tous les périphériques I2C, il convient de connaître l'adresse du périphérique. Or parfois on ne s'en rappel plus. Il existe un code qui permet de scanner toutes les adresses possibles et d'afficher l'adresse du composant qui est relié au bus I2C.

Voici le code, disponible dans les exemples de la classe Wire  [3] :

💡

Le code complet est disponible en faisant un clic-droit puis Copy link Adress sur le lien suivant :

C++

Un scanner I2C

#include 
     
  void setup()
  
  
    Wire.begin();
    Serial.begin(115200);
  
  
       
  void loop()
  {
    byte error, address;
    int nDevices;
       
    Serial.println("Scanning...");
       
    nDevices = 0;
    for(address = 1; address < 127; address++ )
    {
      Wire.beginTransmission(address);
      error = Wire.endTransmission();
       
      if (error == 0)
      {
        Serial.print("I2C device found at address 0x");
        if (address<16) 
          Serial.print("0");
        
        Serial.print(address,HEX);
        Serial.println("  !");
        nDevices++;
      }
      else if (error==4)
      {
        Serial.print("Unknow error at address 0x");
        if (address<16) 
          Serial.print("0");
         
        Serial.println(address,HEX);
      }    
    }
    if (nDevices == 0) 
      Serial.println("No I2C devices found");
    
    else 
      Serial.println("done");
    
    delay(5000);         
      
  }

Code complet

C++

Code complet

#include "SSD1306Ascii.h"
  #include "SSD1306AsciiAvrI2c.h"
   
  #define I2C_ADDRESS 0x3C
   
  SSD1306AsciiAvrI2c oled;
   
  void setup() 
  
    //Init size
    oled.begin(&Adafruit128x64, I2C_ADDRESS);
    oled.setFont(Adafruit5x7);  
    oled.clear();
    oled.set2X();
  
    
    oled.println("CREPP");
    oled.set1X();
    oled.println("Club de");
    oled.println("Robotique et");
    oled.println("d'Electronique");
    oled.println("Programmable");
   
  
  void loop() 
   
  

Branchements

Branchements de l'éran OLED
Branchements de l'éran OLED
L'écran OLED fonctionnel
L'écran OLED fonctionnel

Notes

  1. Fichier \lbl{red

  2. Tableau ne contenant que des '0'

  3. Classe qui gère le protocole I2C