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
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.
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
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.
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
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.
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
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
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 ?
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.
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!!
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
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.
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 ?
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.
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 ?
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 !
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)