Go Down

Topic: D0-Schnittstellen-Projekt (Read 1 time) previous topic - next topic

Stalli

Hallo liebe Community,

Ich sitze zur Zeit an einer Studiums Arbeit, welche ich auf Grundlage von diesem Projekt https://www.msxfaq.de/sonst/bastelbude/smartmeter_d0_sml.htm aufbaue.

Mein Projekt ist die Entwicklung eines Konzeptes, welches durch Auslesen der D0-Schnittstelle Energiebewusstsein schaffen soll.

Leider komme ich zur Zeit schleppend voran, da zwar die Ausgabe meines Arrays funktioniert, aber leider bislang nicht die Aufnahme der IR-Signale durch die BPW 40.

Ich verwende zur Zeit ein WeMos D1 Mini und eine BPW 40, wobei der Emitter auf Masse liegt und der Kollektor mit dem RXD verbunden ist (Wie auch in der Quelle). Sowie das zur Verfügung gestellte Skript ohne WiFi-Schnittstelle und UDP-Übertragung.

Vorab wollte ich erstmal den Ablauf des Dateneingangs testen mittels einer Fernbedienung. Dies funktioniert leider nicht. Ich hänge in der while-Schleife fest, welche die Übertragungspause von 400ms simuliert.

Im Anhang ist der von mir getestete Code zu finden.

Ich hoffe jemand kann mir bei meinem Problem helfen. Anregungen, Tipps, etc. sind sehr willkommen

LG Stalli

Tommy56

Stelle Deinen Code bitte direkt ins Forum, nicht als Anhang. Benutze dazu Codetags (</>-Button oben links im Forumseditor), Dann ist er für alle gut lesbar.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Stalli

Code: [Select]
#include <ESP8266WiFi.h>
#include <WiFiUDP.h>
// extern "C" {  //required for system_get_chip_id()
// #include "user_interface.h"


  // Buffer for serial reading
  int  serIn;             // var that will hold the bytes-in read from the serialBuffer
  byte datagram[1000];    // array that will hold the different bytes
  int  serindex = 0;    // index of serInString[] in which to insert the next incoming byte

  int  serialbyte;        // Byte to store serial input data

  //
  //  Blink Function for Feedback of Status, takes about 1000ms
  //
  void blink(int count, int durationon, int durationoff, int delayafter) {
    for (int i = 0; i < count; i++) {
      digitalWrite(LED_BUILTIN, LOW);   // Turn the LED on
      delay(durationon);
      digitalWrite(LED_BUILTIN, HIGH);  // Turn the LED off by making the voltage HIGH
      delay(durationoff);
    }
    delay(delayafter);
  }

  void setup() {
    pinMode(LED_BUILTIN, OUTPUT);     // Initialize the LED_BUILTIN pin as an output
    blink(1, 5000, 500, 1000); // Signal startup
    Serial.begin(9600);   // Open serial communications and wait for port to open:
    while (!Serial) {
      ; // wait for serial port to connect.
    }
    Serial.println("ESP8266-DO-Logger init");
    blink(4, 100, 500, 2000);   // Signal Serial OK

  }

  void loop() {
    //
    // Clear Serial Data
    //
    Serial.println("C");
    while (Serial.available()) {
      while (Serial.available()) {
        serialbyte = Serial.read(); //Read Buffer to clear
      }
      //Serial.print("F");
      delay(10);  // wait approx 10 bytes at 9600 Baud to clear bytes in transmission
    }


    //
    // assume, that there is now a pause. Wait for start of transmission
    //
    Serial.println("W");
    int flashcount = 0;
    while (!Serial.available()) {
      flashcount++;
      // Serial.println(flashcount);
      if (flashcount == 400) {
        digitalWrite(LED_BUILTIN, LOW);       // Turn the LED on
      }
      else if (flashcount > 500) {
        digitalWrite(LED_BUILTIN, HIGH);      // Turn the LED off
        flashcount = 0;
      }
      else {
        delay(5);  // wait 5 ms for new packets
      }
    }

    // We got some bytes. read until next pause
    Serial.println("R");
    // Serial.println("Reading serial data");
    Serial.setTimeout(500);   // Set Timeout to 500ms.
    serindex = Serial.readBytes(datagram, 1000);
    // serindex = Serial.readBytesUntil('',datagram,1000);  // read all serial data and end with timeout.. How to read without looking for stop character
    //serindex = 0;
    //while (Serial.available() && (serindex < 1000)){
    //  while (Serial.available() && (serindex < 1000)){
    //    serialbyte = Serial.read();   // Read Data with a 1000ms timeout
    //    datagram[serindex] = serialbyte;
    //    serindex++;
    //  }
    //  delay(10);  // wait 10ms for more bytes
    //}

    if (serindex < 1000) {
      Serial.println("D");
      blink(5, 100, 100, 0);
      Serial.print("Datagram received. Total Bytes:"); Serial.println(serindex);
    }
    else {       // Error out of bounds during reading bytes from serial.
      blink(10, 100, 100, 2000);
    }

    // Serial.println("Sleep 10 Seconds");
    blink(100, 30, 70, 0);
  }
}

Rentner

#3
Jun 12, 2018, 01:05 pm Last Edit: Jun 12, 2018, 01:06 pm by Rentner
Hallo,

es wäre schön wenn Du deine Skatche hier als code einstellst. dazu gibt es oben links den button </>.

Dann können wir Ihn alle sehen und müssen nicht den Anhang downloaden und öffnen.


Zu deinem Problem .

Mit Deinem Skatch kannst du nicht die Signale einer Fernbedienung einlesen. Der Skatch liest die Daten von der Seriellen Scnittstelle mit dem dazugeörigen Protokoll ein. Das mag für eine D0 Schnittstelle klappen  aber nicht mit einer Fernbedienung, die hat ein völlig anderes Protokoll.


Heinz

agmue

Vorab wollte ich erstmal den Ablauf des Dateneingangs testen mittels einer Fernbedienung.
Sollte mich wundern, wenn Deine Fernbedienung 9600 Baud Datenübertragungsrate einschließlich richtigem Protokoll liefern würde.

Ich verwende zur Zeit ein WeMos D1 Mini und eine BPW 40, wobei der Emitter auf Masse liegt und der Kollektor mit dem RXD verbunden ist (Wie auch in der Quelle).
Fehlt da nicht ein Widerstand?
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

Stalli

Zu deinem Problem .

Mit Deinem Skatch kannst du nicht die Signale einer Fernbedienung einlesen. Der Skatch liest die Daten von der Seriellen Scnittstelle mit dem dazugeörigen Protokoll ein. Das mag für eine D0 Schnittstelle klappen  aber nicht mit einer Fernbedienung, die hat ein völlig anderes Protokoll.

Danke für die Rückmeldung, das hab ich tatsächlich nicht bedacht.

Fehlt da nicht ein Widerstand?

Jaein, also ich habe natürlich nicht nur die angegebene Seite als Grundlage. Und auf verschiedenen anderen Seiten werden Widerstände ab 1k-20k verwendet.
Allerdings sollte in diesem Fall die Übertragung auch ohne Widerstand funktionieren.

Tommy56

Allerdings sollte in diesem Fall die Übertragung auch ohne Widerstand funktionieren.
Das würde ich nicht unterschreiben. Du solltest Dich mal mit der Funktionsweise eines Transistors beschäftigen.
Ohne Pullup-Widerstand gibt es keinen HIGH-Pegel. Du kannst natürlich auch den internen Pullupwiderstand des Eingangs benutzen.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Stalli

Das würde ich nicht unterschreiben. Du solltest Dich mal mit der Funktionsweise eines Transistors beschäftigen.
Ohne Pullup-Widerstand gibt es keinen HIGH-Pegel. Du kannst natürlich auch den internen Pullupwiderstand des Eingangs benutzen.

Gruß Tommy
Ich habe jetzt eine andere Schaltung gefunden, mit 1k Vorwiderstand und probier diese mal aus.

Es heißt bei der "einfachen" Schaltung, dass man lediglich den Transistor beim Hochladen der Datei abdunkeln oder abziehen sollte um den HIGH-Pegel zu entgehen...

Wahrscheinlich gilt hier wie immer nicht nur auf ein Pferd setzen ;)
Aber deswegen, hab ich mir auch gedacht frag ich lieber mal in der Community nach, damit ich weitere Meinungen höre und andere Blickwinkel erkennen kann.

Stalli

Hat denn jemand ne Idee, wie ich den Input inklusive Speicherung testen kann.?
Da ich erst in gut 2-3 Wochen mit der Lieferung einer modernen Messeinrichtung rechne, welche mir der Lehrstuhl zur Verfügung stellt.

Nochmals Danke für die Hilfe, an jeden der mir bislang geantwortet hat.
Ich freue mich auf weiteren Input von Euch.

Stalli


HotSystems

#9
Jun 12, 2018, 01:49 pm Last Edit: Jun 12, 2018, 01:54 pm by HotSystems
Ich habe jetzt eine andere Schaltung gefunden, mit 1k Vorwiderstand und probier diese mal aus.

Es heißt bei der "einfachen" Schaltung, dass man lediglich den Transistor beim Hochladen der Datei abdunkeln oder abziehen sollte um den HIGH-Pegel zu entgehen...

Wahrscheinlich gilt hier wie immer nicht nur auf ein Pferd setzen ;)
Aber deswegen, hab ich mir auch gedacht frag ich lieber mal in der Community nach, damit ich weitere Meinungen höre und andere Blickwinkel erkennen kann.
Ich sehe allerdings noch nicht, wie du das Abfragen der D0 mit einem Fototransistor bewerkstelligen willst.

Ein simpler Fototransistor ist da sicher nicht ausreichend.


Edit:
OK....nochmal nachgelesen, soll doch funktionieren. Alles gut !
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

agmue

Hat denn jemand ne Idee, wie ich den Input inklusive Speicherung testen kann.?
Ich nutze dafür einen Mega2560, der hat mehrere serielle Schnittstellen. Eine hängt an USB, die anderen sind zum Testen frei. Bei Dir wäre ein Arduino mit 3,3V besser (dafür würde ich meinen Teensy nehmen).

Dann öffne ich zweimal die IDE und zweimal den seriellen Monitor und los geht das Testen.

Auch wenn Test und Realität dann nicht ganz übereinstimmen, hast Du bis dahin genug gelernt, um den letzten Dreh auch noch hinzubekommen.
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

Stalli

Bei Dir wäre ein Arduino mit 3,3V besser (dafür würde ich meinen Teensy nehmen).

Der Wemos D1 mini hat auch einen 3,3 V Ausgang...

Ich meinte mit Testen in erster Linie eine alternative Abfrage von IR-Signalen, da ich ja noch keine mMe besitze und das ganze mit einer Fernbedienung wohl nicht zu bewerkstelligen ist...

HotSystems

Der Wemos D1 mini hat auch einen 3,3 V Ausgang...

Ich meinte mit Testen in erster Linie eine alternative Abfrage von IR-Signalen, da ich ja noch keine mMe besitze und das ganze mit einer Fernbedienung wohl nicht zu bewerkstelligen ist...
Das ist ja kein übliches IR-Signal, sondern ein serielles Datensignal, welches per Licht (evtl. IR) gesendet wir.
Da musst du das entsprechende Datenprotokoll auslesen.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

agmue

#13
Jun 12, 2018, 02:56 pm Last Edit: Jun 15, 2018, 10:20 am by agmue
Ich meinte mit Testen in erster Linie eine alternative Abfrage von IR-Signalen, da ich ja noch keine mMe besitze und das ganze mit einer Fernbedienung wohl nicht zu bewerkstelligen ist...
Wenn Du einen Empfänger testen möchtest, brauchst Du auch einen Sender. Oder?

Der eine Arduino sendet, der andere empfängt. Du kannst die direkt verbinden oder eine IR-LED und einen IR-Transistor dazwischenhängen. Mit LED und Transistor spielt die Versorgungsspannung der Arduinos dann keine Rolle mehr.

PS.: Den Begriff "Arduino" verwende ich üblicherweise sehr viel weiter gefaßt, als Uwe das mag, denn ein Wemos D1 mini ist natürlich keiner, auch wenn er sich über die Arduino-IDE programmieren läßt.
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

Stalli

Servus, hab gestern mal den ganzen Tag gebastelt und einiges ausprobiert.
Zuerst habe ich anstelle des BPW40 mal einen Photowiderstand dazwischen gesetzt, um zu überprüfen ob überhaupt der Abbruch des Counters, welcher gesetzt wird, während man auf einen Input wartet. Hat funktioniert.

Anschließend habe ich geguckt ob ich überhaupt einen INPUT auf der BWP40 besitze auch dies war der Fall. Hab den Phototransistor einfach mit meiner Handytaschenlampe angestrahlt und einen einfachen Speichercode dazu geschrieben.

Nur beim Wiederzusammenführen von meinem Ausgangscode und der BWP40 hatte ich keinen Abbruch und somit keinen Input.

Was mich ein wenig stutzig macht ist natürlich, dass die Abbruch-Sequenz und somit die Input-Speicherung mit einer Photodiode funktioniert. Daher kann man ja theoretisch ausschließen, dass der Code explizit auf IR-Dateneingänge ausgelegt ist.

Go Up