Einfacher 433Mhz Receiver, Datenauswertung der eintreffenden Bits.

Hallo zusammen, habe mir einen einfachen 433Mhz AM Receiver gebastelt um Daten von einem Sensor zu empfangen. Jetzt habe ich mal mit digitalRead die Daten eingelesen und wenn der Sensor sendet merkt man dies im Bitstream. Meine Frage ist nun wie ich die Daten auswerte. Ich bekomme ja ganz viele Nullen und Einsen. Ich weiß auch wie die Daten von Sensor aussehen. Muss ich diesem Bitstream jetzt "nur" noch nach der Startsequenz des Sensordatenpakets durchsuchen, wenn ja wie?

LG

Wie sehen die Daten denn aus? Je nachdem kann die Herangehensweise unterschiedlich sein. Weisst Du auch mit welcher Geschwindigkeit die Daten anstehen sollten?

Es sind 18 bytes pro Datenpaket. Die ersten beiden Bytes sind fest, der Rest enthält Sensordaten, wie Druck, Temperatur usw. Puh gute Frage zu Geschwindigkeit, wie bekomme ich das raus?

Irgendwie müsste ich doch jetzt den Datenstrom nach den ersten beiden Bytes des Sensordatenpakets durchsuchen oder?

Liest halt erst mal alles in ein Byte Array o.ä. ein. Danach kannst du suchen und auswerten.

Könntest du den Code von deinem Receiver posten? Ich habe demnächst was ähnliches vor.

Ich sende zwischen den Werten ein Trennzeichen mit (z.b. '#') Wenn temp ein char array mit den Daten ist, funktioniert das bei mir grob so.

char delimiter[] = "#";
char *ptr;

struct  {
char *value;
} werte[5];

void parsedata()
{
byte i=0;
   ptr = strtok(*temp, delimiter);
       while(ptr != NULL) {
          free(werte[i].value);
             werte[i].value=strdup(ptr);
                        ptr = strtok(NULL, delimiter);
                             i++;
                                        }
}

In den String char arrays stehen dann die Werte getrennt zur Verfügung. Ich sehe auch einen Vorteil, wenn du später einen weiteren Wert Senden willst brauchst du an dieser Funktion nur das Array und eins vergrößern.

Funktionieren tut es bei mir so, evtl. hat Serenifly eine elegantere Lösung parat.

Habe neue Informationen bekommen. Es handelt sich um einen FSK Sender. Habe auch schon umgerüstet. Nutze diesen Receiver. http://www.conrad.de/ce/de/product/190300/Aurel-RX-4M50FM60SF-FM-Empfaengermodul-43392-MHz-Baustein-5-VDC/?ref=detview1&rt=detview1&rb=1

Es rauscht halt sehr und kann nicht viel mit dem Bitstream anfangen. Was muss denn bei FSK noch beachtet werden, muss ich da nich irgendwas demodulieren oder macht das der Empfänger? Kennt ihr außer RF22 weitere Libraries für den FSK empfang?

Wie funktioniert die Datenübertragung im allgemeinen? Habe den Data-Pin des Empfängerin mit dem PIN2 des Arduino verbunden. Der Receiver überträgt wohl mit 3Khz, der Arduino ist doch viel schneller, wie synchronisiert man das denn?

Bei meinem Projekt verwende ich diese Lib http://www.pjrc.com/teensy/td_libs_VirtualWire.html

http://www.instructables.com/id/RF-315433-MHz-Transmitter-receiver-Module-and-Ardu/step3/Arduino-Virtual-Wire-Library/

Verwende auch die in diesem Beispiel benutzten Sender/Empfänger

Hi, Virtual Wire unterstütz aber soweit ich weiß nur ASK.

unicum: Hi, Virtual Wire unterstütz aber soweit ich weiß nur ASK.

Ok, stimmt wohl. Asche auf mein Haupt

rudirabbit: Funktionieren tut es bei mir so, evtl. hat Serenifly eine elegantere Lösung parat.

Nein. strtok() ist wohl das effizienteste um Strings zu splitten. Höchstens wenn man gleichzeitig in Zahlen wandeln will. Dann haben strtol() und strtod() auch die Funktionalität von strtok() (genaugenommen strtok_r()), wenn man den "endptr" Parameter verwendet. Das macht den Code etwas kleiner, ist aber nicht unbedingt nötig.

Man sollte sich halt darüber klar sein, dass strdup() malloc() macht. Aber solange man immer schön free() macht passt es.

Wenn die Länge der Teil-Strings bekannt ist, kann auch auf dynamischen Speicher verzichten und ein multi-dimensionales Array anlegen. Oder man wandelt die Teil-Strings gleich in Integer um (mit atoi() oder strtol()). Gerade wenn es hier um Sensor-Daten geht bietet sich das an. sscanf() ist u.U. auch eine Option wenn das Format immer gleich ist und man Integer extrahieren will. Geht aber nicht mit floats. Das hängt dann von der Anwendung ab und was da wirklich drin steht. Eventuell muss man die Strings nämlich gar nicht abspeichern.

Ein struct nur aus einem char* ist aber etwas unsinnig. Ein Array aus char* tut es auch :)

Serenifly:
Ein struct nur aus einem char* ist aber etwas unsinnig. Ein Array aus char* tut es auch :slight_smile:

Bin halt auch noch ein fast Anfänger, struct macht hier wirklich keinen Sinn. :.

Es rauscht halt sehr und kann nicht viel mit dem Bitstream anfangen. Was muss denn bei FSK noch beachtet werden, muss ich da nich irgendwas demodulieren oder macht das der Empfänger? Kennt ihr außer RF22 weitere Libraries für den FSK empfang?

Bei Virtual Wire wird dies wohl von der Lib übernommen, wenn Pakete kommen sind diese auch korrekt.
Mit FSK Sendern bzw. der Qualität der Lib’s habe ich keine Erfahrung.

Und was für einen Sender handelt es sich denn, klingt für mich eher so, das du auf die Software der Senderseite keinen Zugriff hast bzw. das Protokoll unbekannt ist ?

Es handelt sich um diesen Senderhttp://www.infineon.com/dgdl/TDK5110F_DS_V1.1.pdf?folderId=db3a30431689f4420116a096e1db033e&fileId=db3a3043191a246301192e38307a2b7d
Ich kenne das Protokoll nicht. Muss ich da was demodulieren? Mir scheint es ja das der Empfänger keinen Demodulator hat.

Hallo zusammen, habe wieder etwas Zeit gefunden, um das Projekt voranzutreiben. Ich werde wohl um eine Protokollanalyse nicht herumkommen. Habt ihr eine gute Anleitung wo gezeigt wird wie das gemacht wird. Habe folgendes nachgebaut http://davehouston.org/learn.htm. Habe dazu den oben genannten Sender von Aurel genommen. Ich bekomme ich Loop recorder nun ein Rauschen angezeigt. Wie mache ich jetzt weiter,wenn der Sender was sendet, scheint sich in den Aufzeichnungen nichts zu ändern.

Ich bin auf der Suche nach Tutorial, Blogeinträgen, etc., wo erklärt wird mit man eine FSK-Protokollanalyse macht.