Stromzähler auslesen mit IR-Lesekopf

Hallo,

ich würde gerne meinen ISKRA MT681 Stromzähler mit dem Arduino auslesen. Dies müsste auch funktionieren da an dem Zähler eine Schnittstellen mit 9600 Baud, 8N1 zur Verfügung steht. Jedoch bekomme ich nur Müll raus. Die Daten werden laut Bescheibung in HEX ausgegeben und müsste so oder so ähnlich aussehen:

1-0:1.8.0*255 Wirkenergie in Wh (total) 1-0:1.8.1*255 Wirkenergie Tarif 1 in Wh (total) 1-0:1.8.2*255 Wirkenergie Tarif 2 in Wh (total) 1-0:15.7.0*255 Wirkleistung in W 1-0:21.7.0*255 Wirkleistung L1 in W 1-0:41.7.0*255 Wirkleistung L2 in W 1-0:61.7.0*255 Wirkleistung L3 in W

Ich bekommen aber nur eine Lange Zeichenkette welche keine Ähnlichkeit mit den Daten die ich bekommen sollte zu tun hat.

Mein Programm sieht bis jetzt so aus: Wobei am Serial1 mein IR-Kopf hängt und am anderen mein PC.

void setup() { // initialize serial: Serial.begin(19200); Serial1.begin(9600); } void loop() {

if (Serial1.available()) { int inByte = Serial1.read(); Serial.print(inByte,HEX); }}

Hier noch das Datenblatt des Zählers mit der Protokoll Beschreibung auf Seite 10. http://datenblatt.stark-elektronik.de/iskraemeco/MT681_Technische%20Beschreibung.pdf

Dein "IR Lesekopf" an der INFO Schnittstelle funktioniert? und gibt TTL Pegel der richtigen Polarität aus? Wie wird der (insbesondere dessen Phototransistor) versorgt?

( In Ruhe müsste der Ausgang ca. 5V HIGH = Stopbit sein )

Hast du einen Logik-Analyzer ?

Der IR-Kopf wurde getestet und sollte funktionieren. Einen Logik-Analyzer habe ich leider

Was ich bekommen sieht ja so schlecht nicht aus z.B.

A1 46 9B 9C F9 3E 27 2C C5 AD 4B 8D C2

aber wie Wandele ich das um das um dass ich es lesen kann ?

Doch, ziemlich schlecht :slight_smile:

Immerhin bewegt sich was. und es sind weder 00 noch FF Daten zu sehen. Also ok, nicht ganz schlecht.

Dein Sketch scheint ja soweit in Ordnung.
Ist denn eine Struktur zu erkennen? Sollten zwischen zwei Telegrammen nicht min. 0.5 sec Pause sein?
falls sowas erkannt wird, mal ein Serial.println() einbauen …
Und/oder noch zwei LED+Vorwiderstand an den Rx Pin hängen:

Rx -+->|--- 1k --- GND
    |  rt
    |
    +-|<--- 1k --- 5V
       gn

(Logik - Analyzer für ganz Arme:

  • Pause= rot
  • Zeichen = rot+grün, bei 9600 sieht man leider kein flackern mehr
  • gar kein Signal = rot+grün beide schwach (für ganz Arme, eben)
    )

Noch am Rande, auch wenn die Daten sowieso nicht lesbar wären:

void setup()
    Serial.print(inByte,HEX);

Gibt alles in HEX aus.

void setup()
    Serial.print(inByte,ASC);

Gibt alles in ASCII Zeichen (Lesbar) aus.

also man sieht das es nicht kontinuierlich ist sonder es ist immer eine Pause dazwischen, dass kann man an dem RX Led am Arduino sehen. die geht immer schön an und aus im gleichen Takt. Könnte so ne halbe Sekunde sein.

Die Funktion void setup() Serial.print(inByte,ASC); geht bei mir nicht.

Aber wenn ich

Serial.write(inByte); mache dann wird in ASCII ausgegeben aber leserlich ist das auch nicht

die geht immer schön an und aus im gleichen Takt. Könnte so ne halbe Sekunde sein.

Ok, dann mal synchronisiert ausgeben:

void loop() {
  static unsigned long lastchar; // zum Pause erkennen
  if (Serial1.available()) {
    int inByte = Serial1.read();
    if (inbyte < 0x10)Serial.write('0');
    Serial.print(inByte,HEX);
    Serial.write (' ');
    lastchar = millis();
  }

  const int PAUSE = 350; // evtl. an tatsächliche Pause anpassen, so dass nur eine Neue Zeile passiert 
  if (millis() - lastchar > PAUSE) {  
    Serial.println();
    lastchar += PAUSE;
  }
}

Sind es denn immer die gleiche Anzahl Zeichen?

Evtl. mal andere Geschwindigkeit, Parity ausprobieren,
obwohl 9600, 8N1 schon glaubwürdig klingt :wink:

Ich Probier das mal morgen früh. Aber mit anderen bautraten und andere config Einstellungen hab ich schon rum probiert. Ist aber ehr schlimmer geworden.

Ich hab ja immer noch den IR-Lesekopf im Verdacht. Ist das was selbstgebautes, oder hat der ne Dokumentation ? (Liefert er TTL-Level Serial ?)

Ausserdem findet man bei DIN EN 62056-21 schnell zu volkszaehler.org ... vielleicht findest du da was ...

Der Lesekopf ist von Volkszaehler.org und so wie die Daten jetzt aussehen sind sie richtig nur kann ich sie nicht auswerten.

Die Daten beginnen immer mit : 1B 1B 1B 1B 01 01 01 01 ....... Das ist de startsequenz für SML. Aber keine Ahnung wie ich das jetzt weiter aufschlüssele ...

Lesekopf ist der TTL-IR-Lesekopf.

Kann jemand SML entschlüsseln ? ;-)

Was hast du gemacht, dass es plötzlich geht?

SML: Google: Arduino decode SML

Eigentlich nichts. Nur das mit der Zeit eingefügt und dann gemerkt dass die Daten immer den gleichen Anfang haben und die den Anfang vom SML-Protokoll beschreiben. Hier mal ein ganzer Datensalat:

1B 1B 1B 1B 01 01 01 01 76 05 04 8E 37 31 62 00 62 00 72 63 01 01 76 01 01 05 01 84 BD 0F 0B 09 01 49 53 4B 00 03 C8 BA 1C 01 01 63 11 6A 00 76 05 04 8E 37 32 62 00 62 00 72 63 07 01 77 01 0B 09 01 49 53 4B 00 03 C8 BA 1C 07 01 00 62 0A FF FF 72 62 01 65 01 F4 DB 32 7D 77 07 81 81 C7 82 03 FF 01 01 01 01 04 49 53 4B 01 77 07 01 00 00 00 09 FF 01 01 01 01 0B 09 01 49 53 4B 00 03 C8 BA 1C 01 77 07 01 00 01 08 00 FF 65 00 01 01 82 01 62 1E 52 FF 59 00 00 00 00 04 B5 C2 3E 01 77 07 01 00 01 08 01 FF 01 01 62 1E 52 FF 59 00 00 00 00 04 B5 C2 3E 01 77 07 01 00 01 08 02 FF 01 01 62 1E 52 FF 59 00 00 00 00 00 00 00 00 01 77 07 01 00 02 08 00 FF 65 00 01 01 82 01 62 1E 52 FF 59 00 00 00 00 02 BD D0 69 01 77 07 01 00 02 08 01 FF 01 01 62 1E 52 FF 59 00 00 00 00 02 D0 69 77 07 00 02 02 FF 01 62 52 FF 00 00 00 00 00 00 01 07 01 10 07 FF 01 62 1B 00 55 00 0F 01 77 01 00 07 00 01 01 1B 52 55 00 00 4D 77 07 00 38 00 FF 01 62 52 00 00 00 FC 01 07 01 4C 07 FF 01 62 1B 00 55 00 03 01 77 81 81 82 05 01 01 01 83 D7 CB A1 61 E3 9B 99 F9 B8 27 2C C5 AD 4B 8D 42 51 5A FE 6B 45 46 C9 E1 23 67 3F A2 CE 41 8A EE 01 01 63 83 00 76 04 8E 33 62 62 00 63 02 71 01 0A CC 1B 1B 1B 1A 66 73

aber wie ich das jetzt weiter entschlüssele außer dass ich den Anfang "B 1B 1B 1B 01 01 01 01 " weg lassen kann weiß ich nicht. Im google hab ich auch nichts gefunden, bzw ich verstehe nur Bahnhof

mde110: SML: Google: Arduino decode SML

Der erste Treffer (bei mir) passt schon!

Tatsächlich war deine Sucher erfolgreicher als meine. Danke.
Das sieht echt gut aus was da beim ersten Treffer erscheint. Hab es mal kopiert und versucht aufzuspielen.
Jedoch wird da ein “prog_chrar” verwendet was bei mir nicht übersetzt werden kann.

sketch_mar05a.ino:100: error: ‘prog_char’ does not name a type

Hab auch mal nachgelesen das kommt von der #include <avr/pgmspace.h> aber irgendwie finde ich die nicht zum download, oder sie ist schon an board. Auf jedenfall bringt er keine Fehler wenn ich sie #include. Aber den Befehl kennt er nicht.

Aber ich hab das Gefühl wir sind auf dem Richtigen weg.

edit: hab was gelesen dass es an der Version liegt, probiere mal eine alte V1.0.x

Update: jetzt läuft das Sketch. Jedoch habe ich kein SD-Schild und würde den Code gerne über den Serial ausgeben, anstatt ihn auf der Karte zu speicher. Kann mir jemand helfen ?

Update: jetzt läuft das Sketch.

Glückwunsch. Dich kann man machen lassen ;)

Jedoch habe ich kein SD-Schild und würde den Code gerne über den Serial ausgeben, anstatt ihn auf der Karte zu speicher. Kann mir jemand helfen ?

Das ist einfacher als anders rum. Schmeiss alle SD.begin und file.open / close raus. ( Serial.begin(baudrate); statt dessen ;) )

Alle Ausgaben in eine geöffnete Datei gehen an Serial ( write, print, println können genauso bleiben, wenn du willst).

Poste mal deinen Sketch, dann helfe ich dir beim umschreiben…

Hab mich mal an dem Code versucht. er ist aber echt zu kompliziert für meine Kenntnisse. Es ist viel mit speicher abfrage und so enthalten. Auf jeden Fall bekomme ich es nicht gebacken was zu schreiben was läuft ;( brauche Unterstützung .....

Patrick87:
sketch_mar05a.ino:100: error: ‘prog_char’ does not name a type

Das ist inzwischen deprecated. Kannst du durch “const char” ersetzen

Hab auch mal nachgelesen das kommt von der #include <avr/pgmspace.h> aber irgendwie finde ich die nicht zum download, oder sie ist schon an board.

Das ist Teil der AVR libc und schon inkludiert. Aber die Details haben sich etwas geändert. Die extra Datentypen für PROGMEM gibt es nicht mehr. Statt dessen muss das jetzt zwingend const sein.

So hab die Datei mit dem Sketch mal angehängt.

mde110:
Poste mal deinen Sketch, dann helfe ich dir beim umschreiben…

Auslesen_mit_sdkarte.ino (11.4 KB)

michael_x:
Update: jetzt läuft das Sketch. Jedoch habe ich kein SD-Schild und würde den Code gerne über den Serial ausgeben, anstatt ihn auf der Karte zu speicher. Kann mir jemand helfen ?

Der angehängte Sketch ist nicht kompilierbar. Wo ist der richtige?

Ich hab mal die gröbsten Fehler korrigiert und das PROGMEM geändert.

Auslesen_mit_sdkarte.ino (11.4 KB)