HC-SR04 Arduino : Mesurer une Distance avec Précision en Tunisie
Maîtrisez le HC-SR04 avec Arduino en Tunisie : formules, code NewPing, filtrage médian, 3 projets concrets et version étanche JSN-SR04T.
Il était 23 h dans un atelier poussiéreux de Sfax. Un étudiant de l’ENIT, penché sur sa breadboard, tentait depuis trois heures de stabiliser la lecture d’un capteur HC-SR04 destiné à un projet de parking intelligent. Les mesures sautaient de 12 cm à 287 cm sans raison. Le diagnostic ? Aucun condensateur de découplage, un câble jumper trop long, et surtout : aucun filtrage logiciel. Trente minutes plus tard, après ajout d’un filtre médian sur 5 mesures et passage à la librairie NewPing, son capteur affichait une précision de ±3 mm. Le HC-SR04 n’est pas un mauvais capteur — c’est un capteur qu’on comprend mal. Dans ce guide complet, vous allez apprendre à le maîtriser comme un ingénieur : de la physique des ultrasons à 40 kHz jusqu’aux projets industriels que nous montons au FabLab Sfax.
- 1. Comment fonctionne réellement le HC-SR04
- 2. Brochage et câblage propre
- 3. Code basique avec pulseIn()
- 4. Correction selon la température tunisienne
- 5. Passer au niveau pro avec NewPing
- 6. Filtrage médian et moyenne glissante
- 7. Lecture non-bloquante avec NewPingTimer
- 8. Trois projets complets
- 9. JSN-SR04T : la version étanche extérieur
- 10. Multi-capteurs sans interférence
- FAQ
1. Comment fonctionne réellement le HC-SR04
Le HC-SR04 est un capteur de distance par ultrasons composé de deux transducteurs piézoélectriques : un émetteur (T) et un récepteur (R). Lorsque vous envoyez une impulsion HIGH d’au moins 10 µs sur la broche TRIG, le module génère automatiquement une rafale de 8 cycles à 40 kHz. Cette onde ultrasonore se propage dans l’air, frappe un obstacle, rebondit, et revient au récepteur. La broche ECHO passe à HIGH dès l’émission et retombe à LOW à la réception. La durée pendant laquelle ECHO reste à HIGH correspond donc au temps d’aller-retour (Time of Flight).
La formule fondamentale est distance = (vitesse_son × temps) / 2. À 20 °C, la vitesse du son dans l’air sec est de 343 m/s, soit 0,0343 cm/µs. On obtient donc la formule pratique : distance (cm) = durée (µs) / 58,2. Mais attention : à Sfax en juillet, il fait facilement 38 °C, et la vitesse du son grimpe à 354 m/s. Si vous utilisez la constante 58,2 sans correction, vous accumulez 3 % d’erreur, soit 6 mm sur 20 cm.
Plage de mesure réelle
Le datasheet annonce 2 cm à 400 cm. En pratique, voici ce que nous mesurons en laboratoire à Didactico :
| Distance cible | Précision typique | Conditions |
|---|---|---|
| 2 – 30 cm | ±2 mm | Surface plane perpendiculaire |
| 30 – 150 cm | ±5 mm | Conditions idéales |
| 150 – 300 cm | ±1 cm | Pas de courants d’air |
| 300 – 400 cm | ±3 cm | Surface large et dure |
| > 400 cm | Inutilisable | Trop d’atténuation |
2. Brochage et câblage propre
Le HC-SR04 possède 4 broches : VCC (5V), TRIG (entrée), ECHO (sortie), GND. Sur Arduino UNO R3, un câblage typique :
- VCC → 5V de l’Arduino
- GND → GND
- TRIG → broche numérique 9
- ECHO → broche numérique 10
Le HC-SR04 fonctionne en 5V. Si vous l’utilisez avec un ESP32 ou un Raspberry Pi (3,3V logique), placez un pont diviseur 1kΩ / 2kΩ sur la broche ECHO sinon vous risquez d’endommager le microcontrôleur. La version HC-SR04+ disponible chez Didactico accepte directement le 3,3V.
3. Code basique avec pulseIn()
Voici le code minimal sans aucune librairie. Il fonctionne, mais nous verrons ses limites :
// HC-SR04 - Version basique avec pulseIn()
// Didactico Tunisie - didactico.tn
const byte TRIG = 9;
const byte ECHO = 10;
void setup() {
Serial.begin(115200);
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
digitalWrite(TRIG, LOW);
}
void loop() {
// 1) Impulsion de declenchement : 10 us a HIGH
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
// 2) Lecture de la duree d'echo (timeout 30 ms = ~5 m)
unsigned long duree = pulseIn(ECHO, HIGH, 30000UL);
// 3) Conversion en centimetres (formule a 20 C)
float distance_cm = duree / 58.2;
if (duree == 0) {
Serial.println("Hors plage");
} else {
Serial.print("Distance : ");
Serial.print(distance_cm, 1);
Serial.println(" cm");
}
delay(100); // 10 lectures par seconde max
}
Ce code marche, mais il bloque le programme pendant l’attente de l’écho (jusqu’à 30 ms par mesure). Pour un projet qui ne fait que mesurer une distance, c’est acceptable. Pour un robot qui doit aussi lire un joystick, gérer un afficheur OLED et communiquer en Wi-Fi, c’est rédhibitoire.
4. Correction selon la température tunisienne
La vitesse du son varie selon la formule : v = 331,3 + 0,606 × T (T en °C, v en m/s). En Tunisie, on passe facilement de 12 °C en janvier à 42 °C en août. Voici l’impact concret :
| Température | Vitesse son (m/s) | Facteur (µs/cm) | Erreur si on garde 58,2 |
|---|---|---|---|
| 10 °C | 337,4 | 59,3 | +1,9 % |
| 20 °C | 343,4 | 58,2 | référence |
| 30 °C | 349,5 | 57,2 | -1,7 % |
| 40 °C | 355,5 | 56,3 | -3,4 % |
Si la précision compte (cuve d’eau, métrologie, projet académique noté), couplez le HC-SR04 avec un capteur de température DS18B20 ou un DHT22 :
#include <DHT.h>
DHT dht(2, DHT22);
float distanceCompensee() {
float T = dht.readTemperature();
if (isnan(T)) T = 25.0; // fallback
float vitesse = 331.3 + 0.606 * T; // m/s
float facteur = 20000.0 / vitesse; // us pour parcourir 1 cm aller-retour
digitalWrite(TRIG, LOW); delayMicroseconds(2);
digitalWrite(TRIG, HIGH); delayMicroseconds(10);
digitalWrite(TRIG, LOW);
unsigned long t = pulseIn(ECHO, HIGH, 30000UL);
if (t == 0) return -1.0;
return t / facteur;
}
HC-SR04 Capteur Ultrason 3,3V/5V
Le capteur de distance le plus populaire au monde, version compatible 3,3V et 5V. Stock permanent à Sfax, livraison 24-48h partout en Tunisie.
5. Passer au niveau pro avec NewPing
La librairie NewPing de Tim Eckel est, depuis 2012, la référence absolue pour piloter des capteurs ultrasons sur Arduino. Elle remplace pulseIn() par une lecture interne plus rapide, gère le timeout matériel, intègre la correction de température et permet le multi-capteurs. Installation : Outils → Gérer les bibliothèques → chercher “NewPing”.
#include <NewPing.h>
#define TRIG_PIN 9
#define ECHO_PIN 10
#define MAX_DISTANCE 300 // cm
NewPing sonar(TRIG_PIN, ECHO_PIN, MAX_DISTANCE);
void setup() { Serial.begin(115200); }
void loop() {
delay(50); // 50 ms minimum entre deux pings
unsigned int distance = sonar.ping_cm();
Serial.print(distance);
Serial.println(" cm");
}
NewPing expose aussi ping_median(iterations) qui réalise 5 (ou plus) mesures et renvoie la médiane — exactement ce qu’il faut pour éliminer les valeurs aberrantes.
6. Filtrage médian et moyenne glissante
Un capteur ultrason renvoie occasionnellement des valeurs absurdes : un courant d’air, une réflexion parasite sur un obstacle latéral, ou simplement le bruit électrique d’un moteur PWM voisin. Deux techniques se complètent.
Filtrage médian (robuste aux outliers)
On prend 5 mesures, on les trie, et on garde celle du milieu. Une seule valeur folle dans le lot est automatiquement écartée.
float medianDistance() {
float v[5];
for (int i = 0; i < 5; i++) {
v[i] = sonar.ping_cm();
delay(30);
}
// Tri par insertion (5 elements, c'est trivial)
for (int i = 1; i < 5; i++) {
float k = v[i]; int j = i - 1;
while (j >= 0 && v[j] > k) { v[j+1] = v[j]; j--; }
v[j+1] = k;
}
return v[2]; // valeur mediane
}
Moyenne glissante exponentielle (lissage continu)
float distanceLissee = 0;
const float ALPHA = 0.3; // 0.1 = tres lisse, 0.5 = reactif
void loop() {
float brut = sonar.ping_cm();
if (brut > 0) {
distanceLissee = ALPHA * brut + (1 - ALPHA) * distanceLissee;
}
Serial.println(distanceLissee, 1);
}
Combinez les deux : un filtre médian sur 5 mesures pour éliminer les outliers, suivi d’une moyenne glissante exponentielle pour lisser. Vos lectures deviennent stables au millimètre près. C’est l’approche que nous enseignons aux étudiants INSAT lors de nos workshops au FabLab Sfax.
7. Lecture non-bloquante avec NewPingTimer
Dans un robot ou un projet IoT, vous ne pouvez pas vous permettre d’attendre 30 ms à chaque mesure. NewPing fournit ping_timer() qui déclenche une interruption Timer2 dès qu’un écho revient :
#include <NewPing.h>
NewPing sonar(9, 10, 300);
unsigned long prochain = 0;
volatile unsigned int distanceCm = 0;
void echoRecu() {
if (sonar.check_timer()) {
distanceCm = sonar.ping_result / US_ROUNDTRIP_CM;
}
}
void loop() {
if (millis() >= prochain) {
prochain = millis() + 50;
sonar.ping_timer(echoRecu);
}
// ICI vous pouvez gerer LCD, Wi-Fi, moteurs, etc.
// sans aucun blocage
}
8. Trois projets complets
Projet 1 — Alarme de distance (anti-intrusion)
Buzzer actif sur D8, LED rouge sur D7. Quand un objet passe sous 30 cm, alarme.
#include <NewPing.h>
NewPing sonar(9, 10, 200);
const byte BUZZER = 8;
const byte LED = 7;
const int SEUIL = 30;
void setup() {
pinMode(BUZZER, OUTPUT);
pinMode(LED, OUTPUT);
}
void loop() {
delay(50);
unsigned int d = sonar.ping_median(5) / US_ROUNDTRIP_CM;
if (d > 0 && d < SEUIL) {
digitalWrite(LED, HIGH);
tone(BUZZER, 2000);
} else {
digitalWrite(LED, LOW);
noTone(BUZZER);
}
}
Projet 2 — Niveau d’eau dans une cuve (très utile en Tunisie)
Le HC-SR04 est fixé au sommet d’une cuve de 1,5 m. Hauteur du capteur au fond = 150 cm. Niveau d’eau = 150 – distance mesurée.
const float HAUTEUR_CUVE = 150.0; // cm
const float CAPACITE_LITRES = 1000.0;
void loop() {
delay(500);
unsigned int d = sonar.ping_median(7) / US_ROUNDTRIP_CM;
if (d == 0 || d > HAUTEUR_CUVE) return;
float niveauCm = HAUTEUR_CUVE - d;
float pourcentage = (niveauCm / HAUTEUR_CUVE) * 100.0;
float litres = (niveauCm / HAUTEUR_CUVE) * CAPACITE_LITRES;
Serial.print(litres, 0); Serial.print(" L (");
Serial.print(pourcentage, 0); Serial.println(" %)");
}
Combiné à un ESP32 et MQTT, vous avez un système de monitoring de citerne accessible depuis votre téléphone — projet idéal pour les zones rurales du sud tunisien.
Projet 3 — Aide au stationnement (parking assist)
Trois zones sonores : vert (> 80 cm), jaune (40-80 cm, bip lent), rouge (< 40 cm, bip rapide), STOP (< 15 cm, son continu).
void loop() {
unsigned int d = sonar.ping_median(5) / US_ROUNDTRIP_CM;
if (d == 0) { noTone(BUZZER); return; }
if (d > 80) noTone(BUZZER);
else if (d > 40) { tone(BUZZER, 1500); delay(80); noTone(BUZZER); delay(400); }
else if (d > 15) { tone(BUZZER, 2000); delay(80); noTone(BUZZER); delay(150); }
else tone(BUZZER, 2500);
}
Arduino UNO R3 + Pack Capteurs
UNO authentique, breadboard 830 points, jumpers, HC-SR04, LEDs et résistances. Tout pour démarrer vos projets en moins de 30 minutes.
9. JSN-SR04T : la version étanche extérieur
Le HC-SR04 classique n’aime ni l’humidité, ni la poussière, ni les variations brutales de température. Pour un projet extérieur (cuve d’eau exposée, capteur de proximité sur portail, robot d’exploration), la solution est le JSN-SR04T : capteur unique étanche IP67 séparé de l’électronique par un câble de 2,5 m. Brochage identique au HC-SR04, code identique avec NewPing. Portée typique : 25 cm à 450 cm, précision ±1 cm. Disponible chez Didactico avec connecteur étanche.
10. Multi-capteurs sans interférence
Si vous installez 4 HC-SR04 sur un robot (avant, arrière, gauche, droite), ils ne doivent jamais émettre simultanément, sinon ils captent les échos des autres. NewPing fournit NewPing::timer_ms(34, sequenceSonars) qui orchestre proprement la séquence :
#include <NewPing.h>
#define NB 4
NewPing sonars[NB] = {
NewPing(2, 3, 200), NewPing(4, 5, 200),
NewPing(6, 7, 200), NewPing(8, 9, 200)
};
unsigned int cm[NB];
byte courant = 0;
void setup() {
Serial.begin(115200);
NewPing::timer_ms(33, suivant);
}
void suivant() {
if (courant > 0) cm[courant - 1] = sonars[courant - 1].ping_result / US_ROUNDTRIP_CM;
if (courant == NB) {
courant = 0;
for (byte i = 0; i < NB; i++) { Serial.print(cm[i]); Serial.print(' '); }
Serial.println();
}
sonars[courant].ping_timer(echo);
courant++;
}
void echo() { if (sonars[courant - 1].check_timer()) sonars[courant - 1].ping_result = sonars[courant - 1].ping_result; }
Les 5 erreurs qui ruinent votre projet
- Alimentation faible : le HC-SR04 consomme jusqu’à 15 mA en pic. Si vous l’alimentez via la sortie 3,3V d’un Arduino UNO (limitée à 50 mA totaux), il devient instable. Toujours sur 5V.
- Surface molle ou inclinée : un tapis absorbe les ultrasons, une vitre les renvoie ailleurs. Testez sur surface plane et dure.
- Cône de mesure de 30° : le faisceau s’élargit avec la distance. Un obstacle de 10 cm de large à 2 m peut être manqué.
- Pas de masse commune : si capteur et Arduino sont alimentés séparément, reliez impérativement les GND.
- Fréquence d’échantillonnage trop élevée : minimum 50 ms entre deux pings, sinon les échos précédents polluent.
FAQ — HC-SR04 Arduino en Tunisie
Le HC-SR04 fonctionne-t-il en 3,3V comme sur ESP32 ?
Le HC-SR04 standard nécessite 5V. Sur ESP32 (logique 3,3V), placez un pont diviseur (1kΩ + 2kΩ) sur la broche ECHO pour ramener le signal à 3,3V. Sinon, optez pour la version HC-SR04+ ou HC-SR04P qui accepte nativement 3,3V — c’est celle que nous recommandons chez Didactico pour tout projet ESP32 ou Raspberry Pi.
Quelle est la différence entre HC-SR04 et JSN-SR04T ?
Le HC-SR04 est un module compact avec ses deux transducteurs visibles, conçu pour usage intérieur. Le JSN-SR04T sépare l’électronique d’un transducteur étanche (IP67) relié par câble de 2,5 m. Idéal pour mesurer un niveau d’eau dans une cuve, un capteur de portail, ou tout projet exposé aux intempéries du climat tunisien.
Pourquoi mon HC-SR04 renvoie-t-il 0 cm ou des valeurs incohérentes ?
Trois causes principales : (1) timeout dépassé (objet trop loin ou absorbant), (2) câblage défectueux ou GND non commun, (3) interférence d’un autre capteur ultrason à proximité. Activez la sortie série, ajoutez un filtre médian sur 5 mesures, et vérifiez l’alimentation (idéalement 5V avec condensateur de 100 µF en parallèle).
Combien de HC-SR04 puis-je connecter sur un Arduino UNO ?
Jusqu’à 15 capteurs avec la librairie NewPing en mode multi-capteurs (un timer matériel orchestre les déclenchements pour éviter les interférences). Au-delà, passez à un Arduino Mega 2560 ou un ESP32. Au FabLab Sfax, nous avons construit un robot d’évitement avec 6 capteurs orientés à 60° les uns des autres.
Le HC-SR04 mesure-t-il à travers une vitre ?
Non. Les ultrasons à 40 kHz sont presque entièrement réfléchis par le verre. Le capteur mesure la distance à la vitre, pas à l’objet derrière. Pour mesurer à travers, il faut un capteur radar 24 GHz (type RCWL-0516 ou LD2410) — également disponibles chez Didactico.
Quelle précision réelle en projet académique ?
Avec un code basique : ±1 à 2 cm. Avec NewPing + filtre médian sur 5 mesures + compensation de température : ±2 à 5 mm sur la plage 5-100 cm. C’est largement suffisant pour un projet de fin d’études ISET, INSAT ou ENIT. Pour de la métrologie millimétrique, passez au VL53L0X (laser ToF, ±3 mm jusqu’à 2 m).
Comment alimenter un projet HC-SR04 sur batterie ?
Le HC-SR04 consomme 15 mA actif et 2 mA en veille. Sur une batterie Li-ion 18650 de 3000 mAh à travers un step-up MT3608, comptez 80-100 heures d’autonomie en mesure continue toutes les 500 ms, ou plusieurs semaines si vous utilisez le sleep mode de l’Arduino entre les mesures (librairie LowPower.h).
Conclusion
Le HC-SR04 est l’archétype du capteur qui semble simple en surface et révèle une profondeur insoupçonnée à mesure qu’on l’utilise. De la mesure brute à 1 cm près jusqu’au système multi-capteurs millimétrique avec compensation thermique, c’est probablement le composant qui m’a le plus appris en électronique embarquée. Si vous démarrez, prenez un HC-SR04 et un Arduino UNO, suivez les exemples de ce guide étape par étape, et en une après-midi vous aurez compris des concepts qui resservent dans 80 % des projets capteurs.
Chez Didactico Tunisie, nous tenons en stock permanent à Sfax les HC-SR04 (versions 5V et 3,3V/5V), les JSN-SR04T étanches, les DS18B20 pour compensation thermique, et tous les Arduino UNO R3 authentiques. Livraison 24-48h dans toute la Tunisie (Tunis, Sousse, Sfax, Bizerte, Gabès, Nabeul, Monastir, Kairouan…). Pour aller plus loin, consultez notre guide complet Arduino UNO R3 et 10 projets pour débutants.
Et vous, quel projet montez-vous avec un HC-SR04 ? Partagez en commentaire — les meilleures idées rejoindront nos prochains tutoriels FabLab.
🛒 Matériel nécessaire pour ce guide
Tout le matériel de ce tutoriel est disponible chez Didactico — livraison 24-48h partout en Tunisie, paiement à la livraison.
Capteur de distance à ultrasons HC-SR045,500 TND
Carte Mesure de Distance pour capteur HC-SR04+ affichage LED13,900 TND
Carte Arduino UNO R3 - Meilleure carte Arduino en Tunisie31,000 TND📘 Guides liés : Comment Choisir le Bon Capteur Arduino pour votre Projet (Guide 2026) · Construire son Premier Robot Arduino : Guide Complet Châssis 2WD + Évitement d'Obstacles
