Mesure précise du courant alternatif avec le capteur ACS712 sur Arduino
Composants et fournitures
| Composant | Quantité |
|---|---|
| Arduino UNO | 1 |
| Écran OLED I²C 128x32 | 1 |
| Capteur ACS712 30A | 1 |
| Écran LCD 16x2 I²C | 1 |
À propos de ce projet
⚠ ATTENTION : Manipulation du secteur – Danger de mort. Prenez toutes les précautions nécessaires.
Ce tutoriel montre comment mesurer le courant alternatif (AC) avec le capteur à effet Hall ACS712 (version 30A) et un Arduino Uno. Nous verrons comment obtenir la valeur efficace réelle (TRMS – True RMS) pour tout type de signal, pas seulement sinusoïdal.
Le capteur utilise l'effet Hall : production d'une tension proportionnelle au courant traversé, isolée galvaniquement du circuit de mesure.
Tests réalisés sur ampoule à incandescence 75W avec variateur de lumière (triac), en série avec un multimètre de référence et le module ACS712.
Plan du tutoriel
- Interface du module avec Arduino – visualisation du signal (cycle complet, demi-cycle).
- Code simple pour signaux sinusoïdaux uniquement (méthode crête-à-crête).
- Code TRMS universel (bibliothèque Filters) avec affichage LCD/OLED.
Choix du capteur ACS712
Versions : 5A, 20A, 30A. Évitez le 30A pour usage domestique : sensibilité trop faible, grandes fluctuations à bas courant. Un 5A ou 10A est préférable. La calibration (pente/intercept) dépend de la version – expliquée dans le code.
Test 1 : Visualisation du signal brut
Câblage (Test 1, 2, 3 identiques)
- VCC ACS712 → 5V Arduino
- GND → GND
- OUT → A0
- Circuit secteur : phase → charge (ampoule) → borne IP+ du ACS712 ; borne IP- → neutre
Code 1 : Lecture brute (Serial Plotter)
#define Current_sensor A0
float i;
void setup() {
Serial.begin(9600);
pinMode(Current_sensor, INPUT);
}
void loop() {
i = analogRead(Current_sensor);
Serial.println(i);
delay(100); // Ajuster pour forme d'onde correcte
}
Résultat : sinusoïde visible. Avec variateur (triac), forme d'onde tronquée caractéristique.
Test 2 : Méthode crête-à-crête (sinusoïde seulement)
Code 2 : Calcul RMS par crête-à-crête
#define SAMPLES 300
#define ACS_Pin A0
float High_peak, Low_peak, Amps_Peak_Peak, Amps_RMS;
void setup() {
Serial.begin(9600);
pinMode(ACS_Pin, INPUT);
}
void loop() {
read_Amps();
Amps_RMS = Amps_Peak_Peak * 0.3536 * 0.06; // 0.06 = facteur calibration
Serial.print(Amps_RMS); Serial.print("\t"); Serial.println(Amps_Peak_Peak);
delay(200);
}
void read_Amps() {
int cnt; High_peak = 0; Low_peak = 1024;
for (cnt = 0; cnt < SAMPLES; cnt++) {
float ACS_Value = analogRead(ACS_Pin);
if (ACS_Value > High_peak) High_peak = ACS_Value;
if (ACS_Value < Low_peak) Low_peak = ACS_Value;
}
Amps_Peak_Peak = High_peak - Low_peak;
}
Fonctionne pour sinusoïde pure (variateur au max). Échoue avec variateur bas : multimètre 0,21A vs code 0,36A. La méthode crête-à-crête ne convient qu'aux signaux sinusoïdaux.
Test 3 : Vrai TRMS pour tout signal (Bibliothèque Filters)
Bibliothèque requise
Filters.h – téléchargeable via le lien du tutoriel. Utilise des méthodes statistiques (fenêtre glissante, sigma).
Code 3 : TRMS sur moniteur série
#include
#define ACS_Pin A0
float testFrequency = 50;
float windowLength = 40.0 / testFrequency;
float intercept = 0; // À calibrer
float slope = 0.0752; // À calibrer
float Amps_TRMS, ACS_Value;
unsigned long printPeriod = 1000, previousMillis = 0;
void setup() {
Serial.begin(9600);
pinMode(ACS_Pin, INPUT);
}
void loop() {
RunningStatistics inputStats;
inputStats.setWindowSecs(windowLength);
while (true) {
ACS_Value = analogRead(ACS_Pin);
inputStats.input(ACS_Value);
if (millis() - previousMillis >= printPeriod) {
previousMillis = millis();
Amps_TRMS = intercept + slope * inputStats.sigma();
Serial.print("\t Amps: "); Serial.println(Amps_TRMS);
}
}
}
Calibration (intercept & slope)
- Affichez
inputStats.sigma()à courant nul → ajustezinterceptpour lire 0. - Appliquez un courant connu (ex: ampoule 75W / 230V ≈ 0,326A). Calculez
slope = courant_réel / valeur_mesurée.
Résultats : correspondance quasi parfaite avec le multimètre, même avec variateur (signal non-linéaire).
Test 4 : Affichage sur LCD I²C ou OLED
Même code TRMS, affichage sur écran.
Code LCD I²C
#include
#include
#define ACS_Pin A0
#define I2C_ADDR 0x27
// ... même logique TRMS ...
lcd.setCursor(2,0); lcd.print(Amps_TRMS); lcd.print(" A");
Code OLED 128x32 (Adafruit SSD1306)
#include
#include
#include
// ... même logique TRMS ...
display.setCursor(15,10); display.print(Amps_TRMS); display.println(" A");
L'OLED a été cassé pendant le tournage – seul le test LCD est présenté. Fonctionne identiquement.
Schématiques
- Câblage commun (Tests 1-3)
- Câblage LCD I²C
- Câblage OLED 128x32
Processus de fabrication
- Mesurer la qualité de l'air avec OpenSensors : Guide Arduino et Python
- Capteur CO2 K30 : Surveillance en temps réel de la qualité de l'air intérieur
- Faciliter la communication sourd-aveugle avec 1Sheeld et Arduino
- Construire une Tirelire Intelligente : Contrôler un Accepteur de Pièces avec Arduino Nano
- Contrôler une LED par Bluetooth avec Arduino et MIT App Inventor
- Intégrer un capteur d'empreintes capacitif DFRobot (ID809) avec Arduino ou ESP8266
- Station météo interactive Nextion HMI avec Arduino Mega et capteurs
- Bras robotique 6 DoF piloté par Nunchuk Wii – Kit Arduino Mega
- Animez Votre Poisson Billy Bass avec N'importe Quelle Source Audio – Guide Pas à Pas