Störsignale wegen Funkempfänger

Hallo an alle Forummitglieder

Ich habe folgende Herusforderung:

Dieser Datensatz lese ich alle 10Sekunden aus:

14:35:50.972 -> 0-0:1.0.0(22030a143508W)
14:35:50.972 -> 0-0:96.1.1(3230333830333738)
14:35:50.972 -> 1-0:1.8.1(003364.100*kWh)
14:35:50.972 -> 1-0:1.8.2(001231.929*kWh)
14:35:50.972 -> 1-0:2.8.1(007386.923*kWh)
14:35:50.972 -> 1-0:2.8.2(000052.716*kWh)
14:35:50.972 -> 1-0:32.7.0(236.4*V)
14:35:51.006 -> 1-0:52.7.0(241.7*V)
14:35:51.006 -> 1-0:72.7.0(241.1*V)
14:35:51.006 -> 1-0:31.7.0(006*A)
14:35:51.006 -> 1-0:51.7.0(005*A)
14:35:51.006 -> 1-0:71.7.0(005*A)
14:35:51.006 -> 1-0:2.7.0(01.086*kW)
14:35:51.006 -> 1-0:1.7.0()
14:35:51.006 -> !00A2

Sobald ich aber diesen Sender und Empfänger anschliesse (https://de.aliexpress.com/item/32651427149.html?gatewayAdapt=glo2deu&spm=a2g0o.order_list.0.0.21ef5c5fUVBxFR), wird der Datensatz, wie folgt, gestört:

14:34:50.989 -> 1-0:1.7.0()
14:34:50.989 -> !DAD1
14:35:00.951 -> /ELS5
14:35:00.986 -> 
14:35:00.986 -> 1-3:0.2.8(50)C!n⸮Ҋr⸮r⸮B⸮⸮0307143425G)
14:35:00.986 -> j0:⸮r⸮r⸮@⸮⸮⸮⸮⸮⸮⸮⸮30333a38)
14:35:00.986 -> LKҊr⸮r⸮⸮⸮`3364.100⸮⸮+⸮H(h⸮Ҋr⸮r~⸮⸮⸮⸮r⸮⸮⸮RZ]⸮⸮
1-0:2.8.1(00738.910*k+⸮H1-Ғr⸮r⸮B⸮⸮⸮⸮⸮⸮r⸮⸮2RZ]⸮⸮
14:35:00.986 -> 1-0:00.7⸮0(>36.3*֔@⸮j⸮Ҫ⸮r⸮r⸮B41.M%U⸮⸮1-0:72.⸮	B⸮~⸮P⸮Jn
14:35:00.986 -> 1-0:31.7.B⸮⸮⸮R
14:35:00.986 -> ⸮
14:35:00.986 -> 1-0:51.7.0(005&A)
14:35:00.986 -> 1⸮0:71.7.0(005*A)
14:35:00.986 -> 1-0:2.7.0(01.092*kW)
14:35:00.986 -> LKҊ.7.0()
14:35:00.986 -> !220F

Interessant ist, dass die Störung nur auftritt, wenn der Receiver eine Zeitlang kein Signal empfangen hat. Wenn ich regelmässig Funksignale sende(ca. jede Sekunde) , tritt der Fehler nicht auf.

Hier noch den Sketch:

#include <AltSoftSerial.h>

AltSoftSerial altSerial;

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

void setup() {
 Serial.begin(115200);
  // Transmitter is connected to Arduino Pin #10  
  mySwitch.enableTransmit(3);
  
  // Optional set pulse length.
  // mySwitch.setPulseLength(320);
  mySwitch.enableReceive(0);  // Empfänger ist an Interrupt-Pin "0" - Das ist am UNO der Pin2
 pinMode(LED_BUILTIN, OUTPUT);
 
  Serial.println("AltSoftSerial Test Begin");
  altSerial.begin(115200);
  altSerial.println("Hello World");
}

void loop() {

   char c;

  if (Serial.available()) {
    c = Serial.read();
    altSerial.print(c);
  }
  if (altSerial.available()) {
    c = altSerial.read();
    Serial.print(c);
    }
if (mySwitch.available()) // Wenn ein Code Empfangen wird...
  {
  int value = mySwitch.getReceivedValue(); // Empfangene Daten werden unter der Variable "value" gespeichert.
      Serial.print("Empfangen: ");
      Serial.println( value );
        if (value == 5800)   //Verarbeitung: Wenn der Arduino die Zahl "5678" empfängt, dann... 
        {   //Programmabschnitt des IF-Befehls öffnen.
        mySwitch.switchOn('a', 1, 1);
        }  
         if (value == 5796) 
    {
      mySwitch.switchOff('a', 1, 1);
    }
    mySwitch.resetAvailable(); // Hier wird der Empfänger "resettet"
  } 
  }

Habt Ihr Ideen, wie das lösen könnte?
Besten Dank und Grüße

Anschlussschema:
Eigenverbrauch_Steckplatine.pdf (676,0 KB)

Schau die markierten Zeilen an - das kann nichts werden.

Inwiefern denkst du, dass sich diese Zeilen auf das Auslesen des Datensatzes auswirkt?
Ich habe folgende Zeilen gelöscht. Der Fehler im Datensatz bleibt trotzdem bestehen.

Ich habe den Verdacht, dass der Receiver elektronische Störsignale sendet.

Bei der Beschreibung der Bibliothek AltSoftSerial finde ich Hinweise auf mögliche Beeinflussungen durch andere Bibliotheken. Wäre auch eine Möglichkeit.

2 Likes

Da war ich auch grad schaun. Liegt ggfls. am Timer1 der da mitbenutzt wird...

PS: schönes Logo - ging das nicht übereinander?

@stiago2
Womit empfängst du denn deinen Datensatz ?
Per Funk oder wie ?
Vermutlich wird der Datensatz durch den IRQ am RCSwitch gestört.

Das Prolem taucht nur auf, wenn gleichzeitig
Receiver und Transmitter angeschlossen sind. Wenn ich einen von beiden abklemme, ist der Datensatz wieder i.o..

Über eine DSMR Schnittstelle

Ok, also nur per Kabel.
Dann solltest du verhindern, dass die Schnittstelle zu den Funkmodulen während des lesens der seriellen. Angesprochen wird. Also nicht ständig RCSwitch auslesen.

Kann man das zum Beispiel so schreiben?

if (mySwitch.available() && -!Serial.available())

Ich würde es einfacher lösen und einen Timer verwenden.
Dieser liest alle 10 sek. deine Daten ein und in der übrigen Zeit wird RCSwitch aktiviert.

Mit deinem Beispiel ist der IRQ weiterhin "aktiv".

Eventuell könntest Du auch eine andere Hardware mit zweiter HardwareSerial verwenden.

Zum Beispiel so?

#include <AltSoftSerial.h>

AltSoftSerial altSerial;

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

unsigned long Timer = 0; 

.....

  if (altSerial.available()) {
    c = altSerial.read();
    Serial.print(c);
    **Timer = millis();** 
    }
if (mySwitch.available() && **(millis() - Timer <= 9000)**) // Wenn ein Code Empfangen wird...
  {
  int value = mySwitch.getReceivedValue(); // Empfangene Daten werden unter der Variable "value" gespeichert.
      Serial.print("Empfangen: ");
      Serial.println( value );
        if (value == 5800)   //Verarbeitung: Wenn der Arduino die Zahl "5678" empfängt, dann... 
        {   //Programmabschnitt des IF-Befehls öffnen.
        mySwitch.switchOn('a', 1, 1);
        }  
         if (value == 5796) 
    {
      mySwitch.switchOff('a', 1, 1);
    }
    mySwitch.resetAvailable(); // Hier wird der Empfänger "resettet"
  } 
  }

Zwei Arduinos parallel? Verstehe ich das richtig?

Wäre auch möglich, ich meinte aber beispielsweise einen Mega2560 mit drei seriellen Schnittstellen in Hardware:

Die Pins 14 bis 19 sind unabhängig von USB.

Ist nur ein Beispiel von mehreren :slightly_smiling_face:

1 Like

Das könnte funktionieren.
Ich meinte es aber z.B. so:

Timer alles 10 sek. > serielle abfragen, dazwischen die RCSwitch abfragen.

Oder

If (AltSerial.available).....
// coder der Abfrage und auswertung.
else
if (RCSwitch.available)
// coder der Funkabfrage

Sorry, bin nicht am PC, daher so kryptisch.

Das habe ich versucht. hat nicht geklappt

Geht es auch etwas genauer ?
Wie soll da jemand helfen.

Wenn ich

mySwitch.enableReceive(0);

lösche, kommt der Datensatz gut.

Wie wäre es mit:

if (millis() - Timer <= 9000){
mySwitch.enableReceive(0);

Aber wie kann ich das nach >9000 wieder aufheben?
Was ist das gegenteil von mySwitch.enableReceive(0);?

Es waren die selben Fehler im Datensatz wie zu Beginn beschrieben.