Dans ce tutoriel, vous apprendrez comment fonctionne le capteur de mouvement PIR HC-SR501 et comment l’utiliser avec Arduino. Vous pouvez trouver des capteurs infrarouges passifs (PIR) tout autour de vous, ils ne sont pas seulement utilisés pour la sécurité, mais aussi dans la plupart des systèmes d’éclairage activés automatiquement.
Dans cet article, j’ai inclus un schéma de câblage et des exemples de code pour que vous puissiez commencer à expérimenter avec votre capteur. Après chaque exemple, j’explique en détail le fonctionnement du code, vous ne devriez donc avoir aucun problème à le modifier selon vos besoins.
Je vais d’abord vous montrer comment utiliser le HC-SR501 en tant qu’unité autonome. Ensuite, nous le connecterons à un Arduino UNO et je vous montrerai comment l’utiliser comme un système d’alarme simple.
Ce tutoriel se concentre sur le capteur HC-SR501, mais vous pouvez aussi utiliser le code fourni pour des capteurs similaires comme le HC-SR505 ou AM312. La principale différence est que ces capteurs moins chers ont une portée de détection plus courte et ne disposent pas d’un potentiomètre pour ajuster la sensibilité et le délai.
Matériel nécessaire
Composants matériels
Logiciel
Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.
Comment fonctionne un capteur de mouvement PIR ?
Les capteurs de mouvement PIR se composent de deux parties principales : un élément pyézoélectrique de détection et une lentille de Fresnel . L’élément pyézoélectrique peut détecter le rayonnement infrarouge. Tous les objets dont la température est au-dessus du zéro absolu (0 Kelvin / -273,15 °C) émettent de la chaleur sous forme de rayonnement infrarouge, y compris les corps humains.

Un capteur pyézoélectrique possède deux fentes rectangulaires faites d’un matériau qui laisse passer le rayonnement infrarouge. Derrière celles-ci, il y a deux électrodes infrarouges séparées, l’une produisant une sortie positive et l’autre une sortie négative. Cela permet de détecter un changement dans les niveaux IR et non les niveaux ambiants. Les deux électrodes sont câblées pour s’annuler mutuellement. Si une moitié reçoit plus ou moins de rayonnement IR que l’autre, la sortie bascule vers le haut ou le bas.
Le circuit intégré de traitement du signal embarqué analyse ce signal et met la sortie du capteur à HIGH ou LOW en conséquence.

Le dôme blanc devant l’élément de détection est une lentille de Fresnel. Cette lentille concentre le rayonnement infrarouge sur le capteur.

Capteur de mouvement PIR HC-SR501
Le capteur de mouvement PIR HC-SR501 est construit autour du circuit intégré BISS0001 Micro Power PIR Motion Detector. Ce CI est spécialement conçu pour traiter le signal des capteurs PIR.
Si vous retirez la lentille de Fresnel, vous verrez l’élément pyézoélectrique RE200B. Sur le PCB, vous trouverez également un régulateur de tension intégré. Cela signifie que vous pouvez alimenter la carte avec une large plage de tension continue, généralement 5 V.
Les spécifications du HC-SR501 sont données dans le tableau ci-dessous, notez qu’il peut y avoir de petites différences selon les fabricants.
Spécifications du HC-SR501
| Tension de fonctionnement | 4,5 – 20 V |
| Courant de repos | 50 μA |
| Niveau de sortie | HIGH 3,3 V / LOW 0 V |
| Déclenchement | L déclenchement unique / H déclenchement répétitif |
| Temps de retard | 3 – 300 s |
| Temps de blocage | 2,5 s (par défaut) |
| Déclenchement | L déclenchement unique / H déclenchement répétitif |
| Plage de mesure | 3 – 7 m maximum |
| 2 mm | |
| Angle de mesure | < 110° angle conique |
| Dimensions du PCB | 32,5 x 24 mm |
| Trous de fixation | 2 mm, espacement 28,5 mm |
| Dimensions de la lentille de Fresnel | 15 mm x 23 mm de diamètre |
| Température de fonctionnement | -15 – 70 °C |
| Coût | Check price |
Pour plus d’informations, vous pouvez consulter les fiches techniques ci-dessous :
Réglage du HC-SR501
Au dos de la carte, vous trouverez deux potentiomètres et un cavalier, que vous pouvez utiliser pour ajuster plusieurs paramètres :

Réglage de la sensibilité (portée)
Le HC-SR501 a une distance de détection maximale de 7 mètres. Vous pouvez ajuster cette distance en tournant le potentiomètre de sensibilité dans le sens horaire ou antihoraire (voir photo ci-dessus). Tourner le potentiomètre dans le sens horaire augmente la distance jusqu’à 7 mètres. Le tourner dans le sens antihoraire la réduit jusqu’à 3 mètres.
Réglage du délai (Tx)
Ce potentiomètre sert à régler le temps pendant lequel la sortie reste à HIGH après détection de mouvement. Le délai minimum est de 3 secondes et le maximum de 300 secondes (5 minutes). Tournez le potentiomètre dans le sens horaire pour augmenter le délai, et dans le sens antihoraire pour le diminuer.
Cavalier de sélection du mode de déclenchement
Le cavalier (jaune) permet de choisir entre deux modes de déclenchement. Il peut être réglé sur L (déclenchement unique) ou H (déclenchement répétitif) :
- Déclenchement unique – La sortie passe à HIGH dès qu’un mouvement est détecté. Elle reste HIGH pendant le temps défini par le potentiomètre. Tout mouvement pendant cette période n’est pas pris en compte et ne redémarre pas le minuteur.
- Déclenchement répétitif – À chaque détection de mouvement, le minuteur de délai est relancé.
La différence entre les modes de déclenchement unique et répétitif est illustrée dans la figure ci-dessous.

Ajouter une thermistance et/ou une LDR au HC-SR501
Comme on peut le voir sur l’image ci-dessous, le HC-SR501 dispose de pastilles de soudure pour deux composants supplémentaires. Ces pastilles sont généralement étiquetées ‘RL’ et ‘RT’.

- RL – Ici, vous pouvez ajouter une light dependent resistor (LDR) ou photorésistance qui a une faible résistance sous une forte lumière ambiante. Cela permet au détecteur de ne fonctionner que lorsque la zone de détection est suffisamment sombre.
- RT – Cette pastille est prévue pour une thermistor. Son ajout rend la sensibilité du capteur moins dépendante de la température ambiante.
Malheureusement, aucune information supplémentaire n’est fournie dans les fiches techniques, donc je ne suis pas totalement sûr des valeurs des composants à utiliser.
Utiliser le capteur de mouvement PIR HC-SR501 en unité autonome
Pour la plupart des applications, vous pouvez simplement utiliser le HC-SR501 en unité autonome. Vous pouvez utiliser le signal de sortie pour déclencher des relais, des LED, etc.
Le câblage est très simple comme montré sur la photo ci-dessous. Il suffit de connecter VCC et GND à une batterie et une LED rouge entre la broche de sortie et la masse. La tension de sortie est de 3,3 V, j’ai donc ajouté une résistance de limitation de courant de 68 Ω en série avec la LED.

Notez qu’après avoir alimenté le capteur, vous devez attendre 30 à 60 secondes pour qu’il s’initialise. Pendant cette période, la LED peut clignoter quelques fois. Après une minute, vous pouvez agiter la main devant le capteur et la LED devrait s’allumer.
Avec cette configuration, il est facile de tester le fonctionnement du capteur. C’est aussi un bon moment pour jouer avec les réglages de sensibilité, de délai, ainsi que les deux modes de déclenchement.
Câblage – Connexion du capteur PIR HC-SR501 à Arduino UNO
En connectant le capteur de mouvement à un microcontrôleur comme l’Arduino UNO, vous pouvez contrôler toutes sortes d’éléments : LED, relais, moteurs, buzzers, etc.
Dans le schéma de câblage ci-dessous, vous pouvez voir comment le brancher à l’Arduino. Vous pouvez lire le capteur avec une des broches d’entrée/sortie générales (GPIO) de l’Arduino. Dans cet exemple, je l’ai connecté à la broche numérique 2. Les broches VCC et GND sont connectées respectivement à 5 V et à la masse.

Les connexions sont aussi indiquées dans le tableau ci-dessous :
Connexions du capteur de mouvement PIR HC-SR501
| Capteur PIR HC-SR501 | Arduino |
|---|---|
| VCC | 5 V |
| OUT | Broche 2 |
| GND | GND |
Une fois le capteur câblé, l’étape suivante est de téléverser un exemple de code.
Exemple de code pour le capteur PIR HC-SR501 avec Arduino UNO
Avec le code exemple suivant, vous pouvez lire le capteur et contrôler la LED intégrée de l’Arduino (connectée à la broche 13). Ce code peut aussi être utilisé pour contrôler des relais simples afin d’allumer ou d’éteindre une lumière plus puissante.
Pour que ce code fonctionne correctement, il est préférable de régler le cavalier de mode de déclenchement sur ‘H’ (mode déclenchement répétitif). Réglez aussi le potentiomètre de délai au minimum en le tournant complètement dans le sens antihoraire.
Le code lit l’état du capteur (HIGH ou LOW) et allume ou éteint la LED intégrée en conséquence. Il affiche aussi un message dans le moniteur série, accessible via Tools ou en tapant (Ctrl+Shift+M).
/* Example code for HC-SR501 PIR motion sensor with Arduino.
More info: www.www.makerguides.com */
// Define connection pins:
#define pirPin 2
#define ledPin 13
// Create variables:
int val = 0;
bool motionState = false; // We start with no motion detected.
void setup() {
// Configure the pins as input or output:
pinMode(ledPin, OUTPUT);
pinMode(pirPin, INPUT);
// Begin serial communication at a baud rate of 9600:
Serial.begin(9600);
}
void loop() {
// Read out the pirPin and store as val:
val = digitalRead(pirPin);
// If motion is detected (pirPin = HIGH), do the following:
if (val == HIGH) {
digitalWrite(ledPin, HIGH); // Turn on the on-board LED.
// Change the motion state to true (motion detected):
if (motionState == false) {
Serial.println("Motion detected!");
motionState = true;
}
}
// If no motion is detected (pirPin = LOW), do the following:
else {
digitalWrite(ledPin, LOW); // Turn off the on-board LED.
// Change the motion state to false (no motion):
if (motionState == true) {
Serial.println("Motion ended!");
motionState = false;
}
}
}
Vous devriez voir la sortie suivante dans le moniteur série :

Explication du code :
Le code est assez simple et vous n’avez pas besoin de bibliothèques Arduino pour utiliser ce capteur.
Le sketch commence par définir la broche du capteur PIR et celle de la LED. Je les ai connectées aux broches 2 et 13 de l’Arduino (LED intégrée).
L’instruction #define est utilisée pour donner un nom à une valeur constante. Le compilateur remplacera toute référence à cette constante par la valeur définie lors de la compilation. Ainsi, partout où vous mentionnez pirPin, le compilateur la remplacera par la valeur 2 lors de la compilation.
J’ai aussi créé deux variables, val et motionState, qui sont un integer et un booléen boolean (vrai/faux) respectivement. La variable val sert à stocker la sortie du capteur PIR (HIGH ou LOW) et motionState devient vrai lorsque du mouvement est détecté et faux lorsqu’il n’y en a pas.
// Define connection pins: #define pirPin 2 #define ledPin 13 // Create variables: int val = 0; bool motionState = false; // We start with no motion detected.
Dans la fonction setup(), nous configurons les broches en entrée ou sortie avec la fonction pinMode(pin,mode). La broche pirPin est une entrée et la ledPin une sortie. Nous commençons aussi la communication série à 9600 bauds. Assurez-vous que le moniteur série est aussi réglé à 9600.
void setup() {
// Configure the pins as input or output:
pinMode(ledPin, OUTPUT);
pinMode(pirPin, INPUT);
// Begin serial communication at a baud rate of 9600:
Serial.begin(9600);
}
Dans la fonction loop(), je lis d’abord le capteur avec la fonction digitalRead(pin). Cette fonction retourne HIGH ou LOW.
// Read out the pirPin and store as val: val = digitalRead(pirPin);
Quand la sortie du capteur/val est HIGH, j’allume la LED avec la fonction digitalWrite(pin,value).
// If motion is detected (pirPin = HIGH), do the following:
if (val == HIGH) {
digitalWrite(ledPin, HIGH); // Turn on the on-board LED.
// Change the motion state to true (motion detected):
if (motionState == false) {
Serial.println("Motion detected!");
motionState = true;
}
}
Ensuite, motionState passe à vrai et le message « Motion detected! » est affiché dans le moniteur série. Je vérifie d’abord l’état actuel de motionState pour que le message ne soit affiché qu’une fois par événement de mouvement.
S’il n’y a plus de mouvement devant le capteur, val devient LOW, la LED s’éteint et le message « Motion ended! » est affiché dans le moniteur série.
Créer un système d’alarme avec capteur PIR et buzzer
Avec quelques modifications simples, vous pouvez créer un système d’alarme avec le HC-SR501 et un piezoelectric buzzer. J’ai connecté le buzzer avec une résistance de 100 Ω entre la broche numérique 5 et la masse. Vous pouvez probablement utiliser le buzzer sans résistance (ce qui le rend plus fort), mais le son sera moins agréable.

Le code ci-dessous est presque identique à l’exemple précédent. J’ai juste ajouté une fonction pour créer le son d’alarme. Vous pouvez changer la tonalité du buzzer en modifiant le paramètre d’entrée de la fonction alarm(duration,frequency) .
/* Example code to create an alarm system with HC-SR501 PIR motion sensor, buzzer and Arduino.
More info: www.www.makerguides.com */
// Define connection pins:
#define buzzerPin 5
#define pirPin 2
#define ledPin 13
// Create variables:
int val = 0;
bool motionState = false; // We start with no motion detected.
void setup() {
// Configure the pins as input or output:
pinMode(buzzerPin, OUTPUT);
pinMode(ledPin, OUTPUT);
pinMode(pirPin, INPUT);
// Begin serial communication at a baud rate of 9600:
Serial.begin(9600);
}
void loop() {
// Read out the pirPin and store as val:
val = digitalRead(pirPin);
// If motion is detected (pirPin = HIGH), do the following:
if (val == HIGH) {
digitalWrite(ledPin, HIGH); // Turn on the on-board LED.
alarm(500, 1000); // Call the alarm(duration, frequency) function.
delay(150);
// Change the motion state to true (motion detected):
if (motionState == false) {
Serial.println("Motion detected!");
motionState = true;
}
}
// If no motion is detected (pirPin = LOW), do the following:
else {
digitalWrite(ledPin, LOW); // Turn off the on-board LED.
noTone(buzzerPin); // Make sure no tone is played when no motion is detected.
delay(150);
// Change the motion state to false (no motion):
if (motionState == true) {
Serial.println("Motion ended!");
motionState = false;
}
}
}
// Function to create a tone with parameters duration and frequency:
void alarm(long duration, int freq) {
tone(buzzerPin, freq);
delay(duration);
noTone(buzzerPin);
}
Points à considérer lors de la conception d’un système à capteur PIR
Comme pour les autres capteurs PIR, le HC-SR501 a besoin d’un temps d’initialisation et d’adaptation aux niveaux infrarouges de la pièce. Cela prend environ 1 minute au démarrage. Essayez d’éliminer tout mouvement devant le capteur pendant cette période.
Le vent et une source lumineuse proche du capteur peuvent provoquer des interférences, essayez donc d’ajuster votre installation pour éviter cela. Notez aussi que le capteur doit être monté horizontalement car la plupart des mouvements se produisent dans ce plan (ex. marche).
En plus du temps de retard (Tx), le capteur a aussi un « temps de blocage » (Ti). Par défaut, ce temps est de 2,5 secondes et il est difficile à modifier (voir la fiche technique du BISS0001). Chaque fois que la sortie passe de HIGH à LOW, la période de blocage commence. Pendant ce temps, le capteur ne détecte aucun mouvement.
Lors de la conception d’un système basé sur le HC-SR501, vous devrez prendre en compte ces temps de retard.
Conclusion
Dans cet article, je vous ai montré comment fonctionne le capteur de mouvement PIR HC-SR501 et comment l’utiliser avec Arduino. J’espère que vous l’avez trouvé utile et instructif. Si vous avez des questions, des suggestions, ou si vous pensez que des éléments manquent dans ce tutoriel, n’hésitez pas à laisser un commentaire ci-dessous.

