PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Smartmeter über ESP8266 ESP-12E NodeMCU mit Optokopf via RS232 auslesen



GrafKoks
05.04.2017, 12:10
Hallo zusammen!

Ich verwende zur Programmierung die Arduino IDE und möchte gerne meinen Smartmeter Iskra eHZ-EDL MT681 über die IR-Schnittstelle auslesen.

Hardware:
- ESP8266 ESP-12E NodeMCU
- Optokopf (RS232), RJ9 Stecker entfernt und die Kabel direkt angeklemmt (http://www.mysmartshop.de/co-met-magnet-…he-zaehler.html (http://www.mysmartshop.de/co-met-magnet-ir-optokopf-fuer-elektronische-zaehler.html))
- 5V 3.3V 4-Kanal Logic Level Converter (https://www.amazon.de/gp/product/B01MTUK…0?ie=UTF8&psc=1 (https://www.amazon.de/gp/product/B01MTUKUUH/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1))

Aufbau:

Optokopf:
-> Bezugspotential an GND vom NodeMCU
-> pos. Betriebsspannung an VIN (5V) vom NodeMCU
-> Tx (Kopf) an Rx (NodeMCU) GPIO 13 über den Logic Level Converter
-> Rx (Kopf) an Tx (NodeMCU) GPIO 15 über den Logic Level Converter

Da ich über mir noch Infos über den Serial ausgeben lasse, muss ich immer einen Serial.Swap() durchführen, um auf GPIO 13 und 15 und wieder zurück umzuswitchen ( https://github.com/esp8266/Arduino/blob/master/doc/reference.md#serial (https://github.com/esp8266/Arduino/blob/master/doc/reference.md#serial) ).
Mein Problem ist, dass manchmal ein paar Daten kommen, manchmal keine und manchmal auch ziemlich viele, die aber leider nicht dem SML Protokoll entsprechen.
Kann es sein, dass über den 5V VIN des NodeMCU zu wenig Spannung bzw. Strom an den Optokopf (5V Betriebsspannung, 5 mA) geliefert werden? Oder benötige ich sonst noch irgendein Bauteil, was ich übersehen habe (evtl. MAX3323E oder so)?

Hier mal den Codeschnipsel den ich zum Test geschrieben habe:



int inByte[1024];
int icount=0;

void setup() {
Serial.begin(9600); // initialize serial output

while (!Serial) {
delay(100);
}

Serial.swap();
}

void loop(){
delay(500);

if(Serial.available()) {
while (Serial.available()>0){
inByte[icount] = Serial.read();
icount++;
}

Serial.swap();
delay(500);

for(int i=0; i<icount; i++){
Serial.print(inByte[i], HEX);
}

icount=0;
Serial.println("");
Serial.swap();
}


Wäre sehr froh, wenn mich einer von Euch auf die richtige Fährte bringen könnte.

Schonmal vielen Dank im Voraus und viele Grüsse aus Rheinland-Pfalz :-)

Toby
17.03.2018, 18:39
Guten Abend.
Dein Projekt entspricht genau meinem Vorhaben, deshalb krame ich es mal wieder hervor. Hast du das Problem lösen können?

Grüsse Toby