DataLogger Teleinfo EDF avec Arduino

Bonjour à tous,

Il y a qq mois je me suis intéressé au teleinfo disponible sur mes compteurs electroniques EDF.
J'ai réalisé une interface (trouvée sur le net) et connecté le tout a un PC.
Ca fonctionne bien mais l'inconvénient est de laisser un PC allumé en permanence.
D'ou l'idée d'un DataLogger autonome construit autour d'un micro controleur, module Arduino.
Je n'y connaissais rien en microcontroleur, mais ce module se maitrise assez vite...
Cette réalisation permet de décoder la trame teleinfo, enregistrer les données sur un fichier txt sur une carte SD et accessoirement les afficher à l'écran d'un PC via hyperterminal...
Le tout est prévu pour 2 compteurs : conso domestique et prod PV.

Si cela vous tente, tout est expliqué là : DL.FREE.FR

  • fonctionnement
  • schéma
  • code

Si vous avez des questions, utilisez le forum, je vous répondrais avec plaisir.

Bon amusement. :wink:

merci orion57 pour le partage de ton travail. Bon boulot.

Merci Gromain, un p'tit mot c'est toujours encourageant ;D

Je continue a travailler sur le sujet :

Aprés un test de plusieurs jours a enregistrer les données des 2 compteurs, je me suis apperçu que le fichier des datas du compteur PV est OK mais que les enregistrements du compteur domestique présentent 40% de données incohérentes !
Y-a un truc !! :o

Par ailleurs j'ai commandé un shield "bluetooth" et un autre "horloge" sur un site au Canada pour compléter l'ensemble ...
Si tout fonctionne comme je l'espère, il y aura une suite à l'histoire.

A+ :wink:

Bravo orion cette réalisation est trés bien expliquée.
Je me lance dans le montage.

Bonjour, je suis très interressé par le sujet, en revanche j'aimerais récupérer les téléinfo directement sur la porteuse présente sur le réseau le 220V.

Quelqu'un a t il des infos pour récupérer cette porteuse?

Merci @+

FLY

salut, alors récupérer la porteuse sur le réseau 220 me semble pas être une bonne idée.

Hormis le risque de se prendre un coup de bourre magistral, le soucis est que la porteuse n'est pas émis en continu, mais seulement à chaque changement d'état, c'est a dire 4 fois par jour si je ne m'abuse, en cas de coupure de courant il faut attendre la prochaine pour ce ré aligner. Il est préférable de prendre sur le port téléinfo, car il mémorise son état en permanence,et a 1 jours d'avance sur la programmation, en gros à 18h il connais déjà les prévisions du lendemain. Avec son système de sauvegarde, en cas de coupure, il repart directement comme si de rien était.

bon a mon tours,

AU SECOURS JE VAIS Y FOUTRE LE FEU A CET ENGIN

ça soulage.

bon plus sérieusement, bien qu'aillant écris y a bientôt un an les lignes qui permettre à l'arduino de passer de "1200 B/S avec 7 bit en pair avec le Stop à 1" à 1200 B/S avec les alignement arduino, ba maintenant plus rien pas moyen de le refaire.

Ayant abandonné le projet car quelque soucis de tampon mémoire, je mis remet de nouveau, et tous ce que j'ai fait ne marche plus du tout.

Voilà ou j'en suis

-du port téléinfo au convertisseur électronique ===OK
-du convertisseur électronique au un hypterminal===OK

j'obtient ça:

ISOUSC 45 ?
BBRHCJB 056694410 @
BBRHPJB 066976558 ^
BBRHCJW 001335059 L
BBRHPJW 002361117 T
BBRHCJR 000746887 U
BBRHPJR 001345418 T
PTEC HPJB P
DEMAIN ---- "
IINST 028 !
IMAX 038 J
PAPP 06200 )
HHPHC Y D
MOTDETAT 000000 B
ADCO 0203220831vpTA^IF BBR) T

-donc du convertisseur au arduino je suppose ===OK

je reçois bien des données mais pas en clair normal.

maintenant ce que je souhaiterai c'est faire ceci

convertisseur électronique=>entré dans arduino pin 3 et 4 en 1200 7 E 1=>arduino prg de travail => sortie arduino usb 9600 alignement arduino=>terminal arduino

dans l'arduino c'est l'anarchie je n'y arrive pas.

J'ai essayer toutes les variantes, la mienne, celle de orion et rien il me sort du n'importe quoi, pour le moment je ne lui demande que de me resortir ce qui rentre.

Si quelqu'un pouvait me tenir la main sinon je vai tirer une balle dans la tête à l'arduino.

merci d'avance

voici le code que j'utilise:

#include <NewSoftSerial.h>
NewSoftSerial mySerial(2, 3);


void setup() {
  // initialize both serial ports:

  UCSR0C = B00100100;
  
  mySerial.begin(1200);
  Serial.begin(1200);

}

void loop() {
  // read from port 1, send to port 0:
  if (mySerial.available()) {
    int inByte = mySerial.read();
    Serial.print(inByte, BYTE);
  }
}

et ça marche pas à l'aide

j'ai regardé le data sheet et je suis totalement largué.

je ne sais pas si j'ai le droit mais tant pis je tente.

un tit up

Ton exemple de test est plus que simple,
Essaye de mettre à jour l'IDE arduino 0021 et newSoftSerial 10c
http://arduiniana.org/libraries/newsoftserial/
Tu as peut être un problème de version.
Ta carte de fait rien d'autre pendant ce temps ( pas d'autres captures d'interruption ) ?

A+ Teiva


www.Zartronic.fr : Votre source Arduino en France

merci de Teiva du coup de main,

le logiciel arduino est bien le 21
le newsoft serial est à jours

pour la réponse à ta derniére question ,je ne l'ai pas comprise, tous ce que je peux te dire c'est que dans l'arduino il n'y a que le code que j'ai fournis ici.

Pas simple à deviner ce problème ... :wink:

a) ta ligne UCSR0C = B00100100;
ne sert à rien ça "tripote la vitesse de l'uart" et c'est écrasé par Serial.bebin(1200)

b) vérifie bien si tu n'as pas de problème électrique 5V/3V, pullup and co, le soft sérial est très sensible aux variations de la ligne de réception car ça déclenche l'interruption de réception, vérifie que tes fils sont court et ne gigote pas.

il te faut un peu de chance pour trouver ce bug, ne menace pas l'Arduino :smiley:

Bon courage, A+ Teiva


www.Zartronic.fr : Votre source Arduino en France

bon pour ce qui est de la réception je ne pense pas que la longueur actuel de ligne soit le probléme. Je dévellope:

Au bout de ma ligne je branche soit l'arduino soit un adaptateur serie/usb, et sur cette adaptateur je n'ai pas le moindre probléme.

Le truc c'est que j'ai essayer de faire émettre l'arduino sur la pin 3 ou 4 je sais plus en 1200 E 7 1 et je renvoie directement avec un bout de fil de 4cm au max à la pin 0, un signal transit bien mais pas comme je le voudrait.

alors je soulève plusieurs question:

-es ce que entre les pins 0 et 1 ont le même signal que sur le port USB??? actuellement pour moi c'est pas le cas.

  • je ne sais pas quelle type de signal sort de mon convertisseur TTL ou RS232 et je n'en connais pas la différence. tous ce que je sais c'est que sur un prot série brut le signal est ok à la sortie de mon convertisseur.

  • est t'il possible de basculer tous simplement tous les port en 1200 E 7 1, pour le processing ça ne me pause pas de prb.

  • Faut t'il que je reconvertisse mon signal en sortie de l'arduino.

Personne n'a idée d'ou viens mon prb?

bon vu que personne n'a pu pour le moment m'aider je me suis venger sur processing.

bon et voici la synthése connexion + filtre processing

c'est créer pour fonctionner en tempo mais les modifs sont simple à faire pour passer à un comptage classique ou EJP.

String PTEC="HPJW";
int IMAX;
int ISOUSC;
int BBRHCJB;
int BBRHCJW;
int BBRHCJR;
int BBRHPJB;
int BBRHPJW;
int BBRHPJR;
String DEMAIN="BLAN";
int IINST;
int PAPP;

void setup() 
 {
  myPort2 = new Serial(this, "COM5", 1200,'E',7,1);      //Sélection du port ainsi que de sa vitesse
  }

void draw()
{
String xString2 = myPort2.readStringUntil('\n');  // lecture série jusqu'au saut de ligne
    if (xString2 != null)  // si la chaîne n'est pas vide 
    {
      
      xString2 = trim(xString2);  // on vire les éventuels espace devant et derrière au cas où...

      int in = xString2.indexOf("PTEC");
      if (in==0)
      {PTEC=xString2.substring(in+5,in+9);}
      
      in = xString2.indexOf("DEMAIN");
      if (in==0)
      {DEMAIN=xString2.substring(in+7,in+11);}
      
      in = xString2.indexOf("ISOUSC");
      if (in==0)
      {ISOUSC=int(xString2.substring(in+7,in+9));}
      
      in = xString2.indexOf("IINST");
      if (in==0)
      {IINST=int(xString2.substring(in+6,in+9));}
      
      in = xString2.indexOf("PAPP");
      if (in==0)
      {PAPP=int(xString2.substring(in+5,in+9));}
      
      in = xString2.indexOf("BBRHCJB");
      if (in==0)
      {BBRHCJB=int(xString2.substring(in+8,in+17));}
      
      in = xString2.indexOf("BBRHCJW");
      if (in==0)
      {BBRHCJW=int(xString2.substring(in+8,in+17));}
      
       in = xString2.indexOf("BBRHCJR");
      if (in==0)
      {BBRHCJR=int(xString2.substring(in+8,in+17));}
      
      in = xString2.indexOf("BBRHPJB");
      if (in==0)
      { BBRHPJB=int(xString2.substring(in+8,in+17));}
      
      in = xString2.indexOf("BBRHPJW");
      if (in==0)
      {BBRHPJW=int(xString2.substring(in+8,in+17));}
      
       in = xString2.indexOf("BBRHPJR");
      if (in==0)
      {BBRHPJR=int(xString2.substring(in+8,in+17));}
      
      in = xString2.indexOf("IMAX");
      if (in==0)
      {IMAX=int(xString2.substring(in+5,in+8));}
    }
}

c'est pas ce qu y a de mieux et de plus rapide, mais ça fonctionne très bien

Hello

Essaye ce code, en retirant la partie upload de données sur un site (sauf si ça t'interesse)

Tu remarqueras qu'il convertie les données recues avant affichage ( via les fonctions atol, atoi ou strncpy quivant les cas )

En regardant sur ta doc , j'ai trouvé le réglage de la trame : raccorder le PC à la DB 9 en 1200, 7, E, 1

Ce qui explique que dans le code de erlik on a un Serial.read() & 0x7F pour corriger le char reçu.
le bug : La parité se met dans le 8eme bit ...
Sinon il y a peut être un moyen de définir 7E1 sans SoftSerial à voir.

A+ Teiva


www.Zartronic.fr : Votre source Arduino en France, en Promo

peut-on envisager d'utiliser le montage d'orion57 pour en plus afficher la conso:production temps reel ?

Oui sans prb mais la précision n est pas génial. Tu peux avoir l intensité instantanée, la puissance instantanée, les compteurs...
Pour Teva le prg marche très bien le soucis était le suivant, la puissance de sortie de l arduino est trop faible pour alimenter un port série faut passer par du max232.
Pendant que j y suis y aurait un tuto en fr pour pachube?

Merci d' avance