Forum: HF, Funk und Felder 433Mhz Funksignal von FB decodieren


von Mathias K. (matzeknu)


Angehängte Dateien:

Lesenswert?

Guten Morgen zusammen,

ich habe mit einem 433Mhz Empfänger am Mikrofoneingang das angehängte 
Signal aufgenommen, es stammt von einer FB für Funksteckdosen.

In einem anderen Thread wurde ich schon darauf hingewiesen das es sich 
dabei um Manchester-Codierung handelt.

Mein Ziel ist es, später mit einem Arduino sowohl die Signale zu senden, 
also Steckdosen zu steuern, als auch Signale zu empfangen um im 
Ptrogramm darauf zu reagieren.

So nun zum ersten Schritt, ich möchte das Signal erstmal von hand 
decodieren. Komme aber nicht auf die Bitabfolge. Nach Manchester komme 
ich auf folgendes: "1101001001101101101101101101101" - richtig?
Funktioniert aber nicht.
oder ist das erste Signal evt ein synchronisationsbit oder sowas (weil 
da ja so eine Art Überschwinger drinnen ist)?


Des weiteren möchte ich später auch Signale von der FB empfangen und im 
Programm dann reagieren, weiß aber ehrlich gesagt nicht wie ein solches 
Programm aussieht um Manchester zu dekodieren. (hab schon libs für 
arduino ausprobiert, ohne erfolg)

weiß jemand zufällig etwas oder hatte schon ähnliche Probleme?

: Bearbeitet durch User
von Mathias K. (matzeknu)


Lesenswert?

es tut mir sehr leid, ich glaub ich habs jetz :D

Beitrag von 2012(von einem Gase-Matze)..
mit nur "0" und "1" kommt man nicht aus.. man braucht auch noch was zum 
unterscheiden von lang high und lang low.. hier mal sein code mit dem er 
es gemacht hat.

Senden sollte also nun klappen, wie kann ich denn die empfangenen 
Signale verarbeiten? also ich bekomm das signal ja auf mein Eingang und 
muss dann irgendwie ein byte damit beschreiben.. hab da schon ne Idee 
sorry wenn ich hier das board vollmüll..


#define RF_DATA_PIN 8
#define CLOCK 875

void rf_send(char command[]) {
  int i;
  // send command (on/off)
  for(i=0;i<66;i++) {

    if(command[i] == '1')
    {
      digitalWrite(RF_DATA_PIN, HIGH);
      delayMicroseconds(CLOCK);
      digitalWrite(RF_DATA_PIN, LOW);
      delayMicroseconds(CLOCK);
    }

    if(command[i] == '0')
    {
      digitalWrite(RF_DATA_PIN, LOW);
      delayMicroseconds(CLOCK);
      digitalWrite(RF_DATA_PIN, HIGH);
      delayMicroseconds(CLOCK);
    }

    if(command[i] == 'h')
    {
      digitalWrite(RF_DATA_PIN, LOW);
      delayMicroseconds(2*CLOCK);
    }

    if(command[i] == 'l')
    {
      digitalWrite(RF_DATA_PIN, HIGH);
      delayMicroseconds(2*CLOCK);
    }
    Serial.println(command[i]);

  }
}

void setup()
{

  pinMode(RF_DATA_PIN, OUTPUT);

}

void loop(){

  rf_send("lllll10001011000000lll101100010lll101110101lllhhhhhhhhhhhhhhhhh
hhh");
  rf_send("lllll10001011000000lll101100010lll101110101lllhhhhhhhhhhhhhhhhh
hhh");
  delay(30000);


}

von Jürgen S. (jurs)


Lesenswert?

Mathias K. schrieb:
> Senden sollte also nun klappen, wie kann ich denn die empfangenen
> Signale verarbeiten? also ich bekomm das signal ja auf mein Eingang und
> muss dann irgendwie ein byte damit beschreiben.. hab da schon ne Idee
> sorry wenn ich hier das board vollmüll..
>
>
> #define RF_DATA_PIN 8
> #define CLOCK 875

Wenn ich das Signal in Deinem oben gezeigten Bild "per Auge" auswerte, 
komme ich auf ein Clock von ca. 700 Mikrosekunden.

Die langen Zeiten sehen für mich ungefähr doppelt so lang aus wie die 
kurzen, und zwischen 1.860s und 1.8705s liegen demzufolge 10,5 
Millisekunden = 10500 Mikrosekunden bei 5 langen und 5 kurzen Impulsen = 
15*Clock.

10500/15 = 700 µs

Zur Auswertung würde ich eine Interrupt-Behandlungsroutine schreiben, 
die auf Flankenwechsel (CHANGE) am Pin reagiert.

Und innerhalb der ISR dann die HIGH- bzw. LOW-Zeiten ermitteln, die dann 
in Bits umgesetzt werden, z.B. nach dem Schema:
Dauer zwischen den Flankenwechseln 700 +/-200 µs ==> 0-Bit
Dauer zwischen den Flankenwechseln 1400 +/-200 µs ==> 1-Bit
alle anderen Dauern ==> Error

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.