Projet IMA3 P7, 2016/2017, TD2

De Wiki d'activités IMA
Révision datée du 18 juin 2017 à 14:41 par Groux (discussion | contributions) (Partie informatique)

Projet IMA3-SC 2016/2017 : Station météo connectée

Cahier des charges

Pour notre projet Système Communicant, nous avons choisi de réaliser une station météo qui pourrait mesurer la température, l'humidité et la pression atmosphérique. Nous pourrions songer également à relever la luminosité, la quantité de précipitation etc mais il faut rester vigilent au nombre de pins de l'Arduino. Grâce à celui-ci, nous pourrons réaliser une application web qui afficherait en détails les grandeurs mesurées.

=== Le matériel ===

  • Un capteur de pression (type BMP180)
  • Un capteur d'humidité (A0SONG AM2302)
  • Un capteur de température
  • Un Raspberry Pi
  • Une alimentation
  • Un Arduino
  • Une nanoboard
  • Plaque d'essais
  • Fils

Séance 1

Partie électronique

Pour le capteur AM2302, on constate que la broche de sortie SDA est une broche complexe et bidirectionnelle. On souhaite, grâce au FPGA, lire les informations envoyées par le capteur AM2302 toutes les n secondes. Pour lire une mesure, il faut envoyer un front descendant sur SDA, puis le capteur envoie 5 octets :

AM2302.jpeg

Pour pouvoir gérer la bidirectionnalité de la broche SDA, on utilisera un composant spécifique de Altium : le IOBUF

Voici les caractéristiques sensorielles du capteur de température et d'humidité

AM2302 sensor.jpeg

Partie informatique

Pour la programmation, nous avons décidé de ne pas utiliser la carte arduino mais plutôt un circuit logique programmable (puce FPGA). Cette puce servira à collecter les informations envoyées par les différents capteurs et les convertir en valeurs numériques pour pouvoir les afficher sur notre application web.

Séance 2

Partie électronique

Etude de la transmission d’informations avec la sonde AM2302 : Attendre la détection d’un front descendant (entre 0,8 et 20 ms) envoyé par l’utilisateur. On reçoit ensuit un signal haut nommé Tgo qui correspond à la libération du bus de données compris entre 20 et 200 us On recoit une réponse du signal bas et une réponse du signal haut compris tous les duex entre 75 et 85 µs Ensuite, la transmission des 40 caractères de données commence. Pour chaque bit, le capteur envoie un signal bas puis un signal haut.
Pour envoyer un 0 ou un 1, le temps du signal bas (TLOW) ne varie pas. C’est donc grâce au temps de signal haut que l’on va distinguer la reception d’un « 0 » ou d’un « 1 » Pour compter le temps de signal haut et savoir si le capteur nous a envoyé un 1 ou un 0, il faut détecter le front montant, lancer un compteur toutes les 1 µs puis détecter un front descendant pour arrêter le compteur.
Si 48 < compteur < 55 µs, alors le capteur nous a envoyé un « 0 »
Si 22 < compteur < 30 µs, alors le capteur nous a envoyé un « 1 » Après avoir envoyé 40 bits de données à traiter, le capteur envoie un dernier signal bas compris entre 45 et 55 µs pour indiquer que la transmission est terminée

Capture1.png


Capture2roux.png


Capture3.png


Capture4.png


Grâce à ce compteur, nous stockons chaque bit reçu grâce à des bascules D. Une fois les 5 octets de données récupérées, il suffit d’effectuer quelques opérations mathématiques pour récupérer les valeurs décimales du pourcentage d’Humidité et de la température. Voici à quoi correspondent les 5 octets reçus : Le temps maximum de réception est (55 + 75 µs) x 8 x 5 = 5,2 ms.
C’est l’intervalle de temps minimum avec lequel on peut récupérer une nouvelle valeur de température et d’humidité. 


Capture5.png


Pour vérifier que les informations reçues sont correctes, on additionne les 4 premiers octets (HH + HL + TH + TL). Si cette somme est égale au dernier octet (Parity bit), alors la transmission est correcte. Pour avoir la valeur décimale de l’hygrométrie (en %), on converti en décimal les deux octets HH et HL puis on divise cette valeur par 10. On applique les mêmes manipulations pour la température en °C. Exemple : 40 bits recus : 0000 0010 1001 0010 0000 0001 0000 1101 1010 0010
High Humidity Low Humidity High Temperature Low Temperature Parity bit Calculs : 0000 0010 + 1001 0010 + 0000 0001 + 0000 1101 = 1010 0010
Ici, cette égalité est vraie, donc la transmission est correcte. Humidité : 0000 0010 1001 0010 = 0292H = 2 x 256 + 9x16 + 2 = 658 
On divise cette valeur décimale par 10
 Humidité = 65,8%RH Température : 0000 0001 0000 1101 = 010DH = 1 x 256 + 0 x x16 + 13 = 269
On divise cette valeur décimale par 10
 Température = 26,9°C

Partie informatique

Lors de cette deuxième séance nous nous sommes intéressé au programme arduino de nos deux capteurs : Le BMP180 et la sonde DHT22

Voici donc leur code arduino : BMP180 (on télécharge la librairie Adafruit_BMP085 préalablement)

  1. include <Wire.h>
  2. include <Adafruit_BMP085.h>

Adafruit_BMP085 bmp;

void setup() {

 Serial.begin(9600);
 if (!bmp.begin()) {
   Serial.println("Could not find a valid BMP085 sensor, check wiring!");
   while (1) {}
 }

}

void loop() {

   Serial.print("Temperature = ");
   Serial.print(bmp.readTemperature());
   Serial.println(" *C");  
   Serial.print("Pressure = ");
   Serial.print(bmp.readPressure());
   Serial.println(" Pa");
   
   // Calculate altitude assuming 'standard' barometric
   // pressure of 1013.25 millibar = 101325 Pascal
   Serial.print("Altitude = ");
   Serial.print(bmp.readAltitude());
   Serial.println(" meters");
   Serial.print("Real altitude = ");
   Serial.print(bmp.readAltitude(101500));
   Serial.println(" meters");
   
   Serial.println();
   delay(500);

}

Pour le DHT22

{

  1. include "DHT.h"
  2. define DHTPIN 2
  3. define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);

void setup()

{
 Serial.begin(9600); 
 Serial.println("DHTxx test!");
 dht.begin();

}

void loop() {

 float h = dht.readHumidity();
 float t = dht.readTemperature();
 if (isnan(t) || isnan(h)) {
 Serial.println("Failed to read from DHT");
 } 

else {

   Serial.print("Humidity: "); 
   Serial.print(h);
   Serial.print(" %\t");
   Serial.print("Temperature: "); 
   Serial.print(t);
   Serial.println(" *C");
 }

}

Séance 3

Partie électronique

Lors de la troisième séance nous avons décider de créer la partie FPGA de notre système. Après avoir réaliser le tutoriel proposé nous avons essayé de comprendre la façon dont fonctionne nos capteurs afin de réaliser au mieux l'interface FPGA afin de réussir a lire les informations envoyé par les capteurs. Malgré de nombreux essais et de nombreuse recherche sur internet nous n'avons pas réussi a aboutir a un sytème concret afin de lire les information.

Voici les différent lien qui nous nt aidé dans la réalisation de notre projet :

BMP180 Datasheet BMP180

Et pour le DHT22 nous avons trouvé ce model : DHT22.png

Partie informatique

Pour cette partie informatique nous avons suivi quelque tutoriel afin de créer une page HTML qui nous servira d'application WEB. Voici le code HTML :

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Station météo</title> </head> <body>

Station météo

Roux-Mairesse

Bienvenue sur notre station météo connectée

<button onclick="requeteEnvoi();">Affichage des données</button>

Température DHT122 Température BMP180 Humidité Pression
0 °C 0 °C 0 % 0 hPa

</body> </html>

Web2.png

Cependant, après avoir réaliser cette partie nous ne savons pas comment obtenir les information des capteurs obtenu par arduino et les envoyer sur notre page web...

Séance supplémentaire 1

Partie électronique

Partie informatique

Conclusion