Forum: Mikrocontroller und Digitale Elektronik EDL21 eHZ auslesen


von Hobbybastler (Gast)


Lesenswert?

Hallo,
ich weiß nicht, ob ich in diesem Forum richtig bin, aber ich versuch's 
mal.

Ich will einen modernen, digitalen Stromzähler EDL21 eHZ 
(https://wiki.volkszaehler.org/hardware/channels/meters/power/edl-ehz/edl21-ehz) 
mittels Arduino auslesen. Dazu gibt es schon viel Doku im Netz aber 
einige technische Details fehlen noch.
1.) Liefert die IR Schnittstelle des Zählers ein UART kompatibles 
Format, also insbesondere Start- und Stopbit oder muss man hier noch 
irgendwie konvertieren ?
2.) Genügt als Empfänger der IR-Diode eine IR-Diode mit nachgeschaltetem 
Schmitt-Trigger oder wie geht man hier am besten vor ?

Hoffe, hier hat jemand Erfahrung damit und kann mir hilfreiche Tipps 
geben.

Merci vorab

von Stefan B. (stefan_b278)


Lesenswert?

1) Liefert UART Signal
2) Beitrag "Re: IR-Lesekopf an Stromzähler"

Du brauchst nur den Empfangsteil.

von Wolfgang (Gast)


Lesenswert?

Hobbybastler schrieb:
> 2.) Genügt als Empfänger der IR-Diode eine IR-Diode mit nachgeschaltetem
> Schmitt-Trigger oder wie geht man hier am besten vor ?

Du solltest zwischen IR-Diode und IR-Diode unterscheiden. Die einen 
geben IR-Licht ab und werden als IR-LEDs bezeichnet, die anderen 
empfangen IR-Licht und werden als (IR-)Photodioden bezeichnet. Ein 
Schmitt-Trigger hinter einer Photodiode wird nicht reichen. Mit einem 
Phototransistor stehen die Chancen besser.

von Klaus R. (klara)


Lesenswert?

Stefan B. schrieb:
> 1) Liefert UART Signal
> 2) Beitrag "Re: IR-Lesekopf an Stromzähler"
>
> Du brauchst nur den Empfangsteil.

Du mußt doch zunächst etwas Senden um etwas Empfangen zu können. Ohne 
Kennung läuft da nichts.
mfg Klaus

von H.Joachim S. (crazyhorse)


Lesenswert?

Klaus R. schrieb:
> Du mußt doch zunächst etwas Senden um etwas Empfangen zu können. Ohne
> Kennung läuft da nichts.

Nicht bei allen. Meiner (Q3BA) schmeisst auch alles unaufgefordert raus.

von Carsten-Peter C. (carsten-p)


Angehängte Dateien:

Lesenswert?

Hallo, ich nutze diese Schaltung, um meinen Zähler abzufragen. Sende die 
Zeichen /?!
Mit Glück antwortet der Zähler etwa so:
/PAF5EC3g00006
[10][13][13]SLx[02]0.0.0(12345678)
0.0.1(PAF)
F.F(00)
0.2.0(1.29)
1.8.0*00(001752.06)
C.2.1(000000000000)( )
0.2.2(:::::G11)!
[03]N
Der Zählerstand ist dann 001752.06
Du hast natürlich keinen Pafal- Zähler, aber /?! Scheint ein Standart zu 
sein.
Die Fototransistoren/Dioden sind nicht so kritisch. Sie sollten bei ca. 
880nm arbeiten. Die Schaltung habe ich von Volkszähler.org .Die 
funktioniert seit Jahren sehr zuverlässig.
Gruß und viel Glück Carsten

: Bearbeitet durch User
von Georg G. (df2au)


Lesenswert?

Meine Erfahrungen:
Der Zähler (eBZDD3) plappert auch ohne PIN oder Aufforderung. Er gibt 
dann rudimentäre Daten von sich.

Die Doku des Herstellers ist verwirrend bis falsch. Angeblich hat die 
Schnittstelle 9600-7-e-1. Tatsächlich hat sie 9600-8-n-1.

Die SML Telegramme entsprechen nur teilweise den Angaben in der 
Betriebsanleitung.

Der Netzbetreiber ist unwissend (oder unwillig). Der Hersteller 
antwortet auf Mail nicht.

von Hobbybastler (Gast)


Lesenswert?

Stefan B. schrieb:
> 1) Liefert UART Signal
> 2) Beitrag "Re: IR-Lesekopf an Stromzähler"
>
> Du brauchst nur den Empfangsteil.

Danke Stefan, das hat soweit funktioniert mit diesen Tipps. Nun bekomme 
ich eine SML Antwort, die mit 1B 1B 1B 1B beginnt, dann aber nicht wie 
in den Protokollen beschrieben mit 01 01 01 01 fortgesetzt wird, sondern 
mit 11 11,
also mein SML Signal startet wie folgt:

1B 1B 1B 1B 11 11... und endet so : 1B 1B 1B 1A

Kennt sich hiermit jemand aus, ob das korrekt sein kann. Wie finde ich 
die passende Spezifikation zu dem Zähler, wenn es unterschiedliche EDL21 
eHZ gibt ?

Merci

von Stefan B. (stefan_b278)


Lesenswert?

Eventuell falsches Datenformat? Hast du ein Oszi oder einen 
Logiganalyser?
Oder dein Programm gibt keine Nullen aus..

von Klaus R. (klara)


Lesenswert?

Hobbybastler schrieb:
> dann aber nicht wie
> in den Protokollen beschrieben mit 01 01 01 01 fortgesetzt wird, sondern
> mit 11 11,
> also mein SML Signal startet wie folgt:
>
> 1B 1B 1B 1B 11 11... und endet so : 1B 1B 1B 1A

Ich vermute auch stark das Dein Ausleseprogramm die Nullen nicht 
anzeigt.

https://wiki.volkszaehler.org/hardware/channels/meters/power/edl-ehz/edl21-ehz
1
Rohdaten
2
3
Die Rohdaten wurden mit dem Tool Hterm gemessen um dabei die SML Botschaft zu überprüfen. Dabei wird sichtbar, dass der Aufbau der SML Botschaft der Spezifikation der SML entspricht. beispiel_3emh_ehz_fw8e2a50bak2
4
Beginnend mit dem Start 1B 1B 1B 1B und Ende 1B 1B 1B 1B. 
5
6
1B 1B 1B 1B 01 01 01 01 76 07 00 09 03 7B 4F 6F 62 00 62 .....

Deine Sequenz mit "11 11" könnte zu "01 01 01 01" passen. Siehst Du denn 
überhaupt irgendwo Nullen?

Verwende doch mal das Tool „Hterm“, wie in volkszaehler.org beschrieben. 
Das war auch mein Tool.
mfg klaus

von Hobbybastler (Gast)


Lesenswert?

Klaus R. schrieb:
> Deine Sequenz mit "11 11" könnte zu "01 01 01 01" passen. Siehst Du denn
> überhaupt irgendwo Nullen?

Hey Experten,

ihr hattet recht. Der Arduino lässt bei der seriellen Ausgabe die NULLEN 
grundsätzlich weg - trügerisch. Gebe nun nach jedem Byte ein Leerzeichen 
bzw. Bindestrich aus, dann wird das Ergebnis klar.

Aber nun nächstes Problem: Ich lese jedes Byte wie folgt und gebe es 
über den seriellen Monitor der Arduino IDE aus:

1. Variante:
 void loop()
{    Serial.println();
  while(Serial.available()>0) {

   // get incoming byte:
    inByte = Serial.read();
   Serial.print(inByte, HEX);

}
}
2. Variante: (um die Bytes klar trennen und identifizieren  zu können)
 void loop()
{    Serial.println();
  while(Serial.available()>0) {

   // get incoming byte:
    inByte = Serial.read();
   Serial.print(inByte, HEX);
 Serial.print("-");
}
}

Problem: Die 2. Variante gibt nicht mehr den gesamten Datenstrom der vom 
Stromzähler gesendet wird aus; das Ergebnis, das auf dem Monitor 
dargestellt wird hat wesentlich weniger Bytes

Warum ?

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

Steuerzeichen?

von Georg G. (df2au)


Lesenswert?

In Variante 2 machst du aus einem gelesenen Byte zwei auszugebende 
Bytes. Die Ausgabe hat aber die gleiche Geschwindigkeit wie die Eingabe 
und der Zähler sendet die Bytes ohne große Pause. Das passt nicht. Mach 
zwei serielle Kanäle auf, einen nur zum Lesen mit 9600Bd und einen zur 
Ausgabe mit 115200Bd.

von Basty (Gast)


Lesenswert?

Georg G. schrieb:
> Variante 2 machst du aus einem gelesenen Byte zwei auszugebende Bytes.
> Die Ausgabe hat aber die gleiche Geschwindigkeit wie die Eingabe und der
> Zähler sendet die Bytes ohne große Pause. Das passt nicht. Mach zwei
> serielle Kanäle auf, einen nur zum Lesen mit 9600Bd und einen zur
> Ausgabe mit 115200Bd.

Wow, sehr gut Georg. Das ist plausibel. Für mich war immer im 
Hinterkopf, dass Rx und Tx gleiche Baudraten aufweisen sollten, aber in 
dem Falle ist es Blödsinn... Wieder was Wichtiges gelernt!! Vielen Dank 
Georg!!

von Klaus R. (klara)


Lesenswert?

Basty schrieb:
> Für mich war immer im
> Hinterkopf, dass Rx und Tx gleiche Baudraten aufweisen sollten, aber in
> dem Falle ist es Blödsinn...

Rx und Tx gehören zusammen zu einem Kanal.

Georg G. schrieb:
> Mach zwei
>> serielle Kanäle auf, einen nur zum Lesen mit 9600Bd und einen zur
>> Ausgabe mit 115200Bd.

Du sollst zwei Kanäle (jeweils Rx & Tx) aufmachen. Den einen verwendest 
Du nur zum Lesen mit 9600Bd und den anderen nur zur Ausgabe mit 
115200Bd.

Ein serieller Kanal hat für Rx und Tx immer die gleichen 
Übertragungsparameter. Sonst würde das Timing auch nicht funktionieren.
mfg klaus

von H.Joachim S. (crazyhorse)


Lesenswert?

Das ist keineswegs immer so. Bei so einfachen MC ja (ein gemeinsamer 
Baudratengenerator für RX und TX wie beim 8051 und AVR). Z80 SIO könnte 
verschiedene Baudraten, M16C und andere auch. Wichtig ist nur dass die 
Baudraten paarweise passen.

von Hobbybastler (Gast)


Lesenswert?

Klaus R. schrieb:
> Du sollst zwei Kanäle (jeweils Rx & Tx) aufmachen. Den einen verwendest
> Du nur zum Lesen mit 9600Bd und den anderen nur zur Ausgabe mit
> 115200Bd

Hm, aber wie erwähnt nutze ich einen Arduino (NANO), der hat nur EINE 
UART. Wie soll ich hier 2 Kanäle nutzen ? Kann mir jemand einen 
Beispielcode geben ?

von Georg G. (df2au)


Lesenswert?

Klaus R. schrieb:
> Ein serieller Kanal hat für Rx und Tx immer die gleichen
> Übertragungsparameter.

(Mode der Ausscheidung kleiner Rosinen):
Vor Jahrzehnten gab es den Modem Standard CCITT V23 mit 1200Bd/75Bd vor 
allem für Akustikkoppler.

Aber ansonsten hast du Recht. Der Lesekanal kann bequem per SoftSerial 
erschlagen werden. 9600Bd sind da bequem machbar. Und den Sendekanal 
übernimmt der UART.

von Hobbybastler (Gast)


Lesenswert?

Georg G. schrieb:
> Der Lesekanal kann bequem per SoftSerial
> erschlagen werden. 9600Bd sind da bequem machbar. Und den Sendekanal
> übernimmt der UART.

Heißt: Da ich den Arduino Nano nutze, muss ich einen anderen Pin als den 
hardwareseitigen RX Pin für das Lesen der Zählerdaten nutzen ? Also für 
das Lesen die Hardware umstellen, die Software belassen und für das 
Schreiben die Software um einen Kanal erweitern ?

von Georg G. (df2au)


Lesenswert?

Lies bitte als erstes die Doku zu SoftSerial. Wenn dann Fragen offen 
sind, finden wir Antworten.

von Hobbybastler (Gast)


Lesenswert?

Georg G. schrieb:
> Lies bitte als erstes die Doku zu SoftSerial. Wenn dann Fragen offen
> sind, finden wir Antworten.

Das tat ich zuvor schon, deshalb die Frage nach der Hardwareänderung, um 
sicher zu gehen. Der NANO hat ja hardwaremässig nur eine UART 
Schnittstelle mit RX bzw. TX. Ich habe bislang deren RX Pin zum Lesen 
des Zählers benutzt. Und via Arduino IDE (Serieller Monitor mit 9600 Bd) 
die Ergbnisse wie oben beschrieben unbefriedigt rasusbekommen (Variante 
1 scheint korrekt aber wegen fehlender Trennung der HEX Daten kaum 
auswertbar; Variante 2 schneidet Bytes nach einer gewissen Länge/Zeit 
einfach ab oder scheint sie sogar zu verfälschen). Um deinem Vorschlag 
zu folgen müsste ich also einen neuen (anderen) Pin als den UART RX Pin 
nutzen und per SoftSerial Lib auslesen. Und dann mit Serial (UART) bei 
höherer Baudrate im seriellen Monitor den Empfang darstellen. Ist das 
Verständnis so korrekt ?  DANKE !

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

Wenn Pausen vorhanden sind, könnte man darin die Baudrate ändern.

von Hobbybastler (Gast)


Lesenswert?

Abdul K. schrieb:
> Wenn Pausen vorhanden sind, könnte man darin die Baudrate ändern.

Und dann mit dem UART auch lesen ? Pausen sind, ca. 1-3 Sekunden 
zwischen 2 Schreib beim Zähler (bzw. Lesevorgängen beim NANO)

von Georg G. (df2au)


Lesenswert?

Hobbybastler schrieb:
> Ist das
> Verständnis so korrekt ?  DANKE !

Ja, genau so wird es gemacht.

von Hobbybastler (Gast)


Lesenswert?

Es flutscht jetzt ! Danke an alle für die tolle Hilfe !

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.