Mesurer une consommation électrique

Bonjour
Je dispose d'un compteur DIRIS A10 [https://www.socomec.com/files/live/sites/systemsite/files/SCP/6_gestion_energie/diris/DIRIS%20cULus/DIRIS_A10_UL_538847a.pdf]
Il s'agit d'un compteur de consommation qui envoie un pulse à chaque 10 watts consommés.
A ce compteur est connecté un datalogger qui compte les pulses et que l'on peut interroger via le réseau. Ce datalogger étant en panne je souhaiterais le remplacer par un Arduino Mega.

Quand je mesure la tension aux bornes 4 et 6 du compteur de consommation je m'attendais à mesurer une tension qui apparaît au moment de la transmission du pulse. Mais il n'y a rien et pas de contact non plus.

Par contre aux bornes du datalogger il y a du 24V en continu. Je ne comprends pas le fonctionnement et ma question :

Quel montage réaliser sur l'Arduino pour détecter ces pulses ?
Merci pour votre temps

Salut.
Dans la doc il est précisé :

CHARACTERISTICS OF THE PULSE OUTPUT /
CARACTERISTIQUES DE LA SORTIE
According to IEC 62053-31 Class A and Class B
Maximum voltage 30VDC, maximum current 27mA
Open collector output / Load resistor : 1kOhms

As-tu mis en place cette résistance de pullup ?

Bonjour, merci pour ta réponse.
Un montage similaire à celui d'un bouton poussoir devrait donc fonctionner ?
SWITCH2
Merci

??? on ne consomme pas des Watts !
Tu veux sans doute dire W.h ?

J'ai dit PULLUP, et non pas PULLDOWN !

Bonjour,
Le montage avec une résistance Pullup ne donne pas de résultat.

#include <SoftwareSerial.h>
int bs1 = 0; 
int cp1 = 0; 
unsigned long t1;    
const int pbt1 = 6;  

void setup()
{ pinMode(pbt1,INPUT); 
  Serial.begin(9600); 
  t1 = millis();
}

void loop()
{  
    bs1 = digitalRead(pbt1); 
    if ((bs1 == LOW) and ((millis() - t1) > 1000)) 
    { t1 = millis();
      cp1 = cp1 + 1;
      Serial.println(cp1);
    } 
} 


Merci

![SWITCH3|529x445](upload://hEgGnFcZrIZfvU5PaAyq5odAt3L.jpeg)

hello

Le compteur gazpar à le même et l'impulsion est de 300ms.
Attention à la longueur du câble. Pour le gazpar c'est maximum 3m entre le contact impulsion et le récepteur (Arduino, esp32..)

Je te conseille donc de lire la doc s'il y a des caractéristiques à prendre en compte)

Bonjour, merci pour la suggestion.

pinMode(pbt1,INPUT_PULLUP)

Mais que faut-il faire au niveau du montage ?
Pin 6 Arduino > Compteur à impulsions
Compteur à impulsions > retourne à GRD
Ou faut-il quand même une résistance quelque part ?
Vous l'aurez compris mes connaissances en électronique sont très limitées. Donc désolé si les questions sont basiques. Merci

Hello
Ton compteur: envoie un pulse de 300ms lorsqu'il a vu passer 10 Wh . Si ta consommation est faible et régulière, nous allons imaginer que le pulse de 10Wh se produit toutes les 5 mn.
Ton montage: possède des résistances internes qui te permettent d'en programmer une en Pullup. C'est ce que tu fais avec l'instruction :
PinMode (6,INPUT_PULLUP).
Le GND de ton montage doit " entrer" dans ton compteur de Wh et en ressort sous forme d'impulsion pour aller sur l'entrée 6 du montage.
Ton programme: il est mal fait car tu lis l'entrée D6 très fugitivement une fois par seconde.

Pour résumer, tu lis une fois par seconde pour saisir un pulse qui ne dure que 300ms et qui ne se produit qu'une fois toutes les 5 mn ( pour reprendre l'exemple de consommation faible et régulière).

Pour être sûr de voir un pulse lorsqu'il y en a un qui se présente, il faut lire D6 toutes les 250 ms.

Et pour tester ton montage, tu dois faire des pulses de 300ms espacés d'une ou deux secondes.

Hello un grand merci pour cette explication qui m'a permis de mieux comprendre.
Et effectivement le code est incohérent dans ce cas.
Je teste rapidement.

Bonsoir dakota99

Pour éviter de te prendre la tête avec des temps d'interrogation du signal de ton compteur, tu le connectes sur la pin 2 ou la 3 et tu travail en interruption.
Ainsi tu n'a pas besoin de t'inquiéter est ce que l'impulsion est la, c'est l'impulsion qui te dit, je suis là.

Cordialement
jpbbricole

Bonjour, merci pour vos suggestions.
J'ai fait différents essais notamment en utilisant des interruptions.
Toujours pas de pulse.
Je vais tester avec un datalogger du commerce pour m'assurer qu'il reçoit bien les pulses du compteur de consommation.

Ci-dessous le code utilisé :
J'ai ajouté un écran lcd pour afficher les pulses.
Montage : pin 2 Arduino va vers compteur - retour compteur vers GRD Arduino.

#include <SoftwareSerial.h>
int bs1 = 0; 
unsigned long t1;    
// ====== Encoders ====================================
#define  ECLFT 2       
unsigned int erg = 0;  
// ============= Affichage 7seg
const int softwareTx = 6;
const int softwareRx = 12;
SoftwareSerial s7s(softwareRx, softwareTx);
char tempString[10];  
const int pbuz = 5;  // buzzer

void setup()
{ 
  //==== Pour écran lcd ============================
  s7s.begin(9600);
  s7s.write(0x76);  // Clear display command
  delay(500);
  s7s.write(0x7A);  // Set brightness command byte
  s7s.write(127);   // brightness data byte
  s7s.print("STA"); // Displays -HI- on all digits
  
  // ======= Encoder =====================================
  attachInterrupt(digitalPinToInterrupt(ECLFT), interrupt1, RISING);
  pinMode(pbuz,OUTPUT);  // buzzer
  Serial.begin(9600); 
  digitalWrite(pbuz, HIGH);
  delay(250);
  digitalWrite(pbuz,LOW);
  delay(50);
  t1 = millis();
}

void loop()
{  
    if ((millis() - t1) > 1000) 
    { t1 = millis();
      Serial.println(erg);
      // ============ Affichage 7seg
      s7s.write(0x76);     // Clear display command
      sprintf(tempString, "%4d", erg);
      s7s.print(tempString);
    } 
} 

void interrupt1()
   {erg += 1;
   }

void setDecimals(byte decimals)
{
  s7s.write(0x77);
  s7s.write(decimals);
}

Bonjour

L'usage de l'interruption simplifie le code, une contingence est de déclarer les variables traitées dans l'interruption et utilisées ailleurs, volatile, ainsi:
volatile unsigned int erg = 0;

Cordialement
jpbbricole

Bonjour
Merci pour votre suggestion.
J'ai modifié le code comme proposé. Mais aucun pulse n'est capté de ce module Diris A10
Ci-dessous le montage actuel. Le problème semble venir de ce montage.
Le "open output collector" côté DIRIS A10 n'est pas activé et ne renvoie rien.
Quand on mesure au multimètre la tension aux bornes P04 et P05 celle-ci vaut 0.83v et ne varie pas quand il y a un pulse.

#include <SoftwareSerial.h>
int bs1 = 0; 
int cp1 = 0; 
unsigned long t1;    
const int pbt1 = 8;  // Diris A10
const int pbuz = 5;  // buzzer

// ============= Affichage 7seg
const int softwareTx = 6;
const int softwareRx = 12;
SoftwareSerial s7s(softwareRx, softwareTx);
char tempString[10];  

void setup()
{ 
  //==== Pour écran lcd ============================
  s7s.begin(9600);
  s7s.write(0x76);  // Clear display command
  delay(500);
  
  pinMode(pbt1,INPUT);   // Diris A10
  pinMode(pbuz,OUTPUT);  // buzzer
  Serial.begin(9600); 
  digitalWrite(pbuz, HIGH);
  delay(50);
  digitalWrite(pbuz,LOW);
  t1 = millis();
}

void loop()
{  
    bs1 = digitalRead(pbt1); 
    if ((bs1 == LOW) and ((millis() - t1) > 150)) 
    { t1 = millis();
      cp1 = cp1 + 1;
      Serial.println(cp1);
      digitalWrite(pbuz, HIGH);
      delay(50);
      digitalWrite(pbuz,LOW);

      // ============ Affichage 7seg
      s7s.write(0x76);     // Clear display command
      sprintf(tempString, "%4d", cp1);
      s7s.print(tempString);
    } 
} 

void setDecimals(byte decimals)
{
  s7s.write(0x77);
  s7s.write(decimals);
}

Bonjour dakota99

Ton montage me semble "rudement" compliqué, il y a un sujet similaire sur ce forum, si ça peut t'aider. Le câblage est un peu plus simple, typique d'un collecteur ouvert.

Cordialement
jpbbricole

hello
547 => NPN et 557 => PNP
le brochage que tu donnes correspond au 557

mais:
je pense que tu n'as pas besoin de cet intermédiaire
le transistor en collecteur ouvert doit probablement être en interne du Diris.
donc, tu raccordes GND arduino à la borne moins du Diris, qui (GND) doit être reliée en interne à l'émetteur du transistor et tu raccordes la sortie du Diris à l'entrée D2 de la platine arduino.
D2 est déclarée en PULLUP dans le prg, donc pas de résistance extérieure.

et c'est tout
une fois que tu as raccordé les deux platines, tu mesureras 5V entre GND et D2
les pulses attendus passeront la sortie de Diris à GND pendant 300ms.
tu mesureras 0V pendant ces 300ms
voici ton prg revu pour les interruptions
pour le tester, tu peux avant de le raccorder au Diris, faire des contacts fugitifs entre GND et D2
tu verras l'affichage évoluer sur le moniteur, lequel doit être réglé sur 115200 bauds

#include <SoftwareSerial.h>
int cp1 = 0;
const int pbt1 = 2;  // Diris A10
const int pbuz = 5;  // buzzer

// ============= Affichage 7seg
const int softwareTx = 6;
const int softwareRx = 12;
SoftwareSerial s7s(softwareRx, softwareTx);
char tempString[10];

unsigned long anti_rebonds = millis();
unsigned long temps_anti_rebonds = 500;
volatile byte pulse = 0;
void isr_pulse() {
  if ((millis() - anti_rebonds) > temps_anti_rebonds) {
    pulse++;
    anti_rebonds = millis();
  }
}

void setup() {
  //==== Pour écran lcd ============================
  s7s.begin(9600);
  s7s.write(0x76);  // Clear display command
  delay(500);
  pinMode(pbt1, INPUT_PULLUP);  // D2  pour Diris A10
  pinMode(pbuz, OUTPUT);        // buzzer
  Serial.begin(115200);
  digitalWrite(pbuz, HIGH);
  delay(50);
  digitalWrite(pbuz, LOW);
  attachInterrupt(0, isr_pulse, FALLING);
}

void loop() {
  if (pulse >= 1) {
    pulse = 0;
    cp1 = cp1 + 1;
    Serial.println(cp1);
    digitalWrite(pbuz, HIGH);
    delay(50);
    digitalWrite(pbuz, LOW);

    // ============ Affichage 7seg
    s7s.write(0x76);  // Clear display command
    sprintf(tempString, "%4d", cp1);
    s7s.print(tempString);
  }
}
/*
void setDecimals(byte decimals)
{
  s7s.write(0x77);
  s7s.write(decimals);
}
*/

Merci pour le lien. Merci pour vos commentaires et merci d'avoir pris le temps de corriger le code.
J'avais commencé par un montage très simple similaire qui ne fonctionnait pas.
J'ai refait ce montage proposé et utilisé le code modifié.

Quand je fais un pontage entre les 2 bornes qui vont au DIRIS le compteur s'incrémente et le buzzer s'active.

Mais quand le montage est connecté au DIRIS, en moyenne, sur 50 pulses il y en a 1 qui est capté par l'Arduino.
Je pensais qu'à chaque fois que la led du DIRIS s'allume, un pulse arrive sur les bornes. Mais apparemment ce n'est pas le cas. Ce serait un pulse tous les 100 wh. Il se pourrait donc que cela fonctionne :slight_smile:
Donc je vais le laisser tourner toute la nuit et comparer le matin avec l'index du compteur général de l'installation.
Encore merci.

Bonjour
Le code ci-dessus fonctionne.
Avec le simple montage proposé.
C'est un pulse tous les 100wh.
Encore merci pour vos conseils

Cool