Nous avons beaucoup cherché, dans le commerce, un compteur d'énergie bidirectionnel, monophasé, 230V avec un capteur d'intensité (tore) et un afficheur. Malgré nos longues recherches nous n'en avons pas trouvé...
Il existe des compteurs d'énergie bidirectionnels sans afficheur (Wifi). Des compteurs d'énergie avec afficheur mais qui ne sont pas bidirectionnels... ou alors sans capteur séparé...
Nous avons besoin d'un compteur bidirectionnel, à cause des panneaux solaires : l'énergie peut donc rentrer dans la maison ou en sortir.
Nous avons donc décidé d'en fabriquer un à partir d'un Arduino Nano USB-C, basique.
Pour faciliter le montage, la mise au point et le remplacement éventuel de l'Arduino Nano, nous l'avons installé sur une plaque bornier très pratique :
Pour éviter de démonter et de débrancher l'adaptateur USB chaque fois que l'on veut retoucher le programme, nous avons relié les fils + et masse du cordon USB intérieur à la carte bornier. Nous avons ajouté une "rallonge" USB-C dont l'embase femelle est fixée sur le côté droit du coffret. Ainsi programmer est très facile.
Pour l'isolation galvanique et la mesure instantanée de la tension, le compteur est muni d'un petit transformateur classique 12V 2W :
Mais nous avons décidé d'alimenter l'Arduino et l'afficheur avec un petit chargeur USB séparé...
Le transfo est relié à une petite embase et un câble secteur
La sortie du transfo est atténuée filtrée (R10k/C3.3uF) puis reliée aux entrées A0 & A1 de l'Arduino (via 2 R10k de protection). L'entrée A1 est reliée à la masse par R10k, au +5V par R10k pour polariser les entrées à 2.5V. Un adaptateur USB ordinaire alimente l'ensemble. Nous n'utilisons pas le transfo comme alimentation pour ne pas tordre son signal de sortie et fausser la mesure de tension. Nous utilisons un afficheur LCD 2x16 caractères I2C "en stock", un ajustable permet de régler le contraste et un connecteur permet d'ajouter une résistance pour régler l'intensité du backlight (et la consommation). Pour ce programme, un 4x16 ou 4x20 serait plus adapté...
Un capteur d'énergie torique (du commerce) est relié par une prise Jack via un câble de 1m50 au compteur d'énergie. (entrées A2 & A3) (via 2 R10k série en protection avec chacune un condensateur C100nF relié à la masse pour filtrage).
Le capteur d'énergie, est relié aux entrées A2 A3 de l'Arduino. L'entrée A3 est reliée à la masse par R10k, au +5V par R10k pour polariser les entrées à 2.5V.
L'afficheur 2x16 caractères affiche alternativement :
La tension en V, la puissance en W
Le sens et le courant en A
Nota : l'affichage (précis) de la tension et du courant facilite l'étalonnage du compteur.
Au bout d'une seconde :
Le sens, un bargraph 5 niveaux sur 1 caractère et l'énergie qui rentre en kWh
Le sens, un bargraph 5 niveaux sur 1 caractère, et l'énergie qui sort en kWh
Au bout d'une autre seconde :
Le sens, un bargraph 5 niveaux sur 1 caractère et l'énergie qui rentre en € (ce qui est payé à EDF)
Le sens, un bargraph 5 niveaux sur 1 caractère et l'énergie qui sort en kWh
Et au bout d'une seconde, de nouveau la tension, la puissance...
Toutes les heures, les énergies sont enregistrées dans l'EEPROM du microcontrôleur : en cas de panne de courant, les données ne sont pas perdues.
(Seulement toutes les heures pour ne pas "user" l'EEPROM. Soit environ 100 000 écritures en 10 ans, qui correspond à la limite basse théorique de l'EEPROM).
Un bouton poussoir (rouge) permet de remettre les compteurs à 0 (En général, nous l'activons tous les 1er du mois).
La base du programme Arduino a été écrite, comme d'habitude avec une IA (qui fait ça très bien) et retouchée. Le programme tient compte de la phase de la tension et du courant pour déterminer si l'énergie rentre ou sort.
Nous conseillons d'écrire plusieurs versions du programme :
Pour afficher la tension et le courant (et étalonner avec un multimètre)
Tester le sens de l'énergie
Ajouter l'affichage de la puissance et de l'énergie
Rajouter la fonction d'écriture 1 fois par heure (et lecture au démarrage) de l'EEPROM
Code provisoire : La gestion de l'EEPROM n'est pas encore faite dans ce code (débrancher le secteur remet les énergies à 0) :
/*energie 01 13/06/2025
Compteur énergie 230V bidirectionnel
Arduino Nano USB-C
1 Fichier, Enregistrer
2 Fichier, Préférences, Paramètres, Afficher les résultats détaillés pendant, Téléversement, OK
3 Croquis, Vérifier, Compiler : pas d'erreurs
4 Brancher cordon USB C entre PC et Nano
5 Outils, type de carte Arduino Nano
6 Outils, Processeur, Atmega 328P (sinon erreur avrdude...)
7 Outils, Port, COM4
8 Croquis, Téléverser
9 Affiche Téléversement....
Le compteur est relié au secteur par deux fois :
3xR220k, 10k masse, 10k au +5V aux bornes A0 A1
Le compteur est relié à un tore de courant par deux fois:
R100 en // et deux fois R10k, R10k masse, 10k au +5V A2 A3
Un bouton poussoir fugitive relié entre masse et 7
Afficheur LCD 1x16char en I2C 0x27
SDA:A4, SCL:A5
Le compteur affiche pendant 1S tension, intensite, sens, puissance
230V 12.3A >2838W
>1234W 123465kWh
et pendant 1s sens, puissance, énergie
>1234W 12346kWh
>0W 23456kWh
Plus tard, enregistrer dans les EEPROM les 2 énergies
une fois par heure (environ 10 ans)
et relire à la mise sous tension
Etat : compilation OK affiche
P:0.1W ->
+0.006 -0.000
Pas d'eeprom
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Configuration LCD I2C
LiquidCrystal_I2C lcd(0x27, 16, 2); //adresse, caracteres, lignes
// Broches d'entrée différentielles
#define VOLTAGE_PIN_P A0 // Tension phase
#define VOLTAGE_PIN_N A1 // Tension neutre
#define CURRENT_PIN_P A2 // Courant entrant
#define CURRENT_PIN_N A3 // Courant sortant
#define RESET_BUTTON 7
// Variables de calibration
float VCAL = 320.0; // À ajuster avec mesure réelle
float ICAL = 60.0; // Dépend du capteur utilisé
float PHASE_SHIFT = 0.0; // Décalage angulaire si nécessaire
// Variables énergétiques
float kWh_positive = 0;
float kWh_negative = 0;
float power = 0;
unsigned long lastTime;
void setup()
{
lcd.init();
lcd.backlight();
pinMode(RESET_BUTTON, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(RESET_BUTTON), resetEnergy, FALLING);
lastTime = millis();
}
void loop()
{
float voltage = readVoltage();
float current = readCurrent();
// Calcul de la puissance instantanée
power = voltage * current * cos(PHASE_SHIFT);
// Calcul énergie cumulative
unsigned long currentTime = millis();
float elapsedHours = (currentTime - lastTime) / 3600000.0;
if(power > 0)
{
kWh_positive += power * elapsedHours;
}
else
{
kWh_negative += abs(power) * elapsedHours;
}
lastTime = currentTime;
updateDisplay();
delay(200);
}
float readVoltage()
{
long sum = 0;
for(int i=0; i<100; i++)
{
int diff = analogRead(VOLTAGE_PIN_P) - analogRead(VOLTAGE_PIN_N);
sum += diff * diff;
}
float rms = sqrt(sum / 100) * (VCAL / 1023.0);
return rms;
}
float readCurrent()
{
long sum = 0;
for(int i=0; i<100; i++)
{
int diff = analogRead(CURRENT_PIN_P) - analogRead(CURRENT_PIN_N);
sum += diff * diff;
}
float rms = sqrt(sum / 100) * (ICAL / 1023.0);
return rms;
}
void updateDisplay()
{ //affiche P:0.1W ->
lcd.setCursor(0, 0);
lcd.print("P:");
lcd.print(power, 1);
lcd.print("W ");
lcd.print((power > 0) ? "->" : "<-");
//affiche +0.006 -0.000
lcd.setCursor(0, 1);
lcd.print("+");
lcd.print(kWh_positive, 3);
lcd.print(" -");
lcd.print(kWh_negative, 3);
}
void resetEnergy()
{
kWh_positive = 0;
kWh_negative = 0;
}
Dans un premier temps, nous avons essayé de monter tout ça dans un petit boitier... qui était joli mais vraiment trop petit... Nous avons donc tout réinstallé dans un boitier modifié d'un multimètre Owon XDM1041 HS : beaucoup plus de place et on y voit plus clair !
Le boitier entièrement monté, ouvert : (il manque quelques trous à boucher et les condensateurs de filtrage et de découplage) :
De bas en haut:
Le transfo, maintenu par un fil d'acier, primaire relié à l'embase secteur, secondaire avec un filtre R10k, C3.3uF relié par un fil jaune et un vert à l'Arduino via 2 R10k série pour la protection
Au-dessus, l'embase secteur petit modèle, reliée aussi avec 2 dominos au chargeur USB 5V (non modifié) avec un petit cordon USB C relié à l'Arduino
Au-dessus, le bouton poussoir Reset, l'afficheur LCD rétroéclairé 2x16 lignes fixé par 4 vis M3 collées,
La carte Arduino USB-C montée sur une plaque avec borniers (fixées par 2 vis M4 sur la plaque en aluminium bleu peinte en noir sur le côté opposé. Ces plaques borniers prennent un peu plus de place mais sont très pratiques.
Sur le côté, l'embase Jack 3.5 qui reçoit le capteur de courant
Sur la photo, la rallonge USB-C de programmation n'a pas encore été installée...
Le même boitier vu de face : il reste quelques trous à boucher !
On distingue l'afficheur LCD derrière la fenêtre et, au-dessus, une plaque en aluminium peinte en noir qui maintient la plaque bornier de l'Arduino, à droite le bouton poussoir rouge de remise à 0.
En-dessous, la face arrière avec la petite embase secteur. (et le fil de maintien du petit transfo).
Le coffret monté (toujours avec des trous à boucher) avec le capteur de courant et le cordon secteur :
Attention : Il est possible de brancher ce type de câble secteur dans les deux sens dans la prise !
Le compteur d'énergie est sensible à la phase : selon le sens dans lequel le câble à mesurer dans le tableau traverse le capteur de courant, il faut brancher la prise secteur (dans n'importe quelle prise) dans un sens ou dans l'autre. Il est ensuite recommandé d'y mettre une marque de peinture pour la brancher toujours dans le même sens, et éventuellement toujours dans la même prise, (sinon les affichages des énergies sont simplement permutés).
Nota : La mesure de la tension (élevée) ne pose pas de problème. La mesure du courant (dont la tension en sortie de capteur est faible) est plus délicate. Attention aux parasites et au filtrage.
Schéma électrique du compteur : il est simple :
Et enfin, le coffret terminé et étalonné (mais toujours avec des trous à boucher) et en situation...
Nota : la précision "élevée" affichée pour la tension, le courant, la puissance et les énergies servent surtout pour faciliter l'étalonnage...
En mode affichage tension, puissance, sens, intensité.
Les 3 flèches : >>> indiquent un courant entre 2 et 5A (0, 1, 2, 5 ,10)
Et en mode : Sens, énergie entrante et énergie sortante :
L'afficheur indique que l'énergie entre (soirée). Il est entré (depuis le Reset) 0.31 kWh (EDF) et il est sorti 1.67 kWh (panneaux solaires).
Et ici l'énergie sort : nous sommes en journée et il y a du soleil. <<< donc un courant compris entre 2 et 5A : (il faut attendre ~1s pour voir l'écran suivant et avoir la valeur exacte).
On pourrait encore améliorer le compteur en rajoutant une 2e voie :
Un 2e capteur de courant
Une 2e embase Jack et un affichage supplémentaire
On raccorderait alors le 2e capteur de courant sur le câble provenant de l'onduleur des panneaux solaires... (Dans ce cas-là, pas de problème de signe...). On pourrait ainsi rajouter l'énergie économisée en €... (0.20€/kWh)
That's All Folks !
Commencé le 13/06/2025
A jour au 03/07/2025