Composants · 20 min de lecture

Capteur de courant ACS712 Arduino : mesurer le courant DC et AC

Capteur de courant ACS712 sur Arduino : sensibilité 5A/20A/30A, point zéro à 2,5 V, code DC et AC (RMS), calcul de puissance, diviseur pour ESP32 et INA219.

Le capteur de courant ACS712 est un petit module bon marché qui détecte le courant traversant un circuit grâce à l'effet Hall et le convertit en une tension que ton Arduino peut lire. Sans courant, sa sortie est à environ 2,5 V ; elle monte quand le courant circule dans un sens et descend quand il circule dans l'autre. Tu peux ainsi mesurer le courant continu (DC) comme le courant alternatif (AC) avec une seule broche analogique. On l'utilise pour voir combien de courant consomme un moteur, suivre la décharge d'une batterie, savoir si un appareil fonctionne ou calculer la puissance d'un appareil électroménager. En plus, la ligne mesurée est isolée électriquement du côté Arduino.

Dans ce guide, tu vas apprendre pas à pas ce que contient l'ACS712, ce qui distingue les modèles 5A, 20A et 30A et lequel choisir, comment brancher le module en série dans ton circuit, le premier programme Arduino qui mesure un courant continu, comment calmer les valeurs instables par la moyenne, comment calculer la valeur efficace (RMS) d'un courant alternatif et comment obtenir la puissance (W) et l'énergie (Wh). Ensuite, tu verras comment le relier à l'ESP32 et au Raspberry Pi Pico en 3,3 V avec un pont diviseur, pourquoi il faut être très prudent avec le secteur 230 V et pourquoi l'INA219 est un meilleur choix pour les petits courants.

Module capteur de courant ACS712 (version 20A)
Module ACS712 : le marquage ELC-20A sur la puce indique la version 20 ampères. Le bornier à vis vert se branche en série dans le circuit mesuré ; les broches VCC, OUT et GND vont vers l'Arduino.

Qu'est-ce que le capteur de courant ACS712 et comment fonctionne-t-il ?

L'ACS712 est une puce à 8 broches fabriquée par Allegro. Le courant mesuré traverse un épais chemin de cuivre à l'intérieur de la puce, des broches 1 et 2 vers les broches 3 et 4. Ce chemin n'a qu'une résistance de 1,2 mΩ ; même à 10 A, la chute n'est que de 12 mV pour 0,12 W de chaleur, il ne perturbe donc presque pas le circuit mesuré. En traversant ce conducteur, le courant crée un champ magnétique proportionnel. Un capteur à effet Hall placé juste au-dessus du cuivre détecte ce champ, et un amplificateur interne le transforme en tension. Tu trouveras les bases en détail dans notre guide sur les capteurs à effet Hall.

Il n'y a aucune liaison électrique entre le chemin de cuivre parcouru par le courant et le côté qui alimente la puce ; le seul lien est le champ magnétique. C'est pourquoi la ligne mesurée et l'Arduino sont isolés l'un de l'autre (isolation galvanique). La tension de sortie suit cette formule : Vout = VCC / 2 + Sensibilité × I. Si le courant va de IP+ vers IP−, la sortie passe au-dessus de 2,5 V ; dans l'autre sens, elle passe en dessous. L'ACS712 est aussi ratiométrique : le point zéro et la sensibilité varient avec la tension d'alimentation. Si celle-ci tombe à 4,8 V, le point zéro devient 2,4 V et la sensibilité du modèle 5A passe de 185 à environ 178 mV/A.

CaractéristiqueValeur
Tension d'alimentation4,5–5,5 V (typique 5 V)
ConsommationTypique 10 mA, maximum 13 mA
Sortie à courant nulVCC × 0,5 (2,5 V sous 5 V)
Résistance du conducteur1,2 mΩ
Bande passante80 kHz (réduite par le condensateur sur la broche FILTER)
Erreur totale de sortie±1,5 % à 25 °C
Tenue d'isolement2,4 kV RMS (60 secondes)
Charge en sortieAu moins 4,7 kΩ, au plus 10 nF
Surintensité brève100 A (une impulsion, 100 ms)
Température de fonctionnementDe −40 à 85 °C
Connexions du moduleVCC, OUT, GND et bornier à vis 2 points

Modèles 5A, 20A et 30A : sensibilité et résolution

L'ACS712 existe en trois versions qui se ressemblent comme deux gouttes d'eau. Pour savoir laquelle tu as, lis le marquage de la puce : ELC-05B mesure ±5 A, ELC-20A ±20 A et ELC-30A ±30 A. La sensibilité indique de combien de millivolts la sortie varie pour chaque ampère. Plus la plage est grande, plus la sensibilité est faible, afin que la sortie des modèles 20A et 30A reste entre 0,5 et 4,5 V même au courant maximal. Le tableau montre aussi à combien de milliampères correspond un pas du CAN 10 bits de l'Uno (4,88 mV) pour chaque modèle.

Modèle (marquage)PlageSensibilitéSortie à pleine échelle1 pas du CAN sur UnoBruit (filtre 47 nF)
ACS712ELCTR-05B±5 A185 mV/A (180–190)1,58–3,43 V≈ 26 mA21 mV ≈ 0,11 A crête à crête
ACS712ELCTR-20A±20 A100 mV/A (96–104)0,50–4,50 V≈ 49 mA11 mV ≈ 0,11 A crête à crête
ACS712ELCTR-30A±30 A66 mV/A (63–69)0,52–4,48 V≈ 74 mA7 mV ≈ 0,11 A crête à crête

Deux conclusions importantes ressortent du tableau. D'abord, le bruit exprimé en ampères vaut environ 0,1 A sur les trois modèles ; si tu prends le 30A pour une charge de 2 A, tu gâches les deux tiers de la résolution. La règle est simple : choisis le plus petit modèle qui couvre avec marge le courant maximal à mesurer (la valeur crête en alternatif). Par exemple, le 5A convient à un moteur 12 V qui consomme au plus 2–3 A, et le 20A à un radiateur de 1500 W. Ensuite, l'ACS712 n'est pas fait pour les petits courants : tu ne pourras pas mesurer avec lui une LED de quelques milliampères ni un ESP32 en sommeil profond. Pour cela, l'INA219 présenté à la fin de ce guide est bien meilleur.

Branchement de l'ACS712 : Arduino Uno, ESP32 et Pico

Le module ACS712 a deux côtés. Le côté bornier appartient au circuit mesuré : le courant doit entrer par une borne et ressortir par l'autre, le module se branche donc en série avec la charge, exactement comme un ampèremètre. En général, tu coupes le fil positif de l'alimentation, tu relies l'extrémité venant de l'alimentation à une borne et celle qui part vers la charge à l'autre. Le côté à trois broches va vers l'Arduino. L'ACS712 ne fonctionne qu'en 5 V ; sur l'ESP32 et le Pico aussi, tu l'alimentes depuis une broche 5 V et tu lis sa sortie à travers un pont diviseur.

Broche ACS712Arduino UnoESP32Raspberry Pi Pico
VCC5V5V (VIN sur certaines cartes)VBUS (broche 40)
OUTA0GPIO 34 (via diviseur 10k/20k)GP26 (via diviseur 10k/20k)
GNDGNDGNDGND
Bornier à visEn série avec la chargeEn série avec la chargeEn série avec la charge
Ne branche jamais les deux bornes entre le plus et le moins d'une alimentation, c'est-à-dire en parallèle comme un voltmètre. Le conducteur interne ne fait que 1,2 mΩ : c'est un court-circuit franc. L'alimentation débite tout le courant qu'elle peut, la batterie ou l'adaptateur est endommagé, et les fils comme le module peuvent brûler. Le courant mesuré doit toujours traverser une charge (moteur, lampe ou résistance).

À part la puce, le module porte très peu de composants : un condensateur de découplage sur l'alimentation, un petit condensateur sur la broche FILTER qui fixe la bande passante, la LED témoin (D1) et sa résistance (R1). Le 102 imprimé sur R1 signifie 1 kΩ ; tu peux décoder ces marquages facilement avec le décodeur de codes CMS. Comme l'ACS712 est isolé, il n'est pas nécessaire de relier le moins du circuit mesuré au GND de l'Arduino quand tu mesures seulement le courant.

Pas à pas : mesurer un courant continu avec Arduino

  1. Relie VCC du module à la broche 5V de l'Arduino, GND à GND et OUT à A0. La LED témoin de la carte doit s'allumer.
  2. Coupe le fil positif du circuit à mesurer : l'extrémité venant de l'alimentation va sur une borne, celle qui part vers la charge (par exemple un moteur 12 V ou un ruban LED) sur l'autre.
  3. Laisse l'alimentation de la charge éteinte et téléverse le programme ci-dessous. Au démarrage, il mesure le point zéro pendant qu'aucun courant ne circule.
  4. Ouvre le moniteur série à 9600 bauds ; sans courant, la valeur doit rester autour de 0,00 A et varier au plus de quelques centièmes d'ampère.
  5. Allume l'alimentation de la charge. Si le courant est négatif, inverse les deux fils du bornier ou multiplie le résultat par −1.
  6. Règle SENSITIVITY dans le code selon ton modèle : 0.185 pour le 5A, 0.100 pour le 20A et 0.066 pour le 30A.
C++ (Arduino IDE)
1// ACS712 ile DC akım ölçme / DC current measurement with ACS712
2const int SENSOR_PIN = A0;            // ACS712 OUT pini / ACS712 OUT pin
3const float SENSITIVITY = 0.185;      // V/A: 5A=0.185, 20A=0.100, 30A=0.066
4const float ADC_STEP = 5.0 / 1024.0;  // bir ADC basamağı (V) / one ADC step (V)
5const int SAMPLES = 200;              // ortalama için örnek sayısı / samples to average
6
7float zeroRaw = 512.0;                // akım yokken ham değer / raw value at zero current
8
9// SAMPLES kez okuyup ortalamayı döndürür / reads SAMPLES times and returns the average
10float readAverageRaw() {
11  long sum = 0;
12  for (int i = 0; i < SAMPLES; i++) {
13    sum += analogRead(SENSOR_PIN);
14  }
15  return sum / (float)SAMPLES;
16}
17
18void setup() {
19  Serial.begin(9600);
20  delay(500);                         // sensörün oturmasını bekle / let the sensor settle
21  zeroRaw = readAverageRaw();         // yük KAPALIYKEN sıfır noktası / zero point with the load OFF
22  Serial.print(F("Sifir noktasi / Zero point: "));
23  Serial.print(zeroRaw * ADC_STEP, 3);
24  Serial.println(F(" V"));
25}
26
27void loop() {
28  float raw = readAverageRaw();
29  float current = (raw - zeroRaw) * ADC_STEP / SENSITIVITY;  // amper / amps
30
31  Serial.print(F("Akim / Current: "));
32  Serial.print(current, 2);
33  Serial.println(F(" A"));
34  delay(500);
35}

À chaque mesure, le programme fait la moyenne de 200 lectures analogRead ; comme une lecture prend environ 0,11 ms sur l'Uno, cela représente à peu près 22 ms. Le courant se calcule avec I = (brut − zéro) × (5 / 1024) / sensibilité. Par exemple, sur le modèle 5A avec un point zéro de 512, une moyenne de 550 donne un écart de 38 pas ; cela fait 38 × 4,88 mV = 185,5 mV, donc un courant de 185,5 / 185 ≈ 1,00 A. Mesurer le point zéro au démarrage au lieu de supposer 2,5 V est important, car le décalage propre de la puce et de petites différences sur la masse de la carte le déplacent de quelques pas, et cette erreur s'ajoute à chaque mesure.

Quand tu lis l'ACS712 avec un Arduino Uno, ne change pas la référence avec quelque chose comme analogReference(INTERNAL) ; garde la référence 5 V par défaut. L'ACS712 étant ratiométrique, même si la tension USB tombe à 4,8 V, la sortie du capteur et la référence du CAN diminuent dans la même proportion ; les valeurs brutes ne changent pas et le 5.0 du code reste juste de lui-même. L'ESP32 et le Pico n'ont pas cet avantage, car leur référence de CAN ne dépend pas de l'alimentation ; on y fera une petite correction à partir du point zéro.

Bruit et moyenne

La sortie de l'ACS712 tremble sans arrêt, même à courant constant. La première cause est le bruit propre du capteur Hall : le fabricant donne les valeurs de bruit ci-dessus avec un condensateur de 47 nF sur la broche FILTER, soit une bande passante d'environ 2 kHz. Or la plupart des modules n'y ont que 1 nF, comme le schéma d'exemple du fabricant ; la bande passante monte à 80 kHz et le bruit est plusieurs fois plus élevé. La seconde cause est le CAN : même avec le modèle 5A, l'Uno mesure par pas de 26 mA, et le dernier pas oscille toujours. Le bruit aléatoire diminue avec la racine carrée du nombre d'échantillons moyennés : 16 échantillons le divisent par quatre, 256 par seize. Pour d'autres méthodes, consulte notre guide pour filtrer les données d'un capteur.

  • Moyenne sur de nombreux échantillons : en continu, fais la moyenne de 100 à 500 échantillons. Si tu les répartis sur 20 ms, le parasite à 50 Hz venant du secteur s'annule aussi dans la moyenne.
  • Moyenne mobile exponentielle : mélange chaque nouvelle mesure à l'ancienne avec filtre = filtre + 0,1 × (nouveau − filtre) ; elle ne consomme presque pas de mémoire et donne un affichage stable.
  • Zone morte : si tu ne veux pas voir de valeurs comme 0,03 A sans rien de branché, considère comme 0 les résultats dont la valeur absolue est inférieure à 0,05 A.
  • Filtre matériel : si tu sais souder, ajoute 47 nF en parallèle avec le condensateur de la broche FILTER pour ramener la bande passante à environ 2 kHz ; c'est largement suffisant en continu et pour le courant secteur à 50 Hz.
  • Éloigne-le des champs magnétiques : l'ACS712 est un capteur Hall ; un aimant, un haut-parleur ou un autre câble parcouru par un fort courant à proximité décale la mesure.
  • Remesure le point zéro : il dérive de quelques millivolts avec la température ; dans les projets qui tournent longtemps, mesure à nouveau le zéro charge éteinte.
Multimètre numérique avec cordons de mesure
Pour étalonner l'ACS712, branche un multimètre sur le calibre courant en série dans la même ligne et compare les deux mesures.

La moyenne supprime le bruit mais ne corrige pas l'erreur systématique. La sensibilité peut varier de quelques pour cent d'une puce à l'autre ; sur le modèle 5A, elle se situe entre 180 et 190 mV/A. Pour la meilleure précision, branche un multimètre sur le calibre courant en série dans la même ligne que l'ACS712, fais passer un courant connu de 1 à 2 A et compare les deux valeurs. Si le multimètre affiche 2,00 A et l'Arduino 1,94 A, ton facteur de correction est 2,00 / 1,94 = 1,031 ; divise SENSITIVITY dans le code par ce nombre (0,185 / 1,031 ≈ 0,179) et ta mesure collera à celle du multimètre.

Mesurer un courant alternatif : le calcul RMS

Le courant du secteur change sans cesse de sens : 50 Hz en France, en Belgique, en Suisse et dans la plupart des pays, 60 Hz au Canada et aux États-Unis. La sortie de l'ACS712 dessine donc une sinusoïde autour de 2,5 V dont la moyenne correspond à un courant nul ; si tu lances le programme DC sur une charge alternative, tu obtiens des valeurs absurdes proches de 0 A. En alternatif, la grandeur utile est la valeur efficace (RMS) : elle équivaut au courant continu qui produirait la même chaleur, et c'est celle qu'utilisent les multimètres, les fusibles et les plaques signalétiques. Le calcul suit son nom anglais : retire le point zéro de chaque échantillon, élève-le au carré (Square), fais la moyenne des carrés (Mean) puis prends la racine carrée (Root).

La durée de la fenêtre de mesure compte : si elle ne contient pas un nombre entier de périodes, le résultat varie un peu à chaque fois. Une période dure 20 ms à 50 Hz et 16,7 ms à 60 Hz. Une fenêtre de 100 ms contient exactement 5 périodes à 50 Hz et 6 à 60 Hz, elle fonctionne donc sur les deux réseaux, et l'Uno prend environ 900 échantillons pendant ce temps. Pour une sinusoïde pure, la crête vaut 1,414 fois la valeur efficace ; on pourrait donc aussi diviser la crête par √2. Mais des charges comme les chargeurs de téléphone, les ampoules LED ou les variateurs consomment des courants en pointes, non sinusoïdaux, et ce raccourci se trompe ; le programme ci-dessous calcule le vrai RMS et reste bien plus précis avec elles. La valeur crête doit rester dans la plage du modèle :

ModèleLimite de courant crêteCourant AC max (RMS, sinus)Puissance approx. sous 230 V
5A±5 A3,5 A≈ 800 W
20A±20 A14,1 A≈ 3250 W
30A±30 A21,2 A≈ 4900 W
C++ (Arduino IDE)
1// ACS712 ile AC akım (RMS) ve görünür güç / AC current (RMS) and apparent power with ACS712
2const int SENSOR_PIN = A0;
3const float SENSITIVITY = 0.100;      // 20A modül: 100 mV/A / 20A module: 100 mV/A
4const float ADC_STEP = 5.0 / 1024.0;
5const unsigned long WINDOW_MS = 100;  // 50 Hz'te 5, 60 Hz'te 6 tam periyot / 5 cycles at 50 Hz, 6 at 60 Hz
6const float MAINS_VOLTAGE = 230.0;    // şebeke gerilimi (V) / mains voltage (V)
7
8float noiseRms = 0.0;                 // yük yokken ölçülen gürültü (A) / noise measured with no load (A)
9
10// Pencere boyunca örnek alır, ortalamayı çıkarıp RMS hesaplar / samples over the window, removes the mean, returns RMS
11float readRmsAmps() {
12  long sum = 0;
13  unsigned long sumSq = 0;
14  unsigned int n = 0;
15  unsigned long start = millis();
16  while (millis() - start < WINDOW_MS) {
17    int d = analogRead(SENSOR_PIN) - 512;  // 2,5 V'u sıfıra yaklaştır / shift 2.5 V to about zero
18    sum += d;
19    sumSq += (long)d * d;
20    n++;
21  }
22  float mean = sum / (float)n;                       // sıfır noktası kayması / zero point offset
23  float variance = sumSq / (float)n - mean * mean;   // yalnız AC kısım / AC part only
24  if (variance < 0) variance = 0;
25  return sqrt(variance) * ADC_STEP / SENSITIVITY;
26}
27
28void setup() {
29  Serial.begin(9600);
30  delay(500);
31  noiseRms = readRmsAmps();           // ilk ölçüm yük KAPALIYKEN / first reading with the load OFF
32  Serial.print(F("Gurultu / Noise: "));
33  Serial.print(noiseRms, 3);
34  Serial.println(F(" A"));
35}
36
37void loop() {
38  float irms = readRmsAmps();
39  float sq = irms * irms - noiseRms * noiseRms;  // gürültüyü karesel çıkar / subtract noise in quadrature
40  irms = (sq > 0) ? sqrt(sq) : 0.0;
41  float apparentPower = MAINS_VOLTAGE * irms;     // VA; dirençli yükte ≈ W / VA; ≈ W for resistive loads
42
43  Serial.print(F("Irms: "));
44  Serial.print(irms, 3);
45  Serial.print(F(" A   Guc / Power: "));
46  Serial.print(apparentPower, 1);
47  Serial.println(F(" VA"));
48  delay(1000);
49}

Ce programme ne garde pas le point zéro sous forme de nombre fixe ; à chaque fenêtre, il calcule la moyenne des échantillons et la retire. Mathématiquement, c'est la racine carrée de la variance : RMS² = moyenne des carrés − carré de la moyenne. Comme un courant alternatif a une moyenne nulle sur un nombre entier de périodes, la moyenne trouvée est exactement l'erreur du point zéro, qui se corrige donc toute seule même si elle dérive avec la température. Le bruit mesuré au démarrage charge éteinte est retiré de façon quadratique, car le bruit et le vrai courant sont indépendants et les valeurs efficaces s'additionnent par leurs carrés. Sans cette étape, tu verrais des valeurs fantômes comme 0,1 A et 23 VA sans rien de branché. Un exemple : un fer à repasser de 1000 W consomme environ 4,35 A sous 230 V ; sa crête de 6,1 A dépasse la plage du modèle 5A, mesure-le donc avec le 20A.

La tension du secteur peut tuer. L'isolation à l'intérieur de la puce ACS712 est solide (tenue de 2,4 kV RMS), mais sur les modules bon marché, les vis du bornier et les soudures sous la carte sont au potentiel du secteur et à nu. Fais les branchements uniquement prise débranchée, place le module dans un boîtier plastique fermé, ajoute un fusible sur la ligne et ne touche à rien quand le circuit est sous tension. Mesurer le secteur avec l'Arduino relié à l'ordinateur en USB met aussi ton ordinateur en danger en cas de défaut ; il est plus sûr d'afficher les résultats sur un écran ou de les envoyer sans fil avec un ESP32. Si tu n'as pas d'expérience des installations électriques, ne fais pas cette expérience seul ; si tu es élève, travaille toujours avec un adulte qui s'y connaît en électricité.

Une méthode bien plus sûre pour mesurer le courant d'un appareil domestique est un transformateur de courant à noyau ouvrant comme le SCT-013, qui s'utilise sans couper aucun fil. Il se referme autour du câble comme une pince ampèremétrique et n'a aucun contact métallique avec le secteur. Le seul point à surveiller : la pince doit entourer uniquement la phase ou uniquement le neutre ; si tu entoures les deux conducteurs, les champs des courants opposés s'annulent et le résultat est nul. Les transformateurs de courant ne mesurent que l'alternatif ; pour le continu, il te faut l'ACS712 ou l'INA219.

Calculer la puissance (W) et l'énergie (Wh)

Une fois le courant connu, la puissance n'est qu'une multiplication : P = U × I. Si une batterie de 12 V alimente un moteur qui consomme 1,5 A, la puissance vaut 12 × 1,5 = 18 W ; tu peux le vérifier avec le calculateur de loi d'Ohm. L'énergie, c'est la puissance multipliée par le temps : si le moteur de 18 W tourne 2 heures, il consomme 36 Wh. Le programme le fait en multipliant à chaque mesure la puissance par le temps écoulé et en cumulant. Pour mesurer la tension, tu peux utiliser le module vendu comme capteur de tension 0–25 V ; il contient un pont diviseur de tension de 30 kΩ et 7,5 kΩ qui divise la tension d'entrée par 5. Pour concevoir un diviseur avec tes propres résistances, utilise le calculateur de pont diviseur.

C++ (Arduino IDE)
1// ACS712 + gerilim sensörü ile güç (W) ve enerji (Wh) / power (W) and energy (Wh) with ACS712 + voltage sensor
2const int CURRENT_PIN = A0;           // ACS712 OUT
3const int VOLTAGE_PIN = A1;           // 0-25 V gerilim sensörü S pini / 0-25 V voltage sensor S pin
4const float SENSITIVITY = 0.185;      // 5A modül / 5A module (V/A)
5const float DIVIDER_RATIO = 5.0;      // (30k + 7,5k) / 7,5k = 5 / divider ratio
6const float ADC_STEP = 5.0 / 1024.0;
7const int SAMPLES = 200;
8
9float zeroRaw = 512.0;
10float energyWh = 0.0;                 // biriken enerji / accumulated energy
11unsigned long lastMs = 0;
12
13float averageRaw(int pin) {
14  long sum = 0;
15  for (int i = 0; i < SAMPLES; i++) sum += analogRead(pin);
16  return sum / (float)SAMPLES;
17}
18
19void setup() {
20  Serial.begin(9600);
21  delay(500);
22  zeroRaw = averageRaw(CURRENT_PIN);  // yük kapalıyken sıfır noktası / zero point with the load off
23  lastMs = millis();
24}
25
26void loop() {
27  float current = (averageRaw(CURRENT_PIN) - zeroRaw) * ADC_STEP / SENSITIVITY;
28  float voltage = averageRaw(VOLTAGE_PIN) * ADC_STEP * DIVIDER_RATIO;
29  float power = voltage * current;    // P = V x I (W)
30
31  unsigned long now = millis();
32  energyWh += power * (now - lastMs) / 3600000.0;  // W x saat = Wh / W x hours = Wh
33  lastMs = now;
34
35  Serial.print(voltage, 2);  Serial.print(F(" V   "));
36  Serial.print(current, 2);  Serial.print(F(" A   "));
37  Serial.print(power, 1);    Serial.print(F(" W   "));
38  Serial.print(energyWh, 3); Serial.println(F(" Wh"));
39  delay(1000);
40}

Comme le module de tension se branche entre le plus et le moins du circuit mesuré, cette fois le moins du circuit et le GND de l'Arduino doivent être reliés ; tu trouveras pourquoi dans notre guide sur la masse commune. Pour estimer combien d'heures tiendra une batterie, combine le courant moyen mesuré avec les calculs en mAh et Wh ou avec le calculateur d'autonomie de batterie. Côté alternatif, c'est un peu différent : Ueff × Ieff donne la puissance apparente, en VA ; la puissance active (W) est cette valeur multipliée par le facteur de puissance. Pour les charges résistives comme une bouilloire, un fer à repasser ou une ampoule à incandescence, le facteur de puissance est très proche de 1 et VA ≈ W. Pour les moteurs, adaptateurs et ampoules LED, il peut se situer entre 0,5 et 0,9 ; pour mesurer la vraie puissance active, il faut échantillonner en même temps la forme d'onde de la tension, avec des modules capteurs de tension isolés comme le ZMPT101B.

ACS712 avec ESP32 : lecture à travers un pont diviseur

L'ESP32 fonctionne en 3,3 V et ses entrées analogiques mesurent jusqu'à environ 3,1 V ; appliquer plus de 3,6 V sur une broche peut endommager la carte. L'ACS712, lui, ne fonctionne qu'en 5 V, et sa sortie peut atteindre 4,5 V sur les modèles 20A et 30A, et presque 5 V en surintensité. Tu alimentes donc le capteur depuis la broche 5V de la carte ESP32 (VIN sur certaines cartes) et tu fais passer OUT par un pont diviseur. 10 kΩ + 20 kΩ est un bon choix : de OUT à la broche de l'ESP32 à travers 10 kΩ, et de ce même point vers GND à travers 20 kΩ. Le rapport vaut 20 / 30 = 0,667, et les 30 kΩ au total respectent sans peine la charge minimale de 4,7 kΩ demandée par l'ACS712.

Sortie de l'ACS712SignificationTension sur la broche de l'ESP32
0,50 V−20 A sur le modèle 20A0,33 V
2,50 VCourant nul1,67 V
4,50 V+20 A sur le modèle 20A3,00 V
5,00 VSaturation en surintensité3,33 V

Le code comporte deux détails. D'abord, le CAN de l'ESP32 n'est pas linéaire aux extrémités ; au lieu des valeurs brutes, on utilise donc analogReadMilliVolts(), qui applique les données d'étalonnage écrites dans la puce en usine. Le GPIO 34 appartient à l'ADC1 et fonctionne Wi-Fi actif ; les broches de l'ADC2 ne sont pas utilisables avec le Wi-Fi. Ensuite, l'avantage ratiométrique de l'Uno n'existe pas ici : la référence du CAN de l'ESP32 est fixe, mais la sensibilité de l'ACS712 change avec les 5 V venant de l'USB. La solution est une astuce simple : comme la sortie vaut la moitié de VCC sans courant, tu multiplies par 2 le point zéro mesuré au démarrage pour obtenir la vraie tension d'alimentation du capteur, puis tu corriges la sensibilité en conséquence. Comme la même erreur se retrouve dans le point zéro et dans le signal mesuré, cette méthode compense aussi la tolérance des résistances du diviseur. Le programme échantillonne pendant 100 ms et renvoie deux résultats : regarde le premier pour une charge en continu et le second pour un appareil sur secteur.

C++ (Arduino IDE)
1// ESP32 + ACS712 (10k/20k gerilim bölücüyle) / ESP32 + ACS712 (with a 10k/20k voltage divider)
2const int SENSOR_PIN = 34;            // ADC1_CH6, Wi-Fi açıkken de çalışır / works while Wi-Fi is on
3const float DIVIDER = 20.0 / 30.0;    // R2 / (R1 + R2) = 20k / 30k
4const float SENS_AT_5V = 185.0;       // mV/A: 5A=185, 20A=100, 30A=66
5const unsigned long WINDOW_MS = 100;  // 50 Hz'te 5 tam periyot / 5 full cycles at 50 Hz
6
7float zeroMv = 2500.0;                // akım yokken sensör çıkışı (mV) / sensor output at zero current (mV)
8float sensMv = SENS_AT_5V;            // düzeltilmiş hassasiyet (mV/A) / corrected sensitivity (mV/A)
9
10// Bölücüden önceki gerilimin ortalaması (mV) / average voltage before the divider (mV)
11float averageMv(int samples) {
12  uint32_t sum = 0;
13  for (int i = 0; i < samples; i++) sum += analogReadMilliVolts(SENSOR_PIN);
14  return sum / (float)samples / DIVIDER;
15}
16
17// Pencere boyunca okur: DC (ortalama) ve AC (RMS) akım / reads over the window: DC (mean) and AC (RMS) current
18void measure(float &dcAmps, float &acAmps) {
19  double sum = 0, sumSq = 0;
20  uint32_t n = 0;
21  uint32_t start = millis();
22  while (millis() - start < WINDOW_MS) {
23    double d = analogReadMilliVolts(SENSOR_PIN) / DIVIDER - zeroMv;
24    sum += d;
25    sumSq += d * d;
26    n++;
27  }
28  double mean = sum / n;
29  double variance = sumSq / n - mean * mean;
30  if (variance < 0) variance = 0;
31  dcAmps = mean / sensMv;
32  acAmps = sqrt(variance) / sensMv;
33}
34
35void setup() {
36  Serial.begin(115200);
37  analogReadResolution(12);
38  delay(500);
39  zeroMv = averageMv(1000);                    // yük KAPALIYKEN / with the load OFF
40  sensMv = SENS_AT_5V * (2.0 * zeroMv) / 5000.0;  // oransal düzeltme: VCC = 2 x sıfır / ratiometric fix: VCC = 2 x zero
41  Serial.printf("Sifir / Zero: %.0f mV  Hassasiyet / Sensitivity: %.1f mV/A\n", zeroMv, sensMv);
42}
43
44void loop() {
45  float dc, ac;
46  measure(dc, ac);
47  Serial.printf("DC: %.2f A   AC (RMS): %.2f A\n", dc, ac);
48  delay(1000);
49}

ACS712 avec Raspberry Pi Pico et MicroPython

Le Raspberry Pi Pico fonctionne lui aussi en 3,3 V, le câblage est donc le même que pour l'ESP32 : relie VCC de l'ACS712 à VBUS (broche 40), qui fournit 5 V quand le Pico est alimenté en USB, et OUT à GP26 (ADC0, broche 31) à travers le même diviseur 10k/20k. En MicroPython, read_u16() renvoie une valeur de 0 à 65535, et tension = brut × 3,3 / 65535. Le CAN du Pico est sur 12 bits ; avec le diviseur, il mesure en théorie par pas d'environ 6,5 mA sur le modèle 5A, soit environ quatre fois plus finement que l'Uno. Le code ci-dessous mesure le point zéro au démarrage, applique la correction ratiométrique, puis affiche chaque seconde le courant continu et la valeur efficace du courant alternatif.

MicroPython
1from machine import ADC
2import time
3import math
4
5adc = ADC(26)            # GP26 = ADC0, fiziksel pin 31 / physical pin 31
6VREF = 3.3               # ADC referansı (V) / ADC reference (V)
7DIVIDER = 20 / 30        # 10k/20k bölücü oranı / 10k/20k divider ratio
8SENS_AT_5V = 0.185       # V/A: 5A=0.185, 20A=0.100, 30A=0.066
9
10
11def read_volts(samples=200):
12    # bölücüden önceki ortalama gerilim / average voltage before the divider
13    total = 0
14    for _ in range(samples):
15        total += adc.read_u16()          # 0-65535
16    return total / samples * VREF / 65535 / DIVIDER
17
18
19zero = read_volts(1000)                  # yük KAPALIYKEN / with the load OFF
20sens = SENS_AT_5V * (2 * zero) / 5.0     # oransal düzeltme / ratiometric correction
21print("Sifir / Zero: {:.3f} V".format(zero))
22
23
24def read_rms(window_ms=100):
25    # 100 ms = 50 Hz'te 5 periyot / 5 cycles at 50 Hz
26    n = 0
27    s = 0.0
28    s2 = 0.0
29    start = time.ticks_ms()
30    while time.ticks_diff(time.ticks_ms(), start) < window_ms:
31        v = adc.read_u16() * VREF / 65535 / DIVIDER - zero
32        s += v
33        s2 += v * v
34        n += 1
35    mean = s / n
36    return math.sqrt(max(s2 / n - mean * mean, 0)) / sens
37
38
39while True:
40    dc = (read_volts() - zero) / sens
41    print("DC: {:.2f} A   AC (RMS): {:.2f} A".format(dc, read_rms()))
42    time.sleep(1)

ACS712 ou INA219 ?

L'INA219 est une puce de mesure de courant et de tension de Texas Instruments qui communique en I2C. Au lieu de l'effet Hall, elle mesure la chute de tension aux bornes d'une petite résistance shunt (en général 0,1 Ω sur les modules) traversée par le courant. Les modules courants mesurent jusqu'à ±3,2 A avec une résolution d'environ 0,8 mA, lisent eux-mêmes la tension du bus jusqu'à 26 V et calculent la puissance dans la puce. Avec une seule liaison I2C, tu obtiens donc tension, courant et puissance, sans te soucier du CAN, de la moyenne ou de l'étalonnage du zéro. En revanche, il n'y a pas d'isolation entre le circuit mesuré et l'Arduino, il ne mesure pas le courant alternatif et ne dépasse pas 26 V.

CaractéristiqueACS712Module INA219
Principe de mesureEffet Hall (magnétique)Résistance shunt (0,1 Ω)
Plage de courant±5 / ±20 / ±30 A±3,2 A (selon le shunt)
Résolution26–74 mA avec l'Uno≈ 0,8 mA
Courant alternatifOuiNon
Mesure de tension et de puissanceNon (diviseur séparé nécessaire)Oui (jusqu'à 26 V)
IsolationOuiNon
InterfaceSortie analogiqueI2C (adresse 0x40–0x4F)
Alimentation5 V uniquement3–5,5 V
Usage idéalMoteurs, chauffages, appareils secteur, forts courantsBatteries, panneaux solaires, consommation de capteurs et de cartes
C++ (Arduino IDE)
1#include <Wire.h>
2#include <Adafruit_INA219.h>
3
4Adafruit_INA219 ina219;               // varsayılan adres 0x40 / default address 0x40
5
6void setup() {
7  Serial.begin(9600);
8  if (!ina219.begin()) {
9    Serial.println(F("INA219 bulunamadi / INA219 not found"));
10    while (true) delay(10);
11  }
12  // ina219.setCalibration_16V_400mA();  // küçük akımda daha ince çözünürlük / finer resolution for small currents
13}
14
15void loop() {
16  float busV = ina219.getBusVoltage_V();        // yük tarafındaki gerilim / voltage on the load side
17  float current_mA = ina219.getCurrent_mA();    // akım (mA) / current (mA)
18  float power_mW = ina219.getPower_mW();        // güç (mW) / power (mW)
19
20  Serial.print(busV, 2);       Serial.print(F(" V   "));
21  Serial.print(current_mA, 1); Serial.print(F(" mA   "));
22  Serial.print(power_mW, 0);   Serial.println(F(" mW"));
23  delay(1000);
24}

Pour le code, installe la bibliothèque Adafruit INA219 depuis le gestionnaire de bibliothèques. Relie SDA et SCL du module à A4 et A5 sur l'Uno ; le courant mesuré doit entrer par VIN+ et ressortir par VIN− vers la charge, et le GND de l'INA219 doit être commun avec le circuit mesuré. En bref : pour mesurer un courant continu de quelques milliampères à 3 A avec sa tension, choisis l'INA219 ; si tu as besoin de courants plus forts, d'alternatif ou d'isolation, l'ACS712 est le bon choix.

Idées de projets avec l'ACS712

  • Protection d'un moteur contre les surintensités : quand un moteur à courant continu piloté par un L298N se bloque, son courant s'envole ; arrête le moteur et déclenche une alarme dès que ton seuil est dépassé.
  • Moniteur de batterie et de panneau solaire : mesure le courant de charge et de décharge avec son sens, multiplie-le par la tension, cumule les Wh et affiche le tout sur un écran OLED.
  • Prise connectée : commande la prise avec un module relais, vérifie avec l'ACS712 que l'appareil fonctionne vraiment et envoie les données à Home Assistant via MQTT.
  • Alerte fin de lessive : quand le courant reste quelques minutes sous une valeur donnée, l'ESP32 t'envoie un message sur Telegram.
  • Alarme de pompe à sec : quand l'eau manque, le courant de la pompe chute ; détecte-le et coupe la pompe.
  • Enregistreur d'énergie : écris le courant et la puissance chaque minute sur une carte SD ou dans Google Sheets et trace la consommation journalière.
  • Wattmètre d'atelier : ajoute un ACS712 au projet de voltmètre Arduino pour fabriquer un instrument qui affiche tension, courant et puissance sur un seul écran.

Erreurs fréquentes et solutions

SymptômeCause probableSolution
Affiche 0,1–0,3 A sans courantLe code suppose un point zéro à 2,5 V ou 512Mesure le point zéro au démarrage charge éteinte et ajoute une petite zone morte
La valeur saute sans arrêtLectures isolées, large bande passante du filtre de 1 nFFais la moyenne de 100 à 500 échantillons ; ajoute 47 nF sur FILTER si besoin
Le courant est négatifLe courant traverse le bornier dans l'autre sensInverse les fils ou multiplie le résultat par −1
Valeurs proches de 0 A sur une charge ACCode DC utilisé ; une sinusoïde a une moyenne nulleUtilise le programme qui calcule le RMS
Valeurs toujours trop hautes ou trop basses de quelques pour centMauvaise valeur de modèle ou tolérance de sensibilitéChoisis 0.185, 0.100 ou 0.066 selon le marquage et étalonne avec un multimètre
La valeur brute reste bloquée à 0 ou 1023OUT sur la mauvaise broche ou relié à VCC, courant hors plageVérifie le câblage et prends un modèle plus grand si besoin
L'alimentation se coupe, le fil chauffeBornier branché en parallèle sur la source (court-circuit)Branche le module en série avec la charge
Valeurs incohérentes sur l'ESP32Pas de diviseur, broche ADC2 ou analogRead brutUtilise un diviseur 10k/20k, le GPIO 34 et analogReadMilliVolts
La mesure change près d'un aimantLe capteur Hall capte le champ magnétique extérieurÉloigne le module des aimants, haut-parleurs et câbles à fort courant
Le plus simple pour vérifier que ton capteur de courant fonctionne est d'utiliser une charge connue. Par exemple, une résistance de 10 Ω sous 12 V consomme 1,2 A d'après la loi d'Ohm et dissipe 14,4 W en chaleur ; choisis donc une résistance de puissance d'au moins 20–25 W. Si tu mesures environ 1,2 A, ton câblage et ton code sont corrects.

L'ACS712 est un excellent point de départ pour apprendre à mesurer un courant : avec une seule broche analogique, tu mesures le courant continu et alternatif, et avec quelques lignes de code, la puissance et l'énergie. Si tu choisis le bon modèle, mesures le point zéro, fais la moyenne et étalonnes avec un multimètre, tu obtiendras des résultats fiables à quelques pour cent près. Tu peux consolider les bases de la lecture analogique dans notre guide sur le CAN. Dans l'application BlueGrays, tu trouveras des projets comme la lecture de capteurs analogiques, un voltmètre numérique avec écran LCD, la commande d'une ampoule secteur par relais et un enregistreur de données ESP32, chacun avec son schéma et son code pas à pas.

Questions fréquentes

Combien d'ampères mesure l'ACS712 et quel modèle choisir ?

L'ACS712 existe en trois modèles pour ±5 A, ±20 A et ±30 A, avec des sensibilités de 185, 100 et 66 mV/A. Choisis le plus petit modèle qui couvre ton courant maximal (la valeur crête en alternatif) ; un modèle plus petit donne une plus grande variation de sortie et une meilleure résolution pour le même courant. Tu reconnais le modèle au marquage ELC-05B, ELC-20A ou ELC-30A sur la puce.

Pourquoi l'ACS712 donne-t-il 2,5 V sans courant ?

La sortie part de la moitié de la tension d'alimentation pour que l'ACS712 puisse mesurer un courant dans les deux sens. Quand le courant circule dans un sens, la sortie monte au-dessus de 2,5 V ; dans l'autre sens, elle descend. Si l'alimentation n'est pas exactement de 5 V, le point zéro se décale à VCC / 2 ; c'est pourquoi il vaut mieux le mesurer au démarrage.

Peut-on mesurer le courant du secteur 230 V avec l'ACS712 ?

Oui, la puce offre une tenue d'isolement de 2,4 kV RMS ; sous 230 V, le modèle 5A convient jusqu'à environ 800 W et le 20A jusqu'à environ 3250 W. Mais le bornier et les soudures du module sont au potentiel du secteur : branche-le uniquement prise débranchée, place-le dans un boîtier fermé et ne travaille pas seul sans expérience. Une solution plus sûre est une pince de courant comme le SCT-013, qui ne demande de couper aucun fil.

L'ACS712 fonctionne-t-il avec un ESP32 ou en 3,3 V ?

L'ACS712 a besoin de 4,5 à 5,5 V et ne donne pas de résultats corrects en 3,3 V. Sur l'ESP32 et le Raspberry Pi Pico, alimente le module par la broche 5V, VIN ou VBUS et relie sa sortie à la broche analogique à travers un pont diviseur de 10 kΩ + 20 kΩ. Ainsi, même une sortie proche de 5 V reste sous 3,33 V sur la broche.

Pourquoi l'ACS712 n'affiche-t-il pas zéro sans courant ?

Il y a deux raisons : le code suppose un point zéro exactement à 2,5 V ou 512, et le capteur a son propre bruit. Mesure le point zéro au démarrage charge éteinte, fais la moyenne de 100 à 500 échantillons et ajoute une petite zone morte d'environ 0,05 A. En alternatif, retirer le bruit de façon quadratique supprime le courant fantôme affiché au repos.

ACS712 ou INA219 : lequel est le meilleur ?

Tout dépend de l'usage. L'INA219 fonctionne en I2C et fournit courant, tension et puissance avec une résolution d'environ 0,8 mA jusqu'à ±3,2 A ; il est bien plus précis pour les batteries et les petits circuits en continu. L'ACS712 mesure jusqu'à 30 A, lit aussi le courant alternatif et isole le circuit mesuré de l'Arduino.

Voir tous les projets
Mesurer l'intensité lumineuse avec une LDR
#11Débutant

Mesurer l'intensité lumineuse avec une LDR

Envie de voir en chiffres à quel point ta chambre est lumineuse ? Le LDR, une petite pièce sensible à la lumière, mesure la lumière ambiante, et l'Arduino écrit la valeur sur l'écran de ton ordinateur

4.6(81)
139
Mesure de l'intensité lumineuse avec le module LDR ESP32
#113Débutant

Mesure de l'intensité lumineuse avec le module LDR ESP32

Suivi en temps réel sur le moniteur série de la valeur brute de l'ADC du module LDR et du pourcentage relatif de luminosité calculé à partir de références dans l'obscurité et à la lumière. Ce pourcentage n'est pas une mesure en lux. Permet de comprendre le principe de calibrage du module. Il est préférable de réaliser cet exercice avant le projet 10, car il sert à déterminer la valeur seuil.

4.6(36)
55
Voltmètre numérique avec écran LCD
#56Intermédiaire
Premium

Voltmètre numérique avec écran LCD

Découvre quelle tension fournit une pile ou un adaptateur avec un appareil de mesure fait maison. Un diviseur de deux résistances abaisse la tension élevée à un niveau que la carte peut lire, et l'Ard

4.5(27)
36
Ampoule 220V avec bouton poussoir (Push)
#19Avancé
Premium

Ampoule 220V avec bouton poussoir (Push)

Tant que tu appuies sur le bouton, une vraie ampoule de 220 volts reste allumée, et elle s'éteint dès que tu relâches. Le petit signal de l'Arduino ne peut pas allumer l'ampoule directement : un relai

4.4(30)
38
Luminosité d'une LED avec un Potentiomètre sur ESP32 (Analogique → PWM)
#115Intermédiaire
Premium

Luminosité d'une LED avec un Potentiomètre sur ESP32 (Analogique → PWM)

Dans ce projet, nous contrôlons la luminosité d'une LED de manière analogique à l'aide d'un potentiomètre. La broche ADC de l'ESP32 lit la tension entre 0 et 3,3 V provenant du potentiomètre, puis cette valeur est convertie en signal PWM (modulation de largeur d'impulsion) envoyé à la LED. Ainsi, la LED s'allume et s'éteint progressivement. Avec Arduino Core 3.0+, analogWrite() est utilisable directement; sur ESP32-S2/S3, la résolution de l'ADC est fixée à 12 bits.

4.5(19)
32
Utilisation de l'écran LCD avec I2C
#32Débutant
Premium

Utilisation de l'écran LCD avec I2C

Offre un écran à ton Arduino et fais-lui écrire son premier message. L'écran LCD à deux lignes se branche avec seulement quelques fils ; un bonjour s'affiche sur la ligne du haut, puis un deuxième tex

4.8(53)
70
Écran LCD I2C ESP32 (16x2)
#119Intermédiaire
Premium

Écran LCD I2C ESP32 (16x2)

Dans ce projet, nous affichons du texte en connectant un écran LCD 16x2 à l'ESP32 via le protocole I2C. Grâce à l'I2C, nous pouvons contrôler l'écran avec seulement 2 broches de données (SDA et SCL) ; cela évite le gaspillage de 6 broches ou plus inhérent à la connexion parallèle classique. Le code affiche un message fixe sur la première ligne et un compteur qui augmente chaque seconde sur la deuxième ligne. De plus, au démarrage, nous lançons un scanner I2C pour afficher l'adresse de l'écran su

4.9(23)
40
Enregistreur de Température ESP32 (DHT22 + DS1307 RTC + microSD + OLED)
#144Avancé
Premium

Enregistreur de Température ESP32 (DHT22 + DS1307 RTC + microSD + OLED)

Construis un enregistreur de température horodaté avec ESP32 ! Lis la température/humidité du DHT22 chaque minute, obtiens l'heure réelle du DS1307 RTC et enregistre sur carte microSD au format CSV. L'OLED affiche en direct la température (grande police), le pourcentage d'humidité, l'horodatage et le compteur. Le fichier /temp_log.csv sur la carte SD s'ouvre dans Excel, Google Sheets ou Python pandas pour analyse — parfait pour surveillance de serre, suivi de température à domicile, c

4.7(7)
12