LOSA Julian PERRIER Catalin Travail Pratique Partie A : Le capteur DHT11 Object
LOSA Julian PERRIER Catalin Travail Pratique Partie A : Le capteur DHT11 Objectif : Réaliser des mesures de températures et d’humidité Etude Le DHT11 est un capteur numérique de température et d'humidité basique et ultra-économique. Il utilise un capteur d'humidité capacitif et une thermistance pour mesurer l'air ambiant et crache un signal numérique sur la broche de données (aucune broche d'entrée analogique n'est nécessaire). Le capteur DHT11 possède un coût ultra bas, une alimentation 3 à 5V et E/S, 2,5 mA max d'utilisation du courant pendant la conversion (lors de la demande de données). Il a de bonnes capacités pour les lectures d'humidité de 20 à 80 % avec une précision de 5 %. Et est très performant pour les lectures de température de 0 à 50 °C, précision de ± 2 °C. Pas plus de 1 Hz de fréquence d'échantillonnage (une fois par seconde). Taille du corps 15,5 mm x 12 mm x 5,5 mm. Possède 4 broches avec espacement de 0,1". Schéma électrique : Programmation : Algorigramme Progamme /** * Exemple de code pour la lecture d'un capteur DHT11 ou DHT22. */ /** Broche "DATA" du capteur */ const byte BROCHE_CAPTEUR = 5; /* Code d'erreur de la fonction readDHT11() et readDHT22() */ const byte DHT_SUCCESS = 0; // Pas d'erreur const byte DHT_TIMEOUT_ERROR = 1; // Temps d'attente dépassé const byte DHT_CHECKSUM_ERROR = 2; // Données reçues erronées /** Fonction setup() */ void setup() { /* Initialisation du port série */ Serial.begin(115200); Serial.println(F("Demo DHT11 et DHT22")); /* Place la broche du capteur en entrée avec pull-up */ pinMode(BROCHE_CAPTEUR, INPUT_PULLUP); } /** Fonction loop() */ void loop() { float temperature, humidity; /* Lecture de la température et de l'humidité, avec gestion des erreurs */ // N.B. Remplacer readDHT11 par readDHT22 en fonction du capteur utilisé ! switch (readDHT22(BROCHE_CAPTEUR, &temperature, &humidity)) { case DHT_SUCCESS: /* Affichage de la température et du taux d'humidité */ Serial.print(F("Humidite (%): ")); Serial.println(humidity, 2); Serial.print(F("Temperature (^C): ")); Serial.println(temperature, 2); break; case DHT_TIMEOUT_ERROR: Serial.println(F("Pas de reponse !")); break; case DHT_CHECKSUM_ERROR: Serial.println(F("Pb de communication !")); break; } /* Pas plus d'une mesure par seconde */ // N.B. Avec le DHT22 il est possible de réaliser deux mesures par seconde delay(1000); } /** * Lit la température et le taux d'humidité mesuré par un capteur DHT11. * * @param pin Broche sur laquelle est câblée le capteur. * @param temperature Pointeur vers la variable stockant la température. * @param humidity Pointeur vers la variable stockant le taux d'humidité. * @return DHT_SUCCESS si aucune erreur, DHT_TIMEOUT_ERROR en cas de timeout, ou DHT_CHECKSUM_ERROR en cas d'erreur de checksum. */ byte readDHT11(byte pin, float* temperature, float* humidity) { /* Lit le capteur */ byte data[5]; byte ret = readDHTxx(pin, data, 18, 1000); /* Détecte et retourne les erreurs de communication */ if (ret != DHT_SUCCESS) return ret; /* Calcul la vraie valeur de la température et de l'humidité */ *humidity = data[0]; *temperature = data[2]; /* Ok */ return DHT_SUCCESS; } /** * Lit la température et le taux d'humidité mesuré par un capteur DHT22. * * @param pin Broche sur laquelle est câblée le capteur. * @param temperature Pointeur vers la variable stockant la température. * @param humidity Pointeur vers la variable stockant le taux d'humidité. * @return DHT_SUCCESS si aucune erreur, DHT_TIMEOUT_ERROR en cas de timeout, ou DHT_CHECKSUM_ERROR en cas d'erreur de checksum. */ byte readDHT22(byte pin, float* temperature, float* humidity) { /* Lit le capteur */ byte data[5]; byte ret = readDHTxx(pin, data, 1, 1000); /* Détecte et retourne les erreurs de communication */ if (ret != DHT_SUCCESS) return ret; /* Calcul la vraie valeur de la température et de l'humidité */ float fh = data[0]; fh *= 256; fh += data[1]; fh *= 0.1; *humidity = fh; float ft = data[2] & 0x7f; ft *= 256; ft += data[3]; ft *= 0.1; if (data[2] & 0x80) { ft *= -1; } *temperature = ft; /* Ok */ return DHT_SUCCESS; } /** * Fonction bas niveau permettant de lire la température et le taux d'humidité (en valeurs brutes) mesuré par un capteur DHTxx. */ byte readDHTxx(byte pin, byte* data, unsigned long start_time, unsigned long timeout) { data[0] = data[1] = data[2] = data[3] = data[4] = 0; // start_time est en millisecondes // timeout est en microsecondes /* Conversion du numéro de broche Arduino en ports / masque binaire "bas niveau" */ uint8_t bit = digitalPinToBitMask(pin); uint8_t port = digitalPinToPort(pin); volatile uint8_t *ddr = portModeRegister(port); // Registre MODE (INPUT / OUTPUT) volatile uint8_t *out = portOutputRegister(port); // Registre OUT (écriture) volatile uint8_t *in = portInputRegister(port); // Registre IN (lecture) /* Conversion du temps de timeout en nombre de cycles processeur */ unsigned long max_cycles = microsecondsToClockCycles(timeout); /* Evite les problèmes de pull-up */ *out |= bit; // PULLUP *ddr &= ~bit; // INPUT delay(100); // Laisse le temps à la résistance de pullup de mettre la ligne de données à HIGH /* Réveil du capteur */ *ddr |= bit; // OUTPUT *out &= ~bit; // LOW delay(start_time); // Temps d'attente à LOW causant le réveil du capteur // N.B. Il est impossible d'utilise delayMicroseconds() ici car un délai // de plus de 16 millisecondes ne donne pas un timing assez précis. /* Portion de code critique - pas d'interruptions possibles */ noInterrupts(); /* Passage en écoute */ *out |= bit; // PULLUP delayMicroseconds(40); *ddr &= ~bit; // INPUT /* Attente de la réponse du capteur */ timeout = 0; while(!(*in & bit)) { /* Attente d'un état LOW */ if (++timeout == max_cycles) { interrupts(); return DHT_TIMEOUT_ERROR; } } timeout = 0; while(*in & bit) { /* Attente d'un état HIGH */ if (++timeout == max_cycles) { interrupts(); return DHT_TIMEOUT_ERROR; } } /* Lecture des données du capteur (40 bits) */ for (byte i = 0; i < 40; ++i) { /* Attente d'un état LOW */ unsigned long cycles_low = 0; while(!(*in & bit)) { if (++cycles_low == max_cycles) { interrupts(); return DHT_TIMEOUT_ERROR; } } /* Attente d'un état HIGH */ unsigned long cycles_high = 0; while(*in & bit) { if (++cycles_high == max_cycles) { interrupts(); return DHT_TIMEOUT_ERROR; } } /* Si le temps haut est supérieur au temps bas c'est un "1", sinon c'est un "0" */ data[i / 8] <<= 1; if (cycles_high > cycles_low) { data[i / 8] |= 1; } } /* Fin de la portion de code critique */ interrupts(); /* * Format des données : * [1, 0] = humidité en % * [3, 2] = température en degrés Celsius * [4] = checksum (humidité + température) */ /* Vérifie la checksum */ byte checksum = (data[0] + data[1] + data[2] + data[3]) & 0xff; if (data[4] != checksum) return DHT_CHECKSUM_ERROR; /* Erreur de checksum */ else return DHT_SUCCESS; /* Pas d'erreur */ } Test Conclusion Partie B : Le détecteur à ultrason Objectif : mesure de distance entre le détecteur et un objet Etude Les capteurs de distance à ultrasons utilisent le principe de l’écho pour déterminer la distance à laquelle se trouve un objet : Un court signal sonore est envoyé (inaudible car dans le domaine des ultrasons – environ 40kHz) ; Le son est réfléchi par une surface et repart en direction du capteur ; Ce dernier le détecte, une fois revenu à son point de départ. Schéma Algorithme : Programme : // Définition des numéros de port const int trigPin = 11; // Trigger (emission) const int echoPin = 12; // Echo (réception) // Variables utiles long duree; // durée de l'echo int distance; // distance void setup() { pinMode(trigPin, OUTPUT); // Configuration du port du Trigger comme une SORTIE pinMode(echoPin, INPUT); // Configuration du port de l'Echo comme une ENTREE Serial.begin(9600); // Démarrage de la communication série } void loop() { // Émission d'un signal de durée 10 microsecondes digitalWrite(trigPin, LOW); delayMicroseconds(5); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // Écoute de l'écho duree = pulseIn(echoPin, HIGH); // Calcul de la distance distance = duree*0.034/2; // Affichage de la distance dans le Moniteur Série Serial.print("Distance : "); Serial.print(distance); Serial.println("cm"); } Test et mesures Montage Conclusion uploads/Litterature/ tp-7 1 .pdf
Documents similaires










-
37
-
0
-
0
Licence et utilisation
Gratuit pour un usage personnel Attribution requise- Détails
- Publié le Fev 11, 2021
- Catégorie Literature / Litté...
- Langue French
- Taille du fichier 0.1971MB