Comptage d’entrée-sortie d’un bâtiment

Wikis > Wiki > Nos projets collaboratifs > Comptage d'entrée-sortie d'un bâtiment



Ici nous utiliserons une carte Arduino ainsi qu’un émetteur-récepteur ultrason pour compter les entrées et les sorties d’un bâtiment afin de connaitre le nombres de personnes à l’intérieur.

Utilisation du capteur de distance à ultrasons HC-SR04

image du capteur à ultrasons HC-SR04
Grâce à ce document nous savons comment le brancher et commander une mesure :

  • Alimentation du module en 5V sur la broche Vcc
  • Envoi d’une impulsion de 5V de 10µs afin de demander un “mesure” sur la broche Trig
  • Lecture d’un temps HAUT (5v) qui est proportionnel à la moyenne de 8 mesures sur la broche Echo
  • Connectez bien sur à la masse la broche GND

Nous receverons donc en retour un signal HAUT proportionnel au temps qu’a mis le capteur à recevoir le signal qu’il à émis et qui lui est revenu en ricochant sur un obstacle.
Afin de connaitre la durée de ce signal HAUT reçu par l’Arduino nous utiliserons la fonction pulseIn.
Afin de savoir à quelle distance était cet ostacle il faut diviser le temps fournit par la fonction pulseIn() par 58.

Voici donc le code de base pour tester le fonctionnement du capteur.

cliquez pour derouler le code de base

			/* Télémètre ultrason HC-SR04 
 			* Essais World of GZ - www.worldofgz.com
 			*/
			 
			#define TRIG 22
			#define ECHO 23

			//Variables utilisées
			long retourEcho;
			long distance;

			void setup () {
			  //On définie les entrées/Sorties
			  pinMode(TRIG, OUTPUT);
			  digitalWrite(TRIG, LOW); 
			  pinMode(ECHO, INPUT);  
			  //Lancement de la liaison série
			  Serial.begin(115200); 
			  Serial.println("Liaison série en ligne");
			}

			void loop() {
			  //On lance notre impulsion de 10µs
			  digitalWrite(TRIG, HIGH);
			  delayMicroseconds(10);
			  digitalWrite(TRIG, LOW);
			  
			  //Mesure de la longueur de la pulse
			  retourEcho = pulseIn(ECHO, HIGH);
			  
			  //Calcul de la distance
			  distance = retourEcho / 58;
			  
			  //Affichage de la distance dans le moniteur série
			  Serial.print("Distance cm : ");
			  Serial.println(distance);
			  
			  delay(1000); 
			}
		

Attention, si vous utiliser ce code ainsi sur une Arduino Uno il ne fonctionnera pas ! Je vous laisse trouver pourquoi…

Utilisation de l’émetteur-récepteur radio nRF24L01+

image de la radio nRF24L01+
On va utiliser la bibliothèque NRF24 de TMRh20 disponible ici.
Le module nRF24L01+ utilise le protocole de communication SPI, il a donc un branchement particulier que la documentation de la bibliothèque décrit en bas de cette page.

Voici le schéma de branchement (les broches CS et CE du module peuvent être connectées ailleurs sur l’Arduino à condition de l’indiquer dans le code…) :
Image de connexion du module nRF24L01+ à l'Arduino
Ce code permet simplement de voir si la communication entre deux Arduino fonctionne.
En connectant le pin 4 au GND on informe l’Arduino qu’il s’agit du récepteur, sinon il s’agit de l’émetteur

cliquez pour dérouler le code de communication entre deux Arduino

			/*
			  Sene
			  Code pour nRF24L01+ radios
			  Connectez le pin 4 au gnd pour passer en recepteur, laisser libre pour etre en emetteur

			  Sources : https://github.com/maniacbug/RF24.git & https://github.com/TMRh20/RF24.git
			  Mise à jour : Oct 2016 by Paolo
			*/

			#include <SPI.h>
			#include "RF24.h"

			/* Configuration du Hardware : connectez nRF24L01 radio sur le bus SPI et sur les pins 7 & 8 */
			RF24 radio(7, 8);
			/*********************************************************************************************/

			byte addresses[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node", "7Node"};
			char donnees;
			char anciennesDonnees;
			char c;
			bool allumage = 0;
			bool role = 0;

			const int pinLed = 2;
			const int pinRole = 4;


			void setup() {

			  pinMode(pinRole, INPUT);
			  pinMode(pinLed, OUTPUT);
			  digitalWrite(pinRole, HIGH);
			  digitalWrite(pinLed, allumage);
			  if (digitalRead(pinRole)) {
			    role = 0;
			  }
			  else {
			    role = 1;
			  }
			  delay(20);
			  Serial.begin(115200);
			  if (role) Serial.println("radio reception");
			  else Serial.println("radio emission");
			  radio.begin();
			  radio.setPALevel(RF24_PA_HIGH);
			  radio.setDataRate(RF24_250KBPS);
			  if (role) {
			    radio.openWritingPipe(addresses[0]);
			    radio.openReadingPipe(1, addresses[1]);
			    radio.openReadingPipe(2, addresses[2]);
			    radio.openReadingPipe(3, addresses[3]);
			    radio.openReadingPipe(4, addresses[4]);
			    radio.openReadingPipe(5, addresses[5]);
			    radio.openReadingPipe(6, addresses[6]);
			    radio.startListening();
			  }
			  else {
			    radio.openWritingPipe(addresses[1]);
			    radio.openReadingPipe(1, addresses[0]);
			    radio.stopListening();
			  }

			}


			void loop() {
			  if (role) {
			    while (radio.available()) {
			      anciennesDonnees = donnees;
			      radio.read( &donnees, sizeof(donnees) );
			      Serial.print("anciennes donnees : ");
			      Serial.print(anciennesDonnees);
			      Serial.print(" / donnees : ");
			      Serial.print(donnees);
			      if (anciennesDonnees != donnees) {
			        allumage = 1 - allumage;
			        digitalWrite(pinLed, allumage);
			      }
			      Serial.print(" / allumage : ");
			      Serial.println(allumage);

			    }
			  }
			  else {
			    while (Serial.available()) {
			      char c = Serial.read();
			      Serial.read();
			      radio.stopListening();

			      Serial.print(F("J envoie : "));
			      Serial.println(c);

			      if (!radio.write( &c, sizeof(c) )) {
			        Serial.println(F("echec"));
			      }
			      else
			        Serial.println("reussit");
			      delay(1000);
			    }
			  }
			}