Sortie impulsions compteur d'énergie

Bonjour à tous!

Est-ce que par hazard l'un d'entre vous aurait déja travaillé avec la sortie impulsions d'un compteur d'énergie, afin de faire interpreter les résultats par l'arduino?

Merci!!
Cordialement!!
FLCA

flca:
Bonjour à tous!

Est-ce que par hazard l'un d'entre vous aurait déja travaillé avec la sortie impulsions d'un compteur d'énergie, afin de faire interpreter les résultats par l'arduino?

Merci!!
Cordialement!!
FLCA

bonsoir
question simple
c'est quoi "ton" compteur d'energie ? :grin:

Bonjour,
Un compteur d'energie au format pour être integré dans un tableau électrique domestique.
Sa sortie impulsion est un optocoupleur qui fait une impulsion de 85ms tous les 1Wh
Voilà!
FLCA

flca:
Bonjour,
Un compteur d'energie au format pour être integré dans un tableau électrique domestique.
Sa sortie impulsion est un optocoupleur qui fait une impulsion de 85ms tous les 1Wh
Voilà!
FLCA

C'est une sortie en collecteur ouvert ou l'impulsion de sortie est déjà calibrée en V ?
si oui quelle valeur de V ?

Bonjour,

Je ne l’ai pas encore entre les mains, mais normalement en collecteur ouvert.
Aprés je suis plus inquiet pour la partie programme étant débutant.
Pour le circuit je pense qu’il me suffit de mettre une résistance de tirage au +5V
Merci
Cordialement
FLCA

flca:
Bonjour,

Je ne l'ai pas encore entre les mains, mais normalement en collecteur ouvert.
Aprés je suis plus inquiet pour la partie programme étant débutant.
Pour le circuit je pense qu'il me suffit de mettre une résistance de tirage au +5V
Merci
Cordialement
FLCA

Alors en attendant de le recevoir
debute par un programme simple et reduit ça a un probleme simple :
ce n'est pas fondamentalement different que d'avoir un compteur incrementé de une unité pour un appui sur un bouton poussoir.
c'est assez trivial meme si tu es debutant et tu trouveras des bonnes bases pour comprendre dans les exemples
debute par l'exemple --->digital---->button et ajoute un compteur 8)
et tu reviens ici lorsque tu aura reçu ton module

Salut !
J'utilise les impulsions des mes compteurs edf, mais en captant le flash de la Led avec des phototransistors (compteurs électroniques) ... Comme mon arduino mega doit faire d'autres choses, j'utilise les interruptions pour ne pas rater d'impulsions
Pour le reste une impulsion c'est 1 Wh ... En faisant la somme sur une journée, tu as la conso du jour
Et en mesurant le temps entre deux impulsions, tu as la puissance instantanée ( 1 impuls = 1Wh = 3600 joules, donc 1 impuls / seconde = 3600 W ... 1 impuls / 2 sec= 1800 W ... Etc)

Salut!
C'est presque ce que je souhaite faire, mais en passant par les deux bornes prévues.
Par hazard, tu n'aurais pas ton programme afin d'avoir une base pour commencer?
Apres je souhaiterais relier mon lcd (ça pas de soucis), mon ds1307 (pour l'instant je sais lire l'heure mais pas la regler!) et une sonde ctn (ça normalement pas de soucis!).

Cordialement,
Flca

Voici l’extrait utile du code … A adapter a ta sauce … Mais le principe est la !

int heure; // format perso des heures (800 = 8h00 … 2359 = 23h59) … Ne me demandez pas pourquoi !

//gestion compteur EDF
volatile unsigned long t ; // date de l’impulsion en milliseconde
volatile unsigned long lastmilli ; // date de l’impulsion précédente
volatile int EDF1 = 0; //puissance instantanée en W
unsigned int cptEDFHC; // total conso heures creuses en Wh (Max 64000 Wh)
unsigned int cptEDFHP; // total conso heures pleines en Wh

void setup() {
attachInterrupt(4,pulseEDF1,FALLING); // A voir avec les autres cartes pour la broche utilisée et son n° d’interruption
}

void loop() {
}

void pulseEDF1() {
t = millis();
long int dt = t - lastmilli;
if (dt < 0) lastmilli = t; // peut arriver au bout de 50 jours
else if (dt > 400 ) { // max 9kW pour filtrer les éventuelles fausses impulsions
lastmilli = t;
EDF1 = 3600000/dt;
//total Wh quotidien
if (heure < 700 || heure > 2300) cptEDFHC++;
else cptEDFHP++;
}
}

Bonjour,
Voila j’ai reçu mon compteur. il est opérationnel et j’ai fait un montage relié aux bornes de l’optocoupleur interne.
Voila la photo avec les caractéristiques techniques .
J’ai fait un petit programme m’affichant l’heure, la conso total, mais je n’arrive pas à trouver le calcul idéal pour la puissance instantannée.
Donc si vous avez un petit peu de temps pour m’aider ça m’arrangerait.

Merci à tous
Flca

Pour la partie concernant le ds1307 J’ai un peu copié lol!

//
// Maurice Ribble
// 4-17-2008
// http://www.glacialwanderer.com/hobbyrobotics

// This code tests the DS1307 Real Time clock on the Arduino board.
// The ds1307 works in binary coded decimal or BCD. You can look up
// bcd in google if you aren’t familior with it. There can output
// a square wave, but I don’t expose that in this code. See the
// ds1307 for it’s full capabilities.

#include “Wire.h”
#define DS1307_I2C_ADDRESS 0x68
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x20, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address

// variables pour calcul edf

long actms=0;
long lastms=0;
long diff=0;
long compt=0;

// fin de variables pour calcul edf
// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
return ( (val/10*16) + (val%10) );
}

// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
return ( (val/16*10) + (val%16) );
}

// Stops the DS1307, but it has the side effect of setting seconds to 0
// Probably only want to use this for testing
/void stopDs1307()
{
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.send(0);
Wire.send(0x80);
Wire.endTransmission();
}
/

// 1) Sets the date and time on the ds1307
// 2) Starts the clock
// 3) Sets hour mode to 24 hour clock
// Assumes you’re passing in valid numbers

void myInterrupt()
{
actms=millis();
diff=actms-lastms;
compt=compt+1;
lastms=actms;

}

void setDateDs1307(byte second, // 0-59
byte minute, // 0-59
byte hour, // 1-23
byte dayOfWeek, // 1-7
byte dayOfMonth, // 1-28/29/30/31
byte month, // 1-12
byte year) // 0-99
{
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.write(decToBcd(second)); // 0 to bit 7 starts the clock
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour)); // If you want 12 hour am/pm you need to set
// bit 6 (also need to change readDateDs1307)
Wire.write(decToBcd(dayOfWeek));
Wire.write(decToBcd(dayOfMonth));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));
Wire.endTransmission();

}

// Gets the date and time from the ds1307
void getDateDs1307(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
// Reset the register pointer
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.endTransmission();

Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

// A few of these need masks because certain bits are control bits
*second = bcdToDec(Wire.read() & 0x7f);
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read() & 0x3f); // Need to change this if 12 hour am/pm
*dayOfWeek = bcdToDec(Wire.read());
*dayOfMonth = bcdToDec(Wire.read());
*month = bcdToDec(Wire.read());
*year = bcdToDec(Wire.read());
}

void setup()
{
attachInterrupt(0, myInterrupt, RISING );

lcd.begin(20,4);
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
Wire.begin();
Serial.begin(9600);

// Change these values to what you want to set your clock to.
// You probably only want to set your clock once and then remove
// the setDateDs1307 call.
second = 00;
minute = 15;
hour = 19;
dayOfWeek = 2;
dayOfMonth = 10;
month = 12;
year = 13;
//////
//a décommenter pour mettre à l’heure
//setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
// fin de à décommenter pour mettre à l’heure
}

void loop()
{
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;

getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(hour, DEC);
lcd.setCursor(2,0);
lcd.print(":");
if (minute <10 ) {
lcd.setCursor(3,0);
lcd.print(“0”);
lcd.print(minute,DEC);
}
if (minute >=10) {
lcd.setCursor(3,0);
lcd.print(minute,DEC);
}

lcd.setCursor(5,0);
lcd.print(":");
if (second <10 ) {
lcd.setCursor(6,0);
lcd.print(“0”);
lcd.print(second,DEC);
}
if (second >=10) {
lcd.setCursor(6,0);
lcd.print(second,DEC);
}

lcd.setCursor(15,0);
lcd.print(month, DEC);
lcd.setCursor(14,0);
lcd.print("/");
lcd.setCursor(12,0);
lcd.print(dayOfMonth, DEC);
lcd.setCursor(17,0);
lcd.print("/");
lcd.setCursor(18,0);
lcd.print(year, DEC);
lcd.setCursor(10,0);
switch (dayOfWeek) { // debut de la structure
case 1: // cas 1
lcd.print(“Lu”);
//faire quelque chose quand la variable est égale à 1 (càd sir var == 1)
break;
case 2: // cas 1
lcd.print(“Ma”);
//faire quelque chose quand la variable est égale à 1 (càd sir var == 1)
break;
case 3: // cas 1
lcd.print(“Me”);
//faire quelque chose quand la variable est égale à 1 (càd sir var == 1)
break;
case 4: // cas 1
lcd.print(“Je”);
//faire quelque chose quand la variable est égale à 1 (càd sir var == 1)
break;
case 5: // cas 1
lcd.print(“Ve”);
//faire quelque chose quand la variable est égale à 1 (càd sir var == 1)
break;
case 6: // cas 1
lcd.print(“Sa”);
//faire quelque chose quand la variable est égale à 1 (càd sir var == 1)
break;
case 7: // cas 1
lcd.print(“Di”);
//faire quelque chose quand la variable est égale à 1 (càd sir var == 1)
break;}
lcd.setCursor(0,3);
actms=millis();
lcd.print(actms);
lcd.setCursor(0,2);
lcd.print(“diff=”);
lcd.setCursor(5,2);
lcd.print(diff);
lcd.setCursor(0,3);
lcd.print(“compt=”);
lcd.setCursor(6,3);
lcd.print(compt*0.01);
lcd.setCursor(16,3);
lcd.print(“Kwh”);

delay(1000);

}

Je lis sur ta photo 100 imp/kWh ...

Dans ton cas 1 impulsion représente donc une conso de 0,01 Wh soit 36 J (joules) depuis l'impulsion précédente

rappel La puissance est un rapport entre une énergie (en joule) et le temps (en seconde)
Soit 1W = 1 J/s et 1W 'consommé' pendant 1 heure = 1 Wh = 3600 s x 1 J/s = 3600 J

Dans ton cas tu dois donc faire le calcul suivant: P = 36 x 1000 / diff avec diff la différence en millisecondes que tu calcules lors de l'interruption.

NB: dans ton loop tu réinitialises actms et tu l'affiches ... Certes ça ne change rien à ton calcul de diff ... Mais quand 20 jours se seront écoulés je te laisse deviner la valeur de actms ! (20 x 24 x 3600)

Merci!!, autre probléme, ma puissance actuelle est toujours négative!! une énigme pour vous cher amis!

//
// Maurice Ribble
// 4-17-2008
// http://www.glacialwanderer.com/hobbyrobotics

// This code tests the DS1307 Real Time clock on the Arduino board.
// The ds1307 works in binary coded decimal or BCD. You can look up
// bcd in google if you aren’t familior with it. There can output
// a square wave, but I don’t expose that in this code. See the
// ds1307 for it’s full capabilities.

#include “Wire.h”
#define DS1307_I2C_ADDRESS 0x68
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x20, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address

// variables pour calcul edf

long actms=0;
long lastms=0;
long diff=0;
long compt=0;
long P=0;
long dif=0;

// fin de variables pour calcul edf
// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
return ( (val/10*16) + (val%10) );
}

// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
return ( (val/16*10) + (val%16) );
}

// Stops the DS1307, but it has the side effect of setting seconds to 0
// Probably only want to use this for testing
/void stopDs1307()
{
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.send(0);
Wire.send(0x80);
Wire.endTransmission();
}
/

// 1) Sets the date and time on the ds1307
// 2) Starts the clock
// 3) Sets hour mode to 24 hour clock
// Assumes you’re passing in valid numbers

void myInterrupt()
{
actms=millis();
dif=actms-lastms;
diff=dif/1000;
compt=compt+1;
lastms=actms;

P=36*1000/diff;

}

void setDateDs1307(byte second, // 0-59
byte minute, // 0-59
byte hour, // 1-23
byte dayOfWeek, // 1-7
byte dayOfMonth, // 1-28/29/30/31
byte month, // 1-12
byte year) // 0-99
{
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.write(decToBcd(second)); // 0 to bit 7 starts the clock
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour)); // If you want 12 hour am/pm you need to set
// bit 6 (also need to change readDateDs1307)
Wire.write(decToBcd(dayOfWeek));
Wire.write(decToBcd(dayOfMonth));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));
Wire.endTransmission();

}

// Gets the date and time from the ds1307
void getDateDs1307(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
// Reset the register pointer
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.endTransmission();

Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

// A few of these need masks because certain bits are control bits
*second = bcdToDec(Wire.read() & 0x7f);
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read() & 0x3f); // Need to change this if 12 hour am/pm
*dayOfWeek = bcdToDec(Wire.read());
*dayOfMonth = bcdToDec(Wire.read());
*month = bcdToDec(Wire.read());
*year = bcdToDec(Wire.read());
}

void setup()
{
attachInterrupt(0, myInterrupt, RISING );

lcd.begin(20,4);
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
Wire.begin();
Serial.begin(9600);

// Change these values to what you want to set your clock to.
// You probably only want to set your clock once and then remove
// the setDateDs1307 call.
second = 00;
minute = 15;
hour = 19;
dayOfWeek = 2;
dayOfMonth = 10;
month = 12;
year = 13;
//////
//a décommenter pour mettre à l’heure
//setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
// fin de à décommenter pour mettre à l’heure
}

void loop()
{
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;

getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(hour, DEC);
lcd.setCursor(2,0);
lcd.print(":");
if (minute <10 ) {
lcd.setCursor(3,0);
lcd.print(“0”);
lcd.print(minute,DEC);
}
if (minute >=10) {
lcd.setCursor(3,0);
lcd.print(minute,DEC);
}

lcd.setCursor(5,0);
lcd.print(":");
if (second <10 ) {
lcd.setCursor(6,0);
lcd.print(“0”);
lcd.print(second,DEC);
}
if (second >=10) {
lcd.setCursor(6,0);
lcd.print(second,DEC);
}

lcd.setCursor(15,0);
lcd.print(month, DEC);
lcd.setCursor(14,0);
lcd.print("/");
lcd.setCursor(12,0);
lcd.print(dayOfMonth, DEC);
lcd.setCursor(17,0);
lcd.print("/");
lcd.setCursor(18,0);
lcd.print(year, DEC);
lcd.setCursor(10,0);
switch (dayOfWeek) { // debut de la structure
case 1: // cas 1
lcd.print(“Lu”);
//faire quelque chose quand la variable est égale à 1 (càd sir var == 1)
break;
case 2: // cas 1
lcd.print(“Ma”);
//faire quelque chose quand la variable est égale à 1 (càd sir var == 1)
break;
case 3: // cas 1
lcd.print(“Me”);
//faire quelque chose quand la variable est égale à 1 (càd sir var == 1)
break;
case 4: // cas 1
lcd.print(“Je”);
//faire quelque chose quand la variable est égale à 1 (càd sir var == 1)
break;
case 5: // cas 1
lcd.print(“Ve”);
//faire quelque chose quand la variable est égale à 1 (càd sir var == 1)
break;
case 6: // cas 1
lcd.print(“Sa”);
//faire quelque chose quand la variable est égale à 1 (càd sir var == 1)
break;
case 7: // cas 1
lcd.print(“Di”);
//faire quelque chose quand la variable est égale à 1 (càd sir var == 1)
break;}
lcd.setCursor(0,3);
actms=millis();
lcd.print(actms);
lcd.setCursor(0,2);
lcd.print(“actuelle=”);
lcd.setCursor(9,2);
lcd.print(P);
lcd.setCursor(0,3);
lcd.print(“compt=”);
lcd.setCursor(6,3);
lcd.print(compt*0.01);
lcd.setCursor(16,3);
lcd.print(“Kwh”);

delay(1000);

}

Quand tu récupères les temps en millis() tu dois le faire dans unsigned long ( tu mets des long)
Dans ton calcule de P tu utilises 2 fois le facteur 1000 .. Dans ce que j'ai écrit plus haut diff est en ms ... Pas besoins de le diviser par 1000 avant de l'utiliser dans ta formule

Merci de placer le code entre balise pour faciliter la lecture (Bouton # dans la barre au dessus de la fenêtre d'édition)

Désolé je ne connaissais pas, à chaque fois j’essayais de copier en faisant “copier pour le forum” mais du coup le message devenait trop long.

-Pour P, à chaque fois j’ai des valeurs tellement grandes qu’elles ne peuvent pas être réélles mais je ne trouve pas d’où vient le probléme.
-Mon deuxiéme probléme est généré par le telerupteur que j’ai dans le même tableau que le compteur d’energie, à chaque fois que je l’actionne il me parasite à fond le truc et me compte des impulsions, comment faire ? :frowning:

Merci pour votre aide précieuse
Cordialement,
FLCA

La formule du calcul de P est P = 36 * 1000 / diff et diff est en ms … fait un calcul et tu verras les ordres de grandeur de P en fonction de la valeur de diff

Si tu as des parasites (mais pas trop), tu peux mettre une condition sur une valeur minimale de diff, par exemple si diff > 10ms, c’est suffisamment long pour ne pas être un parasite et tu peux l’utiliser pour tes calculs. Sinon tu ne fais rien.

par contre avec 1 impuls / 0,01 Wh, une résolution de 1 ms pour diff te donne une précision faible sur la puissance quand elle est élevée ( si diff = 5 : P = 7200W, si diff = 4 : P = 9000 W : tu n’auras pas de valeurs intermédiaires)
tu peux soit :

  • utiliser des microsecondes, actms = micros(); et P = 36 * 1000 * 1000 / diff
  • soit comptabiliser un certain nombre d’impulsions avant d’effectuer le calcul de P (mais P ne sera plus vraiment instantanée)
unsigned long actms, lastms;
unsigned int diff;

//ta fonction actuelle
void myInterrupt()
{
  actms=millis();
  diff=actms-lastms; 
  if {diff > 10} { //diff > 10ms correspond à P < 3600 W ... à voir si ca te convient
    //le temps entre 2 impuls est assez long, ce n'est pas un parasite
    compt++;
    lastms=actms;
    P= 36000 / diff;
   }

//la même plus précise avec des microsecondes
void myInterrupt()
{
  actms=micros();
  diff=actms-lastms; 
  if {diff > 10000 } { //diff > 10000micros = 10 ms correspond à P < 3600 W ... à voir si ca te convient
    //le temps entre 2 impuls est assez long, ce n'est pas un parasite
    compt++;
    lastms=actms;
    P= 36000000 / diff;
   }
}

Merci pour tes nombreuses réponses!!!

Je vais essayer avec ta solution (j'avais essayé en rajoutant un condensateur 1uF et mit un cable blindé, sans succés)

A+
Flca

Je viens de faire l'essai donc niveau parasites c'est mieux ça ne m'incrémente que d'un à chaque appui sur le poussoir du télérupteur, par contre P est toujours bizard, avec juste l'éclairage j'ai 225 par exemple puis je mets le séche cheveux j'ai plus que 2.

:s

Cordialement,
Flca

Juste pour illustrer : ça donne ça!