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
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
[code lang= »arduino »]
/* 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);
}
[/code]
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+
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…) :
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
[code lang= »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);
}
}
}
[/code]