Mise en pratique avec les capteurs
Sommaire du chapitre
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.
Branchements

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 :
#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.

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
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 :
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].
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 :
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é :
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
Le code complet est disponible en faisant un clic-droit puis Copy link Adress sur le lien suivant :
#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);
Le code complet est disponible en faisant un clic-droit puis Copy link Adress sur le lien suivant :
//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 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 :
Branchements

Code complet
#define TRIGGER_PIN D5 //Broche Trigger
#define ECHO_PIN D6 //Broche Echo
Utilisation d'un capteur PIR
Branchements

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
Utilisation d'un écran OLED
Récupération de l'adresse I2C
#include 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

