Capteur humidité et température ambiante

Le capteur DHT11 permet de prendre avec la même sonde la température ainsi que le taux d’humidité ambiant.

dht11.resized

Pour l’utiliser nous devons inclure une librairie dans notre programme. Vous pouvez télécharger au bas de la présente page celle que nous avons utilisée.

Montage avec entrée analogique

montage_dht11

 

Schéma entrée analogique

schema_dht3

 

Montage entrée numérique

La sonde DHT11 peut être utilisée en numérique également (lecture plus rapide), on peut changer l’entrée A0 pour une entrée numérique (disons 8). Il faudra changer le programme ci-dessous en conséquence.

Programme

Le programme affiche dans le moniteur série la température et l’humidité.

Note : Blockly@rduino ne peut pas être utilisé ici. La version d’avril 2016 de Blockly@rduino permet de programmer cette sonde (ajouter les blocs Grove). Voici à quoi ça pourrait ressembler (version xml) : 

humidite_temperature_v2

#include <dht.h>
#define dht_apin A0 // Capteur connecté à A0 pour analogique
// #define dht_apin 8 // Capteur connecté à 8 pour numérique
dht DHT;
 
void setup(){
 Serial.begin(9600);
 delay(500);//On donne du temps pour démarrer
 Serial.println("DHT11 capteur Humidite & temperature \n\n");
 delay(1000);//Attendre avant de lire les capteurs
}
void loop(){
 DHT.read11(dht_apin);
 Serial.print("Humidite = ");
 Serial.print(DHT.humidity);
 Serial.print("% ");
 Serial.print("temperature = ");
 Serial.print(DHT.temperature); 
 Serial.println("C ");
 delay(5000);//Attendre 5s avant la prochaine lecture
 //Le plus rapide serait de 2s
}

Exemples de données

DHT11 capteur Humidite & temperature

Humidite = 18.00% temperature = 25.00C 
Humidite = 17.00% temperature = 25.00C 
Humidite = 17.00% temperature = 25.00C 
Humidite = 19.00% temperature = 25.00C 
Humidite = 32.00% temperature = 27.00C  (expiré sur le capteur)
Humidite = 40.00% temperature = 28.00C 
Humidite = 42.00% temperature = 29.00C 
Humidite = 44.00% temperature = 28.00C

Librairie nécessaire

Détecteur d’obstacle

Pour un robot bolide, détecter un obstacle peut être intéressant (un mur par exemple). Le détecteur utilisé est celui-ci (voir aussi cette page) :

detecteur_obstacle

  • GND : Mise à la terre
  • + : 5V
  • OUT : signal de sortie (0 ou 1)
  • EN : non utilisé
  • On doit ajuster les potentiomètres pour optimiser la lecture
  • La distance de détection n’est pas très grande (~ 10 cm)

Montage

montage_detecteur_obstacle2

Schéma

schema_detecteur_obstacle2

 

Programme

On allume la DEL verte (sortie 5) s’il n’y a pas d’obstacle (entrée 9 à HIGH), on allume la DEL rouge (sortie 7) si obstacle.

blockly_detecteur_obstacle

void setup()
{
 pinMode(9, INPUT);
 pinMode(7, OUTPUT);
 pinMode(5, OUTPUT);
}
void loop()
{
 if (digitalRead(9) == LOW) {
 digitalWrite(7, HIGH);
 digitalWrite(5, LOW);
} else {
 digitalWrite(7, LOW);
 digitalWrite(5, HIGH);
}
}

Vidéo présentant le résultat

 

Détecteur de ligne

Un capteur intéressant pour les robots «bolides» est le détecteur de ligne (intensité lumière réfléchie). Voici à quoi ressemble celui fourni dans l’ensemble de 24 capteurs que nous nous sommes procurés (cliquer pour agrandir) :

IR_senseur_ligne_cote

Suggestion : Pour suivre une ligne, deux de ces capteurs (gauche, droit) devraient faire partie de votre robot (voir cette page en anglais)

Défi : Faire allumer une DEL selon l’intensité de lumière réfléchie.

Un peu de théorie

Un détecteur de ligne envoie de la lumière (avec DEL) vers une surface, une résistance photo-dépendante (LDR) mesure la quantité de lumière réfléchie. Voir le schéma ci-dessous.

principe_detecteur_ligne2

Plus il y a de lumière réfléchie, moins la résistance photo-dépendant est grande, donc la DDP de sortie (A0) sera moindre.

Sous-défi (pour 2e cycle secondaire)

Il est possible d’analyser ce circuit et de trouver la relation entre la DDP du signal de sortie et la valeur de la résistance LDR (U=R*I, Réq = R1 + R2).

Montage

montage_detecteur_ligne

Schéma électrique

schema_detecteur_ligne2

Programmation

Nous faisons allumer ici la DEL verte pour signaler que le programme tourne. La DEL jaune allume sur une couleur pâle (A0 < 50), la DEL rouge allume sur une couleur foncée (A0 > 650). Version XML.

detecteur_ligne_v2

 

void setup()
{
  Serial.begin(9600);

  pinMode(A0, INPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
}


void loop()
{
  Serial.print("Sortie du capteur :");
  Serial.println(analogRead(A0));
  delay(1000);
  digitalWrite(5, HIGH);
  if (analogRead(A0) <= 50) {
    digitalWrite(6, HIGH);
    digitalWrite(7, LOW);

  } else if (analogRead(A0) >= 650) {
    digitalWrite(7, HIGH);
    digitalWrite(6, LOW);
  }

}

Note : Le potentiomètre sur le capteur sert à améliorer la sensibilité. À utiliser pour avoir de meilleurs résultats.

Une vidéo du petit projet :

 

Intensité lumineuse et distance

Une photorésistance peut être utilisée pour tenter de modéliser l’effet de la distance sur l’intensité lumineuse d’une source.

intensite_lumineuse2

 

Schéma électrique

schema_intensite_lumineuse2

 

Programme (version XML)

intensite_lumineuse_distance_v2

 

void setup()
{
  Serial.begin(9600);

  pinMode(A0, INPUT);
}


void loop()
{
  Serial.print("Intensité lumineuse :");
  Serial.println(analogRead(A0));

}

Prise de données

Voici un schéma de l’expérience où nous avons utilisé la photoréristance pour modéliser le lien entre l’intensité lumineuse d’une source (ici une ampoule de 25 W) et la distance (ici nous avons utilisé les tuiles du plancher comme unité de mesure).

exp_intensite_distance

Les données brutes

0 1014
1 949
2 874
3 809
4 746
5 697
6 650
7 597
8 578
9 550
10 534
11 518
12 526

Calculons les Lux

Grâce à ce forum, nous pouvons transformer les données brutes (variation entre 0 et 1023) en mesure de Lux (lumen / m²).  Le code Arduino ressemble à ceci :

 photocellReading0 = analogRead(photocellPin0);// Lire la sortie A0
 float Vout0=photocellReading0*0.0048828125; // calcul DDP
 int lux0=500/(Res0*((5-Vout0)/Vout0)); // Calcul des Lux

Données en Lux

Distance Lux
0 5070
1 632
2 291
3 188
4 134
5 106
6 86
7 69
8 64
9 58
10 54
11 51

Les points (Geogebra)

courbe_intensite_ditance

Ce qui semble confirmer la théorie (1/r²).

Construire sa sonde d’humidité du sol

Une sonde n’est qu’un circuit qui laisse passer du courant selon le capteur utilisé (son, température, champ magnétique, etc).

Pour avoir une idée de l’humidité du sol (pot de fleur par exemple), on peut utiliser tout simplement la propriété électrolytique d’une solution (ici eau + terre). Si le sol est sec, le courant passera moins bien que si le sol est humide.

Inspiration : Ici et .

PFEQ

Mots-clés : électrolyte, circuit, mesure DDP, isolant, résistance, oxydation, univers vivant (besoins d’une plante).

Voici un montage pour mesurer cette conductibilité :

Capteur humidité - clous

À noter que nous utilisons ici 2 clous (galvaniser de préférence pour éviter une oxydation trop rapide), séparer d’environ 2 cm par un matériau isolant, sur lesquels nous avons ajouter un isolant afin d’aller prendre la mesure à une certaine profondeur dans la terre (l’humidité du sol varie en fonction de la profondeur). Voici une photo de notre sonde (au lieu du ruban, utiliser du silicone comme isolant pour une sonde plus durable) :

sonde_hum

Le code pour lire la valeur prise à la broche A0 et l’envoyer dans le port série est le suivant (version xml) :

humidite_sol

 

void setup()
{
  Serial.begin(9600);

  pinMode(A0, INPUT);
}


void loop()
{
  Serial.print("Valeur humidité : ");
  Serial.println(analogRead(A0));

}

Le traitement de cette donnée (que nous aurons à «calibrer» pour trouver les valeurs «trop sec» et «adéquat») peut se faire de différente façon, mais dans l’exemple ci-dessous nous allumons une DEL de couleur différente selon le taux d’humidité du sol. On peut facilement modifier le tout pour faire démarrer une pompe à une valeur précise (voir ce défi).

Montage

montage_sonde_humidite

Schéma électrique

schema_sonde_humidite

Programmation

Fichier XML (à importer dans Blockly@rduino).

sonde_humidite_sol_del

Le code Arduino :

{
  Serial.begin(9600);

  pinMode(A0, INPUT);
  pinMode(7, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(5, OUTPUT);
}


void loop()
{
  Serial.print("Humidité : ");
  Serial.println(analogRead(A0));
  delay(2000);
  if (analogRead(A0) < 500) {
    digitalWrite(7, HIGH);
    digitalWrite(6, LOW);
    digitalWrite(5, LOW);

  } else if (analogRead(A0) >= 500 && analogRead(A0) <= 700) {
    digitalWrite(7, LOW);
    digitalWrite(6, HIGH);
    digitalWrite(5, LOW);
  } else if (analogRead(A0) > 700) {
    digitalWrite(7, LOW);
    digitalWrite(6, LOW);
    digitalWrite(5, HIGH);
  }

}

Photos du montage

IMG_20160223_102130.resized

IMG_20160223_110201.resized