Arduino UNO - Téléinfo et optocoupleur SFH620A

Bonjour à tous,

Etant donné que c'est mon premier post sur ce forum, je me permet de me présenter brièvement :wink:
Je suis un nouveau possesseur d'arduino uno, débutant en électronique, j'ai plutôt des connaissances en informatique.
Je me suis intéressé à l'arduino pour le domaine de la domotique.

J'ai donc décidé de commencer par essayer de récupérer la télé-information de mon compteur EDF.

Une recherche sur internet, m'a amené sur ce schéma qui me paraissait simple : aide pour teleinfo et 1 wire - Page 4 - ChaleurTerre

à partir de ce schéma , j'ai fait le montage suivant :

Et avant d'aller plus loin, j'ai fait un test unitaire avec le code le plus simple possible :

int incomingByte = 0;   // for incoming serial data

void setup() {
        Serial.begin(1200);     // opens serial port, sets data rate to 1200 bps
}

void loop() {

        // send data only when you receive data:
        if (Serial.available() > 0) {
                // read the incoming byte:
                incomingByte = Serial.read();

                // say what you got:
                Serial.print("I received: ");
                Serial.println(incomingByte, DEC);
        }
}

J'ai connecté l'arduino via l'usb et utilisé cutecom sous Linux pour lire les informations série. Il permet de définir 1200 bits/s - 7 bits/caractères - 1 bit de stop et parité paire tel que le défini la norme téléinfo décrite ici : Gestionnaire d'énergie: en savoir plus sur la téléinformation

Malheureusement je n'ai rien qui s'affiche coté pc.
Après relecture de mes liens je constate que mon premier lien est destiné à une interface série RS232 et que le RX de l'arduino semble être du TTL.
Et je trouve un schéma encore plus simple que le premier sur ce blog : La domotique du pauvre - Le blog de la Famille Thierry

Malheureusement, ce nouveau schéma n'est pas plus concluant.
N'ayant pas les bases en électronique, je n'ai jamais eu la chance d'en faire, j'ai l'impression d'être dans une impasse.

Je vous remercie par avance de toute aide qui puisse me faire progresser.

Bonsoir

je ne suis pas certain de comprendre à 100% les détails de la démarche mais je vois déjà deux remarques :

-Si l'optocoupleur est bien relié à DO (RX) il est en risque de conflit avec le convertisseur USB-UART présent sur la carte Arduino. ça peut expliquer la non prise en compte des signaux venants du coupleur opto. Si c'est le cas le coupleur opto pourrait être connecté à une entrée numérique totalement libre qui serait configurée en entrée Rx 'SOFT' (librairie SoftSerial avec Arduino1.0 ou NewSoftSerial pour les versions antérieures) La librairie SoftSerial a aussi l'avantage de gérer la polarité du signal Rx, j'ai un doute et me demande si , avec l'opto coupleur branché comme cela, il ne faut pas travailler en polarité 'Inverse' ??

-probleme posé par le format '7bits+Parité' non pris en charge par l'Arduino je crois (hors configuration directe des registres de l'UART)....pas très grave : sacrifier l'info de parité , elle sera vue comme le '8ème bit' (format 8bits+Stop)....puis masquage de ce 8ème bit :

if (Serial.available() > 0) CaractereRecu = Serial.read() & 0x7F;

Merci beaucoup,

Je soupçonnais effectivement qu'il y ai un conflit entre le D0 (RX) et la liaison serie USB. J'esperais juste qu'il utilise le D0 pour lire et l'USB pour le TX ...
J'ai donc mis à jour mon schéma suite à tes remarques :

Et avec ce petit bout de code :

#include <SoftwareSerial.h>

SoftwareSerial cptSerial(2, 3);

void setup() {
        Serial.begin(1200);     // opens serial port, sets data rate to 1200 bps
        cptSerial.begin(1200);
}

void loop() {
  
  if (cptSerial.available())
    Serial.write(cptSerial.read() & 0x7F);
}

J'ai effectivement la chance d'avoir en sortie des données qui ressemblent bien à celles de la téléinformation :

ADCO 02092xxxxxx @
OPTARIF HC.. <
ISOUSC 45 ?
HCHC 010956910 %
HCHP 016779643 >
PTEC HP..
IINST 021 Z
IMAX 047 J
PAPP 04860 3
HHPHC A ,
MOTDETAT 000000 B

Maintenant que j'ai validé que le montage est ok, il me reste à investir dans un shield ethernet afin de pouvoir me passer de la connexion usb.

PS : Pour l'opto-coupleur, la version SFH6206 n'est pas au format DIP et donc inutilisable directement sur un plaque d'essai. Je conseille donc plutôt de prendre l'opto-couple SFH620A qui est le même mais au format DIP et donc compatible avec les plaques d'esssai (C'est celui que j'utilise)

il ne manque pas un R4k7 : TouteLaDomotique.com : la maison connectée au meilleur prix

sinon :
http://www.euvrard.net/teleinfo/

qui fonctionne à 100%

Je ne pense pas qu'il manque cette résistance de 4.7, tous les schémas que j'ai trouvé avec cette résistance était destiné à une interface RS232 et si je ne me trompe les entrées série de l'arduino sont TTL.

En tout cas, cela fonctionne chez moi sans. J'ai trouvé le schéma sur ce blog : La domotique du pauvre - Le blog de la Famille Thierry

Comme je suis en train de préparer un shield multi fonction pour mon projet, il me faudrait essayer avec le sfh620 qui prendrait moins de place que les deux chips.

me faut du courage pour refaire une plaquette ...

Je viens de faire le montage avec le SFH620-A avec la R4k7. Si cela ne fonctionne pas, ma faudra juste la supprimer

Me reste à aller tester ...

Cela fonctionne avec le sfh620-a et la R4K7 sur le +5v

Bonjour,
je flanche un peut la sur 3 erreur sur la verif le code ne passe pas ??

ar_teleinfo2.cpp: In function 'void setup()':
ar_teleinfo2:143: error: 'sendHbeat' was not declared in this scope
ar_teleinfo2.cpp: In function 'void loop()':
ar_teleinfo2:149: error: 'pulse' was not declared in this scope
ar_teleinfo2:157: error: 'sendHbeat' was not declared in this scope
ar_teleinfo2:168: error: 'sendTeleinfoBasic' was not declared in this scope

Merci pour votre aide ^^

Y manquerait pas un peu ton code pour voir ce qui flanche.... ? :grin:

OUPS oui effectivement

/********************* Set up arduino ***********************/
void setup() {

pinMode(LEDPIN, OUTPUT);

// Serial to EDF cpt
cptSerial.begin(1200);
Serial.begin(115200);

// Ethernet initialisation
Ethernet.begin(mac, ip);
Udp.begin(localPort);

// Send a hbeat message on startup
sendHbeat();
digitalWrite(LEDPIN, LOW);
}

void loop() {
// pulse management
pulse();

if (second == 1) {

// Hbeat action
lastTimeHbeat += 1;
// Each N minute, send a hbeat xpl message
if (lastTimeHbeat == (MINUTE*HBEAT_INTERVAL)) {
sendHbeat();
lastTimeHbeat = 0;
}

// send teleinfo stat
lastTimeTeleinfo += 1;
// Each N minute, get teleinfo
if (lastTimeTeleinfo == (MINUTE*TELEINFO_INTERVAL)) {
digitalWrite(LEDPIN, HIGH);
getTeleinfo();
digitalWrite(LEDPIN, LOW);
sendTeleinfoBasic();
lastTimeTeleinfo = 0;
}
}

}

ar_teleinfo2.cpp: In function 'void setup()':
ar_teleinfo2:143: error: 'sendHbeat' was not declared in this scope
ar_teleinfo2.cpp: In function 'void loop()':
ar_teleinfo2:149: error: 'pulse' was not declared in this scope
ar_teleinfo2:157: error: 'sendHbeat' was not declared in this scope
ar_teleinfo2:168: error: 'sendTeleinfoBasic' was not declared in this scope

Ben il te dit que sendHbeat(), pulse(), sendTeleinfoBasic() ne sont pas définis. Ce qui au regard du code que tu as posté est vrai.
Il doit te manquer un bout de code avec la définition de ces fonctions.

C'est bon juste les 3 .ino a mètre dans le meu fichier merci a :wink: