Le capteur de présence humaine mmWave C4002 est un module radar conçu pour une détection précise des personnes. Il utilise la technologie millimétrique FMCW à 24 GHz pour détecter à la fois les mouvements et les micro-mouvements tels que la respiration, ce qui lui permet d’identifier les personnes même lorsqu’elles sont complètement immobiles.
Contrairement aux capteurs traditionnels PIR, ce module offre une détection de présence. Il peut distinguer l’absence de cible, les cibles en mouvement et la présence humaine stationnaire dans une portée allant jusqu’à 10 mètres. Dans ce tutoriel, vous apprendrez comment connecter le capteur mmWave C4002 à un Arduino ou un ESP32 pour la détection de présence et de mouvement.
Pièces requises
Vous pouvez vous procurer le capteur mmWave C4002 chez DFRobot. Vous aurez également besoin d’un Arduino ou d’un ESP32. J’utilise un Arduino UNO et un ESP32-C3 SuperMini dans ce tutoriel, mais tout autre Arduino, ESP32 ou ESP8266 fonctionnera tant qu’il dispose d’une sortie 5V. Enfin, une breadboard et quelques câbles Dupont pour le câblage seront utiles.

Capteur radar mmWave C4002

ESP32-C3 SuperMini

Câble USB-C

Arduino Uno

Câble USB pour Arduino UNO

Kit de câbles Dupont

Breadboard
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.
Matériel du capteur mmWave C4002
Le mmWave C4002 est basé sur la technologie radar FMCW (onde continue à fréquence modulée) à 24 GHz. Il émet en continu des ondes électromagnétiques dans la bande 24,0 GHz à 24,25 GHz et mesure les signaux réfléchis par les objets environnants. La photo ci-dessous montre l’avant et l’arrière du module. Vous pouvez voir les deux antennes radar dorées à l’avant de la carte.

Vous pouvez également voir une LED marquée « RUN » et une LED marquée « OUT » à l’avant de la carte. La LED verte RUN clignote lorsque le capteur détecte activement, et la LED bleue OUT s’allume si une personne est détectée.
La technique de modulation FMCW permet au capteur d’extraire la distance, la vitesse et les caractéristiques de mouvement à partir du signal réfléchi. Le capteur peut détecter des changements très faibles de position, comme le mouvement de la poitrine lors de la respiration. Cela permet la détection de personnes immobiles, ce qui n’est pas possible avec les capteurs infrarouges passifs.
Le radar fonctionne indépendamment de la lumière ambiante et de la température. Il n’est pas affecté par des conditions environnementales telles que l’obscurité, la poussière ou les variations de chaleur. Cela améliore la stabilité dans les applications domotiques intérieures.
Capacités de détection et traitement du signal
Le C4002 supporte plusieurs modes de détection humaine, incluant le mouvement, le micro-mouvement et l’immobilité complète. Il peut classer l’état de la cible en catégories telles que absence de cible, cible en mouvement et présence stationnaire.
La portée maximale de détection est de 11 mètres pour le mouvement et 10 mètres pour la présence stationnaire. La zone de détection couvre environ un espace de 10 × 10 mètres, selon les conditions d’installation.
Le capteur utilise un traitement interne du signal pour extraire des paramètres supplémentaires. Il peut fournir la distance à la cible, l’énergie du signal, la vitesse de déplacement et la direction. Ces valeurs sont dérivées du décalage Doppler et des changements de fréquence du signal radar réfléchi.
Un algorithme adaptatif de filtrage de fond est implémenté pour réduire les fausses détections. Le capteur apprend l’environnement statique et supprime les interférences provenant de sources non humaines telles que des rideaux en mouvement ou des flux d’air.
Champ de vision et couverture spatiale
Le module offre un large angle de détection de 120° horizontalement et verticalement. Cela permet à un seul capteur de couvrir de grandes zones intérieures avec un minimum d’angles morts.
La portée de détection peut être configurée par logiciel. Cela permet aux développeurs de limiter la distance de détection à une zone spécifique dans une pièce. Cela aide à éviter les détections indésirables à travers les murs ou dans des zones adjacentes.
La position de montage affecte la couverture effective. Un montage au plafond offre un schéma de détection de haut en bas, tandis qu’un montage mural produit un cône de détection orienté vers l’avant.
Caractéristiques électriques et interfaces
Le capteur fonctionne avec une alimentation de 3,6 V à 5,5 V, ce qui le rend compatible avec les plateformes microcontrôleurs courantes telles qu’Arduino et ESP32.
Il fournit deux interfaces de sortie principales. Une interface UART avec un débit de 9600 bauds est utilisée pour la communication de données détaillées, incluant les mesures radar complètes et les commandes de configuration. Une broche OUT numérique peut être configurée comme signal de présence simple pour des applications à faible complexité.
La photo ci-dessous montre le brochage du module avec les broches pour l’alimentation (VIN), la masse (GND), la transmission série (TX), la réception série (RX) et le signal de sortie numérique (OUT) :

Fonctions supplémentaires de détection et environnementales
Le C4002 inclut un capteur d’intensité lumineuse avec une plage de 0 à 50 lux. Cela permet une détection combinée de présence et de lumière ambiante dans un seul module.
Le module supporte une calibration environnementale automatique. Pendant son fonctionnement, il peut s’adapter à l’environnement environnant pour améliorer la précision de détection. Cela réduit l’effort de réglage manuel lors du déploiement.
Spécifications techniques
Le tableau suivant résume les spécifications techniques du capteur mmWave C4004.
| Paramètre | Spécification |
|---|---|
| Tension de fonctionnement | 3,6 V à 5,5 V |
| Fréquence de fonctionnement | 24,0 GHz à 24,25 GHz |
| Capacité de détection | Détection de mouvement, micro-mouvement et présence humaine stationnaire |
| Distance maximale de détection | 11 m (mouvement), 10 m (présence stationnaire) |
| Angle de détection | 120° × 120° |
| Zone de détection | Couverture jusqu’à 10 m × 10 m |
| Interfaces de sortie | UART et broche OUT numérique configurable |
| Plage de détection lumineuse | 0 à 50 lux |
| Température de fonctionnement | −20 °C à 85 °C |
| Dimensions du module | 22 mm × 26 mm |
Utilisation du capteur mmWave C4002 sans microcontrôleur
Vous devez utiliser un microcontrôleur (ou un ordinateur) pour programmer les réglages spécifiques du capteur mmWave C4002. Par exemple, vous pouvez définir la distance de détection ou la sensibilité. Mais une fois configuré, vous pouvez utiliser le C4002 sans microcontrôleur.
Le schéma de câblage ci-dessous montre comment connecter une LED qui s’allume si le capteur détecte une personne. Il suffit d’alimenter les broches VIN et GND en 5V, puis de connecter une LED avec une résistance à la broche OUT :

Pour la plupart des applications pratiques, vous voudrez probablement connecter un relais au lieu d’une LED pour commuter un appareil à tension ou courant plus élevé. C’est possible, mais vous devrez utiliser un Relay Module avec un circuit amplificateur intégré, car la broche OUT ne peut pas piloter directement la bobine du relais. Voici un exemple de circuit :

Pour plus d’informations sur les modules relais, consultez les How To Use A Relay With Arduino, Interfacing a Relay Module With ESP32 et le Control AC devices with Solid State Relay tutoriels.
Dans les sections suivantes, je vous montrerai comment connecter le capteur mmWave C4002 à un Arduino ou un ESP32.
Connexion du capteur mmWave C4002 à Arduino
Connecter le capteur mmWave C4002 à un Arduino UNO est simple. Commencez par connecter VIN au 5V de l’Arduino. Ensuite, connectez GND à GND. Enfin, connectez l’interface UART en reliant RX à GPIO 5 et TX à GPIO 4. La photo ci-dessous montre le câblage complet :

Pour plus de commodité, voici un tableau des connexions à réaliser :
| C4002 | Arduino Uno |
|---|---|
| VIN | 5V |
| GND | GND |
| RX | GPIO 5 |
| TX | GPIO 4 |
Vous n’aurez même pas besoin d’une breadboard pour connecter le capteur à un Arduino UNO. Quatre câbles Dupont suffisent. La photo ci-dessous montre mon câblage :

Connexion du capteur mmWave C4002 à ESP32
L’ESP32 dispose de trois interfaces série et vous pouvez configurer les broches et l’interface que vous souhaitez utiliser. Ici, je connecte TX à GPIO 3 et RX à GPIO 4. Il faudra s’en souvenir lors de l’écriture du code. Enfin, connectez VIN au 5V et GND à G. La photo ci-dessous montre le câblage complet :

Notez que vous avez besoin d’un ESP32 avec une sortie 5V et que vous devez connecter VIN du C4002 à la broche 5V et non à la broche 3,3V habituelle ! La photo ci-dessous montre le brochage de l’ESP32-C3 Supermini que j’utilise ici.

Rappelez-vous que le C4002 nécessite 3,6V … 5V sur VIN, donc 3,3V ne suffisent pas. Pour plus de commodité, voici un tableau des connexions à réaliser.
| C4002 | ESP32-C3 Supermini |
|---|---|
| VIN | 5V |
| GND | G |
| RX | 4 |
| TX | 3 |
Installation de la bibliothèque DFRobot_C4002
Avant de pouvoir écrire du code, il faudra installer la bibliothèque DFRobot_C4002. Pour installer cette bibliothèque, rendez-vous sur le dépôt DFRobot_C4002, cliquez sur le bouton vert « <> Code » puis sur « Download ZIP » pour télécharger la bibliothèque au format ZIP comme montré ci-dessous :

Créez ensuite un nouveau sketch Arduino, allez dans Sketch -> Include Library -> Add .ZIP Library … pour installer la bibliothèque ZIP téléchargée (DFRobot_C4002-master.zip) :

Code : Calibration du C4002
Le C4002 nécessite un processus de calibration qui établit une référence de l’environnement afin que les objets statiques comme les murs ou les meubles ne soient pas faussement détectés comme cibles. Puisque le capteur repose sur les réflexions radar, il doit d’abord apprendre ce qu’est un état “normal” dans un espace donné avant de pouvoir détecter de manière fiable la présence ou le mouvement humain.
La calibration est lancée avec la fonction c4002.startEnvCalibration(delay, duration), où le délai permet de libérer la zone et la durée définit combien de temps le capteur mesure l’environnement. Pendant cette période, le capteur enregistre les réflexions de fond et construit un modèle interne. Il est important qu’aucune personne ne soit présente, car un mouvement ou même une présence stationnaire peut nuire à la précision.
Une fois la calibration terminée, le capteur compare les données en temps réel à cette référence et ne rapporte que les changements significatifs. Cela permet une détection précise du mouvement et de la présence statique. Pour de meilleurs résultats, la recalibration doit être répétée chaque fois que l’environnement change significativement. Le code suivant réalise ce processus de calibration :
// Libraries:
// - DFRobot_C4002 V 1.0.0
// https://github.com/DFRobot/DFRobot_C4002
// - ESP32 Core V 3.3.8
#include "DFRobot_C4002.h"
#if defined(ESP8266) || defined(ARDUINO_AVR_UNO)
SoftwareSerial mySerial(4, 5);
DFRobot_C4002 c4002(&mySerial, 115200);
#elif defined(ESP32)
DFRobot_C4002 c4002(&Serial1, 115200, 3, 4);
#else
DFRobot_C4002 c4002(&Serial1, 115200);
#endif
void setup() {
Serial.begin(115200);
while (!c4002.begin()) {
Serial.println("Can't find C4002!");
delay(1000);
}
c4002.setRunLedState(eLedOn);
delay(50);
c4002.setOutLedState(eLedOn);
delay(50);
delay(3000);
c4002.setReportPeriod(10);
c4002.startEnvCalibration(10, 30); // Delay time:10s,Calibration time:30s
Serial.println("Start calibration:");
}
void loop() {
sRetResult_t retResult = c4002.getNoteInfo();
if (retResult.noteType == eCalibration) {
Serial.print(retResult.calibCountdown);
Serial.println(" s");
if (retResult.calibCountdown == 0) {
Serial.println("Calibration Complete!");
}
}
delay(10);
}
Imports
Le sketch commence par inclure la bibliothèque nécessaire pour le capteur. Cette bibliothèque fournit la classe DFRobot_C4002, qui gère la communication et le contrôle du capteur.
#include "DFRobot_C4002.h"
Communication série
La section suivante configure la communication du capteur avec le microcontrôleur selon la plateforme utilisée. Le code vérifie la carte compilée et sélectionne l’interface série appropriée.
#if defined(ESP8266) || defined(ARDUINO_AVR_UNO) SoftwareSerial mySerial(4, 5); DFRobot_C4002 c4002(&mySerial, 115200); #elif defined(ESP32) DFRobot_C4002 c4002(&Serial1, 115200, 3, 4); #else DFRobot_C4002 c4002(&Serial1, 115200); #endif
Sur des cartes comme l’Arduino Uno ou l’ESP8266, les ports série matériels sont limités, donc une instance SoftwareSerial est créée sur les broches 4 (RX) et 5 (TX). Cette interface série est ensuite passée à l’objet DFRobot_C4002 avec un débit de 115200 bauds.
Sur l’ESP32, le code utilise Serial1, qui est un UART matériel. De plus, les broches 3 et 4 sont définies pour RX et TX.
Pour d’autres cartes, l’interface Serial1 par défaut est utilisée sans spécifier les broches, en supposant que la configuration matérielle les définit déjà.
Fonction Setup
La fonction setup() initialise la communication série et prépare le capteur à fonctionner.
void setup() {
Serial.begin(115200);
Le moniteur série est initialisé à 115200 bauds pour afficher les messages de statut pour le débogage et la surveillance.
La partie suivante vérifie que le capteur est bien connecté et répond.
while (!c4002.begin()) {
Serial.println("Can't find C4002!");
delay(1000);
}
La fonction begin() tente d’établir la communication avec le capteur. Si le capteur n’est pas détecté, la boucle continue d’afficher un message d’erreur chaque seconde. Cela bloque effectivement l’exécution jusqu’à ce que le capteur soit trouvé.
Après une initialisation réussie, le code configure les LEDs embarquées du capteur.
c4002.setRunLedState(eLedOn); delay(50); c4002.setOutLedState(eLedOn); delay(50);
La fonction setRunLedState() contrôle la LED d’indication de fonctionnement interne, tandis que setOutLedState() contrôle la LED de sortie. Les deux sont allumées ici pour fournir un retour visuel indiquant que le capteur est actif.
De courts délais sont ajoutés pour assurer une communication stable entre les commandes.
Le code fait ensuite une pause de quelques secondes avant de continuer.
delay(3000);
Ensuite, l’intervalle de rapport est configuré.
c4002.setReportPeriod(10);
La fonction setReportPeriod() définit la fréquence à laquelle le capteur envoie des données. Ici, la période est fixée à 10 unités, ce qui correspond à un cycle de rapport de 10 * 0,1 = 1 seconde. Enfin, la calibration environnementale est lancée.
c4002.startEnvCalibration(10, 30); // Delay time:10s,Calibration time:30s
Serial.println("Start calibration:");
}
La fonction startEnvCalibration() démarre la calibration avec deux paramètres. Le premier spécifie un délai avant le début de la calibration, et le second définit la durée du processus. Ici, la calibration commence après 10 secondes et dure 30 secondes.
Fonction Loop
La fonction loop() surveille en continu le statut du capteur, notamment le processus de calibration.
void loop() {
sRetResult_t retResult = c4002.getNoteInfo();
La fonction getNoteInfo() récupère les dernières informations de statut du capteur. La structure retournée sRetResult_t contient plusieurs champs décrivant l’état actuel.
Le code vérifie ensuite si le capteur est en mode calibration.
if (retResult.noteType == eCalibration) {
Le champ noteType indique le type de notification reçue. Lorsqu’il vaut eCalibration, cela signifie que le capteur est en phase de calibration. Si la calibration est en cours, le temps restant est affiché.
Serial.print(retResult.calibCountdown);
Serial.println(" s");
Le champ calibCountdown contient le nombre de secondes restantes avant la fin de la calibration. Enfin, le code détecte la fin de la calibration.
if (retResult.calibCountdown == 0) {
Serial.println("Calibration Complete!");
}
}
delay(10);
}
Lorsque le compte à rebours atteint zéro, un message est affiché pour indiquer que la calibration est terminée.
Exemple de sortie
La photo ci-dessous montre ce qui s’affiche sur le moniteur série pendant la calibration. Comme indiqué, vous ne devez pas être près du capteur pendant cette phase.

Code : Détection de mouvement et de présence avec C4002
Une fois le capteur calibré, il peut être utilisé pour la détection. L’exemple de code suivant montre les types de détections et mesures que le capteur peut effectuer :
// Libraries:
// - DFRobot_C4002 V 1.0.0
// https://github.com/DFRobot/DFRobot_C4002
// - ESP32 Core V 3.3.8
#include "DFRobot_C4002.h"
#if defined(ESP8266) || defined(ARDUINO_AVR_UNO)
SoftwareSerial mySerial(4, 5);
DFRobot_C4002 c4002(&mySerial, 115200);
#elif defined(ESP32)
DFRobot_C4002 c4002(&Serial1, 115200, 3, 4);
#else
DFRobot_C4002 c4002(&Serial1, 115200);
#endif
void setup() {
Serial.begin(115200);
while (!c4002.begin()) {
Serial.println("Can't find C4002!");
delay(1000);
}
c4002.setRunLedState(eLedOn);
delay(50);
c4002.setOutLedState(eLedOn);
delay(50);
c4002.setOutPinMode(eOutpinMode1); // Motion detected
delay(50);
c4002.setDetectRange(0, 1100); // 0-1100 cm
delay(50);
c4002.setLightThresh(0); //0-50 lux
delay(50);
c4002.setTargetDisappearDelay(1); // 0-65535s
delay(50);
c4002.setReportPeriod(10); // 10 * 0.1s = 1s
delay(50);
}
void loop() {
sRetResult_t retResult = c4002.getNoteInfo();
if (retResult.noteType == eResult) {
Serial.println("---------- RESULTS ------------");
float light = c4002.getLightIntensity();
Serial.print("Light: ");
Serial.print(light);
Serial.println(" lux");
eTargetState_t targetState = c4002.getTargetState();
Serial.print("Target state: ");
if (targetState == eNoTarget) {
Serial.println("No Target");
} else if (targetState == ePresence) {
Serial.println("Static Presence");
} else if (targetState == eMotion) {
Serial.println("Motion");
}
sPresenceTarget_t presenceTarget = c4002.getPresenceTargetInfo();
Serial.print("Presence distance: ");
Serial.print(presenceTarget.distance);
Serial.println(" m");
Serial.print("Presence energy: ");
Serial.println(presenceTarget.energy);
sMotionTarget_t motionTarget = c4002.getMotionTargetInfo();
Serial.print("Motion distance: ");
Serial.print(motionTarget.distance);
Serial.println(" m");
Serial.print("Motion energy: ");
Serial.println(motionTarget.energy);
Serial.print("Motion speed: ");
Serial.print(motionTarget.speed);
Serial.println(" m/s");
Serial.print("Motion direction: ");
if (motionTarget.direction == eAway) {
Serial.println("Away!");
} else if (motionTarget.direction == eNoDirection) {
Serial.println("No Direction!");
} else if (motionTarget.direction == eApproaching) {
Serial.println("Approaching!");
}
}
delay(50);
}
Imports
Le sketch commence par inclure la bibliothèque nécessaire au capteur. Cette bibliothèque définit la classe DFRobot_C4002 et plusieurs types de données associés tels que sRetResult_t, sPresenceTarget_t, et sMotionTarget_t.
#include "DFRobot_C4002.h"
Compilation conditionnelle et initialisation de l’objet
Ensuite, nous configurons l’interface série pour la communication UART comme précédemment. La configuration dépend du microcontrôleur.
#if defined(ESP8266) || defined(ARDUINO_AVR_UNO) SoftwareSerial mySerial(4, 5); DFRobot_C4002 c4002(&mySerial, 115200); #elif defined(ESP32) DFRobot_C4002 c4002(&Serial1, 115200, 3, 4); #else DFRobot_C4002 c4002(&Serial1, 115200); #endif
Sur des cartes comme l’Arduino Uno ou l’ESP8266, une instance SoftwareSerial est créée en utilisant les broches 4 et 5. Sur l’ESP32, nous utilisons les broches 3 et 4, mais vous pouvez en choisir d’autres. Assurez-vous simplement que votre câblage matériel correspond aux broches dans la configuration.
Fonction Setup
La fonction setup() initialise la communication et configure en détail les paramètres du capteur.
void setup() {
Serial.begin(115200);
La communication série est lancée pour permettre le débogage et la sortie des données via le moniteur série. La section suivante vérifie que le capteur est connecté et répond.
while (!c4002.begin()) {
Serial.println("Can't find C4002!");
delay(1000);
}
La fonction begin() initialise le capteur. Si l’initialisation échoue, le code affiche un message d’erreur en boucle et réessaie chaque seconde.
Après une initialisation réussie, les LEDs du capteur sont activées.
c4002.setRunLedState(eLedOn); delay(50); c4002.setOutLedState(eLedOn); delay(50);
Ces LEDs fournissent un retour visuel sur le fonctionnement du capteur. La LED « Run » clignote en vert pendant les détections. La LED « Out » s’allume si une personne est détectée.
Ensuite, nous configurons la broche de sortie (OUT).
c4002.setOutPinMode(eOutpinMode1); // Motion detected delay(50);
La fonction setOutPinMode() détermine la condition qui déclenche la broche OUT du capteur. Ici, eOutpinMode1 la configure pour indiquer la détection de mouvement. Pour d’autres modes, voir le type eOutpinMode_t:
typedef enum {
eOutpinMode1 = 0x01, /* Only when motion is detected will a high level be output */
eOutpinMode2 = 0x02, /* A high level is output only when its presence is detected */
eOutpinMode3 = 0x03, /* A high level only appears when motion or presence is detected */
eOutpinModex = 0xFF /* reserved */
} eOutpinMode_t;
Ensuite, la portée de détection est définie.
c4002.setDetectRange(0, 1100); // 0-1100 cm delay(50);
La fonction setDetectRange() fixe les distances minimale et maximale de détection en centimètres. Ici, le capteur est configuré pour détecter des cibles entre 0 cm et 1100 cm (11 mètres).
Le seuil de lumière ambiante est configuré ensuite.
c4002.setLightThresh(0); //0-50 lux delay(50);
La fonction setLightThresh() définit le niveau minimum de lumière requis pour la détection. Une valeur de 0 désactive effectivement le filtrage basé sur la lumière, permettant la détection dans toutes les conditions d’éclairage.
Le délai avant qu’une cible soit considérée disparue est ensuite réglé.
c4002.setTargetDisappearDelay(1); // 0-65535s delay(50);
La fonction setTargetDisappearDelay() définit combien de temps le capteur attend avant de déclarer qu’une cible détectée a disparu. Ici, le délai est fixé à 1 seconde.
L’intervalle de rapport est configuré en dernier.
c4002.setReportPeriod(10); // 10 * 0.1s = 1s delay(50); }
La fonction setReportPeriod() détermine la fréquence d’envoi des données par le capteur. Une valeur de 10 correspond à des intervalles d’une seconde.
De courts délais entre les commandes de configuration assurent une communication stable avec le capteur.
Fonction Loop
La fonction loop() lit et traite en continu les données du capteur.
void loop() {
sRetResult_t retResult = c4002.getNoteInfo();
La fonction getNoteInfo() récupère la dernière notification du capteur. La structure retournée contient des informations sur le type de données disponibles.
Le code vérifie si les données reçues contiennent des résultats de détection.
if (retResult.noteType == eResult) {
Le champ noteType indique le type de message. Lorsqu’il vaut eResult, le capteur a fourni des données de mesure.
Un en-tête est affiché pour séparer les blocs de sortie.
Serial.println("---------- RESULTS ------------");
L’intensité lumineuse ambiante est ensuite lue.
float light = c4002.getLightIntensity();
Serial.print("Light: ");
Serial.print(light);
Serial.println(" lux");
La fonction getLightIntensity() retourne le niveau de lumière mesuré en lux.
Ensuite, l’état de la cible est déterminé.
eTargetState_t targetState = c4002.getTargetState();
Serial.print("Target state: ");
La fonction getTargetState() indique si une cible est présente et si elle est en mouvement ou stationnaire.
if (targetState == eNoTarget) {
Serial.println("No Target");
} else if (targetState == ePresence) {
Serial.println("Static Presence");
} else if (targetState == eMotion) {
Serial.println("Motion");
}
Le code distingue entre absence de cible, personne stationnaire et personne en mouvement.
Les informations sur la cible de présence sont ensuite récupérées.
sPresenceTarget_t presenceTarget = c4002.getPresenceTargetInfo();
Serial.print("Presence distance: ");
Serial.print(presenceTarget.distance);
Serial.println(" m");
Serial.print("Presence energy: ");
Serial.println(presenceTarget.energy);
La fonction getPresenceTargetInfo() retourne une structure contenant la distance et l’énergie du signal d’une cible stationnaire. La valeur d’énergie reflète la force du signal détecté.
Ensuite, les données de la cible en mouvement sont obtenues.
sMotionTarget_t motionTarget = c4002.getMotionTargetInfo();
Serial.print("Motion distance: ");
Serial.print(motionTarget.distance);
Serial.println(" m");
Serial.print("Motion energy: ");
Serial.println(motionTarget.energy);
La fonction getMotionTargetInfo() fournit des données similaires pour les cibles en mouvement.
Des paramètres supplémentaires de mouvement sont également affichés.
Serial.print("Motion speed: ");
Serial.print(motionTarget.speed);
Serial.println(" m/s");
La vitesse de la cible en mouvement est donnée en mètres par seconde.
Enfin, la direction du mouvement est évaluée.
Serial.print("Motion direction: ");
if (motionTarget.direction == eAway) {
Serial.println("Away!");
} else if (motionTarget.direction == eNoDirection) {
Serial.println("No Direction!");
} else if (motionTarget.direction == eApproaching) {
Serial.println("Approaching!");
}
Le capteur peut déterminer si la cible s’éloigne, s’approche, ou si aucune direction claire n’est détectée.
À la fin de la boucle, un court délai est ajouté.
} delay(50); }
Ce délai évite un sondage excessif et assure une communication stable.
Exemple de sortie
La photo suivante montre les informations de détection affichées sur le moniteur série :

Conclusions
Dans ce tutoriel, vous avez appris à connecter le capteur mmWave C4002 à un Arduino ou un ESP32 pour la détection de mouvement et de présence. Comparé aux capteurs de mouvement infrarouges passifs (PIR), le C4002 basé sur radar est plus fiable et peut détecter des personnes immobiles à des distances spécifiques.
Si vous avez seulement besoin d’un signal de détection binaire (détecté, non détecté), vous pouvez programmer le capteur une fois (par exemple définir la distance de détection) via un microcontrôleur, puis utiliser la broche OUT. Pour des actions de contrôle plus complexes, vous pouvez programmer le microcontrôleur pour réagir aux mesures du capteur.
Notez qu’il existe aussi le très similaire mmWave C4001, qui offre une portée plus grande de 16 à 25 mètres mais moins d’intelligence intégrée. Cela signifie que vous devez généralement gérer plus de logique côté microcontrôleur, comme le filtrage, l’interprétation des états ou la création de comportements plus avancés, lorsque vous utilisez le C4001.
Pour plus d’informations sur le capteur mmWave C4002, consultez la page Wiki et le repo qui contient d’autres exemples de code.
Si vous avez des questions, n’hésitez pas à les poser dans la section commentaires.
Bon bricolage ; )

