Schönen Nachmittag
Ich versuche meinen Kaifa-Zähler (EVN) über den MBus auszulesen.
Den zugehörigen Schlüssel hat mir der Netzbetreiber zugeschickt und ich
habe ihn mit diesem Sketch
https://github.com/micronano0/ESP8266-NodeMCU-KAIFA-SmartMeter-Reader-STV-
auf einem ESP8266 D1 mini verwendet.
(Aufbau Bild 1)
Ergebnis: Keine Daten.
Dann habe ich den Sketch auf die reine serielle Übertragung
zusammengestutzt und gebe das Ergebnis auf einem kleinen Display aus:
1
#include <Adafruit_SSD1306.h>
2
3
#define SCREEN_WIDTH 128 // OLED display width, in pixels
4
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
byte incomingByte = 0; // for incoming serial data
9
10
void setup() {
11
Serial.begin(2400, SERIAL_8E1); // opens serial port,
12
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
13
display.clearDisplay();
14
display.setTextSize(1); // Normal 1:1 pixel scale
15
display.setTextColor(WHITE); // Draw white text
16
display.setCursor(0, 0);
17
display.println("Kaifa: ");
18
display.display();
19
delay(300);
20
}
21
22
void loop() {
23
// send data only when you receive data:
24
if (Serial.available() > 0) {
25
// read the incoming byte:
26
incomingByte = Serial.read();
27
28
// say what you got:
29
//Serial.print("I received: ");
30
//Serial.println(incomingByte, HEX);
31
display.print(incomingByte, HEX);
32
display.print(" ");
33
display.display();
34
}
35
}
Der Zähler sendet alle 5 sek. ein Paket von 482Byte mit 2400E81.
Beim ESP kommen davon nur zweimal 68 FF (mit einer kurzen Pause) davon
an.
Schließe ich einen RS232-Adapter an den MBusAdapter an (Bild 2) und
lassen den PC (mit HTerm) empfangen, bekomme ich die gesamten Daten.
(Bild 3)
Schließe ich den RS232-Adapter an den ESP an und sende die (vorher vom
Zähler empfangene) Datei vom PC zum ESP8266, kommt auch alles an.
Nur vom Zähler direkt zum ESP bleiben nur die besagten 4 Byte übrig ...
:(
Hat wer eine Idee?
Danke fürs Lesen
Christian
Ich sehe, dass du innerhalb der Verarbeitungs-Schleife
1
if(Serial.available()>0){
2
incomingByte=Serial.read();
3
...
4
}
Ausgaben auf das Display machst. Diese brauchen signifikant Zeit,
deswegen brauchst du einen Puffer am seriellen Port. Vermutlich ist der
vorhanden, aber ist er auch groß genug?
Ändere den Code mal so dass display.display() verzögert aufgerufen wird.
Und zwar nachdem alle Bytes verarbeitet wurden, also Serial.available()
== 0 ist.
Ich fürchte, ich verstehe nicht was Du meinst.
TX (vom MBus-Board) und RX (vom ESP) sind verbunden, somit (erwartbare)
0.000V
Und da der Zähler nur sendet ist die Gegenrichtung nicht verbunden.
Oder was meintest Du?
Hast du ein Oszilloskop, um mal zu kontrollieren, was sich denn dort
real auf der RX-Leitung des µC abspielt?
Denn ohne ein solches Messgerät wirst du bei seriellen Bussen laufend im
Blindflug mit Herumbastlen die Fehler suchen müssen. Dort im
Beitrag "Re: UART Übertragungsfehler bei bestimmten Zahlenwerten" sind solche Fälle
verlinkt.
Christian B. schrieb:> Ich fürchte, ich verstehe nicht was Du meinst.
Ein Schaltplan wäre nicht schlecht. Denn mit Fotos vom Aufbau muss man
erst noch die Module und deren Pinbelegung herauskramen und sich in
Gedanken diesen Schaltplan aufmalen. Das tue ich mir ehrlich gesagt
nicht an. An einem Schaltplan sieht man fundamentale Designflaws auf
einen Blick...
Sieht so aus als ob mehr als nur die "4 Byte" übertragen würden.
Der Pegel zwischen den Datenpaketen ist 3V3 (das wolltest Du, Stefan,
vermutlich wissen)
Und es werden die ganze Zeit (nicht mit einer Pause wie bei den
Empfangenen beiden "68 FF") Daten gesendet.
Christian B. schrieb:> TX (vom MBus-Board) und RX (vom ESP) sind verbunden, somit (erwartbare)> 0.000V
Eben nicht. UART Rx und Tx Leitungen müssen im Ruhezustand auf HIGH
Pegel sein, also idealerweise 3,3 Volt. Alles was davon abweicht könnte
ein Hinweis auf die Fehlerursache sein.
Christian B. schrieb:> Der Pegel zwischen den Datenpaketen ist 3V3 (das wolltest Du, Stefan,> vermutlich wissen)
Genau. Der HIGH Pegel sieht plausibel aus, aber der LOW Pegel ist mit
seinen >2 Volt viel zu hoch. Da würde ich weniger als 0,5 Volt erwarten.
Christian B. schrieb:> Der Pegel zwischen den Datenpaketen ist 3V3
Passt.
Aber bei den Daten kommt der Pegel ja nicht annähernd auf 0V. Für mich
ist das eine klassische Buskollision.
Stefan F. schrieb:> Genau. Der HIGH Pegel sieht plausibel aus, aber der LOW Pegel ist mit> seinen >2 Volt viel zu hoch. Da würde ich weniger als 0,5 Volt erwarten.
Du wirst sicher recht haben.
Fragt sich nur, warum dann reproduzierbar immer "68 FF" kommt, und der
ganze Rest nicht ...
Kontrolliere, ob die Stromversorgungs-Schienen des Steckbrettes an den
markierten Stellen unterbrochen sind. Das ist bei einigen Steckbrettern
der Fall.
Wenn sie bei dir unterbrochen sind, dann fehlt bei dir eine GND
Verbindung, was die Ursache für die falschen LOW Pegel sein könnte.
Stefan F. schrieb:> Kontrolliere, ob die Stromversorgungs-Schienen des Steckbrettes an den> markierten Stellen unterbrochen sind.
Also einfach mal die Spannung an allen Massepins der Module
gegeneinander messen. Da muss immer 0V herauskommen.
Christian B. schrieb:> Ich messe mal den TX ohne ESP ...
Tu das.
Sobald ich vom ESP den RX abstecke geht der Pegel am Mbus-Board beim
Senden fast auf 0.
Wahrscheinlich muss ich erst den RX als Eingang definieren? (Hätte
gedacht, das ist er per default ...)
Du hast den Rx Eingang des ESP8266 doppelt belegt.
Um das internet Signal (vom USB-UART) durch externe Beschaltung (dein
MBus Board) zu übersteuern, muss deine Quelle einen kräftigen
niederohmigen Ausgang haben. Hat es aber nicht.
Du brauchst einen Buffer zwischen den beiden Boards, z.B. 74HC125
Das klingt sehr plausibel und erklärt eigentlich auch die
Reproduzierbarkeit.
Zu Beginn des Datenpaketes gehen die Signalspitzen ein wenig weiter
Richtung 0V und steigen dann rasch an.
Das werden die ersten beiden Byte sein, die gerade noch so durchkommen.
Dann ist Sense.
Vielen Dank für eure Hilfe
Christian
...es gibt auch Wemos Boards, bei denen der Widerstand auf 150Ohm
reduziert wurde. Daran bin ich mit einem Auswerter für einen Stromzähler
zunächst gescheitert. Widerstand vergrößert und es lief wieder...
Jens