Pages: [1] 2 3 ... 5   Go Down
Author Topic: Tchibo Wetterstation 433 MHz - Dekodierung mal ganz einfach  (Read 21177 times)
0 Members and 1 Guest are viewing this topic.
Cologne
Offline Offline
God Member
*****
Karma: 11
Posts: 513
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,
nachdem ich mir bei eB** einige günstige 433MHz Sender und Empfänger beschafft hatte, wollte ich natürlich was sinnvolles damit anfangen.
Zu Tchibo Wetterstationen gab es ja schon einige Beiträge und die Autoren haben ja teilweise graue Haare bekommen, wenn's um die Dekodierung des Datenstroms ging.
Dass es auch anders sein kann, möchte ich mit diesem Beitrag zeigen.
Ich habe bei mir eine Tchibo Wetterstation im Einsatz, die schon einige Jahre auf dem Buckel hat. Die Artikelnummer ist TCM 218943. Der Außensensor sendet seine Daten auf 433 MHz. Beim Test der besagten Receiver hatte ich schon den Datenstrom des Außensensors "gesehen" und wollte mir den dann mal näher ansehen.
Als ersten Schritt habe ich das Signal des Receivers über einen 10k Widerstand und einen 1uF Kondensator auf den Mikrofoneingang der Soundkarte gelegt und mit Audacity aufgezeichnet (s. Screenshot). Da immer 36 Pausen zwischen kurzen HIGH-Pulsen übertragen werden, habe ich angenommen, dass kurze Pause eine "1" sind und lange Pause eine "0". Um das Ergebnis vorwegzunehmen, es war genau umgekehrt.
Nachdem ich dann einige Datenströme mit unterschiedlichen Temperatur und Feuchtewerten aufgezeichnet hatte, fand ich schnell raus, welche Nibbles für Temperatur und welche für Feuchte stehen.
Die letzten 12 Bits des Datenstroms stehen für die Temperatur und die 8 Bit davor für die Feuchte. Bei negativen Temperaturen sind die ersten 4 Bits der Temperatur "1111".
Die ersten 8 Bits stehen vermutlich für die Kennung des Außensensors.
Hier ein Beispiel:  
11101011 00000000 00111101 000000010001
Kennung                      Feuchte     Temperatur
Die Werte sind einfach aus dem Byte herzuleiten, also hier
Feuchte  00111101 = 16 (also 16%)
Temperatur  0000 00010001  = 17 (also +1.7°)      

Natürlich wär ich hier im falschen Forum, wenn ich das Signal nicht auch per Software verarbeiten wollte, hier der Code.
Der Ausgang des Receivers liegt auf dem Interrupt 0, also Digital 2. Der Interrupt wird durch die fallenden Flanken getriggert und die Zeit zwischen den Flanken wird ausgewertet.
Das Programm ist recht überschaubar und kann auch leicht auf andere Pulslängen adaptiert werden. Für Anregungen, wie man das besser programmieren kann, bin ich natürlich dankbar.                    
Code:
#define PINA 2
#define INTERRUPT 0  // that is, pin 2
volatile unsigned long EdgeTime;   // zur Speicherung der Zeit
unsigned long LastEdgeTime=0;
unsigned long DiffEdgeTime=0;
unsigned long LastMillis;
unsigned int Counter;
unsigned long Sequenz, OldSequenz;
unsigned int BitCount, ByteCount, SeqCounter;
volatile boolean BitSet;

// Interrupt Service Routine for a falling edge
void isr ()
{
  if (!BitSet) {
    EdgeTime=micros();
    BitSet=true;
  }
}  // end of isr

void setup ()
{
  attachInterrupt (INTERRUPT, isr, FALLING);   // interrupt 0 is pin 2
  Serial.begin(115200);
}

void loop ()
{
  while(millis()-LastMillis < 5000)  {    // jede 5 Sekunden Status
    if (BitSet) {
      DiffEdgeTime = EdgeTime-LastEdgeTime;    
      if (DiffEdgeTime > 800)  {        // alles kleiner ist Fehler
        if (DiffEdgeTime>8000 && DiffEdgeTime<8500)  {   // Synchronisationpuls
           Counter=0;
           Sequenz=0;
        }
        else if (DiffEdgeTime>1800  && DiffEdgeTime<2300) {
          Sequenz <<= 1;
          Sequenz |= 1;               // eine 1 von rechts rein
          Counter++;
        }
        else if (DiffEdgeTime>900 && DiffEdgeTime<1300) {
          Sequenz <<= 1;                  // eine 0 von rechts rein
          Counter++;
        }
       if (Counter==8 && Sequenz!= B11111011) {  // Sensor Kennung
           Counter=0;
           Sequenz=0;
       }
       if (Counter==36) {
         if (OldSequenz==Sequenz) {    
           SeqCounter++;  // Anzahl gleicher Sequenzen in Folge
         }
         else {
           SeqCounter=1;
         }
         OldSequenz=Sequenz;
         Serial.print("SeqC ");
         Serial.print(SeqCounter);        
         Serial.print("  ");
         Serial.print(Sequenz,BIN);
         Serial.print("  ");
         if (Sequenz& 0x0F00) {   // negative Werte
           Serial.print("-");
           Serial.print(Sequenz & 0xFF);
         }
         Serial.print(Sequenz & 0xFF);   // Temp
         Serial.print("  ");
         Sequenz >>= 12;
         Serial.println(Sequenz & 0xFF);  // Feuchte
         Counter=0;
         Sequenz=0;
       }
      }
      LastEdgeTime=EdgeTime;
      BitSet=false;
    }  
  }
  LastMillis=millis();
  Serial.println("*");
}
 
  

Gruß
Reinhard
  


* Tchibo1.png (29.89 KB, 1595x430 - viewed 451 times.)
« Last Edit: December 10, 2012, 05:38:52 pm by erni-berni » Logged

Hamburg
Offline Offline
Jr. Member
**
Karma: 0
Posts: 66
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wahnsinn! Danke für den lehrreichen Post! Werde mir mal so einen "Sender" besorgen und schauen ob ich die Daten auch dem Netzwerk zur Verfügung stellen kann.
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 59
Posts: 3071
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Feuchte  00111101 = 16 (also 16%)
Hab ich nicht verstanden, ( meinst du 61 % ?)
     sonst aber : Toll !!!

Logged

Cologne
Offline Offline
God Member
*****
Karma: 11
Posts: 513
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Feuchte  00111101 = 16 (also 16%)
Hab ich nicht verstanden, ( meinst du 61 % ?)
     sonst aber : Toll !!!


Ja, danke - gut aufgepasst. Es muss natürlich 61 heißen.
Logged

Cologne
Offline Offline
God Member
*****
Karma: 11
Posts: 513
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,
jetzt haben wir negative Temperaturen und dadurch habe ich einen Fehler in der Ausgabe gemerkt.
Ich poste mal die entscheidenden Zeilen, die geändert werden müssen.
Code:
         if (Sequenz& 0x0F00) {   // negative Werte
           Serial.print(int((Sequenz & 0xFFF)|0xF000));
         }
         else {
         Serial.print(Sequenz & 0xFF);   // Temp
         }
 
Die Umwandlung in Integer hätte man sicher auch eleganter lösen können, aber ich wollte jetzt nicht zuviel ändern.
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 59
Posts: 3071
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Die letzten 12 Bits des Datenstroms stehen für die Temperatur ... Bei negativen Temperaturen sind die ersten 4 Bits der Temperatur "1111".
Ich frage mich warum 4 bit für das Vorzeichen verschwendet werden sollten.
Bist du sicher, dass es nicht einfach eine vorzeichenbehaftete 12 bit - Zahl ist ?
Der Wertebereich wäre dann deutlich größer: statt +-25.6 wären  -204.8 ... 204.7 °C übertragbar.
Das ist natürlich -besonders im negativen Bereich- schwer zu testen.
Aber, ich fürchte, dein Code zeigt noch einen Fehler im nächsten Sommer, oder wenn du einen Fön zum Testen über 25 °C nimmst.

Code:
int16_t temp = Sequenz & 0x0FFF ;
if (temp & 0x800) temp |= 0xF000; // negativ: Vorzeichenbit setzen
Serial.print (temp);

P.S. Erstaunlich, dass so viel Logik ( Skalierung ) schon im Aussenfühler-Sender steckt. Ist nirgends eine Celsius/Fahrenheit Umschaltung vorgesehen ?
Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 172
Posts: 3243
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Aber, ich fürchte, dein Code zeigt noch einen Fehler im nächsten Sommer, oder wenn du einen Fön zum Testen über 25 °C nimmst.

Einmal wurde der Code bereits vom Thread-Starter selbst korrigiert, eine weitere Ungereimtheit bei sommerlichen Temperaturen von michael_x aufgedeckt.

Soviel also zum Thema "mal ganz einfach".
;-)

Wie lauten doch noch die ersten drei Murphy-Gesetze:
1. Nichts ist so einfach wie es scheint.
2. Alles dauert länger als Du denkst.
3. Wenn irgendwas schiefgehen kann, wird es auch schiefgehen.

Happy decoding!

BTW: Lidl hat diese Woche ein "AURIOL Funk-Wetterstationsset" als Sonderposten für 49,95 mit Außensensoren auch für Regenmenge und Windgeschwindigkeit. Die Funksensoren scheinen auch auf 433 MHz zu laufen. Leider ohne Datenspeicher, ohne PC-Auswertemöglichkeit und erst Recht ohne Internetanschluss. Ich überlege, ob ich mir eine solche Wetterstation holen und mir selbst zu Weihnachten schenken soll, um mit einem Arduino, einem Ethernet-Shield und einem China-433MHz-Receiver die Decodierung und Umrüstung zur "PC-Wetterstation mit Internetanschluss" probieren soll.
Logged

Cologne
Offline Offline
God Member
*****
Karma: 11
Posts: 513
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo michael_x
du hast vollkommen Recht. Die Temperatur ist eine vorzeichenbehaftete 12Bit Zahl, irgendwie war ich wohl irritiert wegen der 12 Bit.
Dein Code Schnipsel ist perfekt.
Inzwischen habe ich weitere Erkenntnisse sammeln können, ich fasse mal alles zusammen.
Beispiel für die 36 Bit:
          01100010 10010000  00100011  000011011101
Bit     1               9               17              25                  36  
Bit 1-8 ist Sensor-Kennung, die sich zufällig bei jedem Batteriewechsel ändert
Bit 9 Low Bat Kennzeichnung
Bit 12 auf der Rückseite des Sensors wurde der TX Button gedrückt, damit registriert die Basisstation diesen Sensor als neuen Sensor. Bit ist für eine Sendung=28x36 Bit gesetzt
Bit 17-24  Feuchte
Bit 25-36  Temperatur als vorzeichenbehaftete 12Bit Zahl

Der Sensor hat die Möglichkeit der Umschaltung von °C nach Fahrenheit. Das verändert aber nur die Anzeige auf dem Display des Sensors, die Datenübertragung ist immer in °C
Im nachfolgenden Programm habe ich den Test der Sensorkennung entfernt und die Ausgabe ein wenig besser formatiert. Bei der Darstellung in Binärform werden die führenden Nullen natürlich nicht mit ausgegeben. So sieht dann die Ausgabe aus:
Code:
*
*
*
SeqC 1  100110010000000  100011  11011011  219  35
SeqC 2  100110010000000  100011  11011011  219  35
SeqC 3  100110010000000  100011  11011011  219  35
SeqC 4  100110010000000  100011  11011011  219  35
SeqC 5  100110010000000  100011  11011011  219  35
SeqC 6  100110010000000  100011  11011011  219  35
SeqC 7  100110010000000  100011  11011011  219  35
SeqC 8  100110010000000  100011  11011011  219  35
SeqC 9  100110010000000  100011  11011011  219  35
SeqC 10  100110010000000  100011  11011011  219  35
SeqC 11  100110010000000  100011  11011011  219  35
SeqC 12  100110010000000  100011  11011011  219  35
SeqC 13  100110010000000  100011  11011011  219  35
SeqC 14  100110010000000  100011  11011011  219  35
SeqC 15  100110010000000  100011  11011011  219  35
SeqC 16  100110010000000  100011  11011011  219  35
SeqC 17  100110010000000  100011  11011011  219  35
SeqC 18  100110010000000  100011  11011011  219  35
SeqC 19  100110010000000  100011  11011011  219  35
SeqC 20  100110010000000  100011  11011011  219  35
SeqC 21  100110010000000  100011  11011011  219  35
SeqC 22  100110010000000  100011  11011011  219  35
SeqC 23  100110010000000  100011  11011011  219  35
SeqC 24  100110010000000  100011  11011011  219  35
SeqC 25  100110010000000  100011  11011011  219  35
SeqC 26  100110010000000  100011  11011011  219  35
SeqC 27  100110010000000  100011  11011011  219  35
SeqC 28  100110010000000  100011  11011011  219  35
*
SeqC 1  1110110110010  10010000  11000000  192  144
*
*
In diesem Beispiel wurden die 28 Datensätze alle richtig erkannt. Danach wurde einmal ein Datensatz gefunden, der sich nicht wiederholte und damit vom Programm als fehlerhaft verworfen wird. In den meisten Fällen werden 26-28 aufeinander folgende Datensätze erkannt. Vielleicht wird das schlechter, wenn die Entfernung zum Sensor größer wird.
Hier nochmal der veränderte Code
Code:
#define PINA 2
#define INTERRUPT 0  // that is, pin 2
volatile unsigned long EdgeTime;   // zur Speicherung der Zeit
unsigned long LastEdgeTime=0;
unsigned long DiffEdgeTime=0;
unsigned long LastMillis;
unsigned int Counter;
unsigned long OldSequenz;
long Sequenz, Temp;
unsigned int BitCount, ByteCount, SeqCounter, Kennung;
volatile boolean BitSet;

// Interrupt Service Routine for a falling edge
void isr ()
{
  if (!BitSet) {
    EdgeTime=micros();
    BitSet=true;
  }
}  // end of isr

void setup ()
{
  attachInterrupt (INTERRUPT, isr, FALLING);   // interrupt 0 is pin 2
  Serial.begin(115200);
}

void loop ()
{
  while(millis()-LastMillis < 5000)  {    // jede 5 Sekunden Status
    if (BitSet) {
      DiffEdgeTime = EdgeTime-LastEdgeTime;    
      if (DiffEdgeTime > 800)  {        // alles kleiner ist Fehler
        if (DiffEdgeTime>8000 && DiffEdgeTime<8500)  {   // Synchronisationpuls
           Counter=0;
           Sequenz=0;
        }
        else if (DiffEdgeTime>1800  && DiffEdgeTime<2300) {
          Sequenz <<= 1;
          Sequenz |= 1;               // eine 1 von rechts rein
          Counter++;
        }
        else if (DiffEdgeTime>900 && DiffEdgeTime<1300) {
          Sequenz <<= 1;                  // eine 0 von rechts rein
          Counter++;
        }
/*       if (Counter==8 && Sequenz!= B11000101) {  // Sensor Kennung
           Counter=0;
           Sequenz=0;
       }*/
       if (Counter==16) Kennung=Sequenz;    // SensorKennung
       if (Counter==36) {
         if (OldSequenz==Sequenz) {    
           SeqCounter++;  // Anzahl gleicher Sequenzen in Folge
         }
         else {
           SeqCounter=1;
         }
         OldSequenz=Sequenz;
         Serial.print("SeqC ");
         Serial.print(SeqCounter);        
         Serial.print("  ");
         Serial.print(Kennung,BIN);
         Serial.print("  ");
         Serial.print((Sequenz&0xFF000)>>12,BIN);
         Serial.print("  ");
         Serial.print((Sequenz&0x00FFF),BIN);
         Serial.print("  ");
         Temp = Sequenz & 0x0FFF;
         if (Sequenz & 0x0800) {   // negative Werte
           Temp |= 0xF000;     // Vorzeichen zur Ausgabe setzen für 16Bit INT
         }
         Serial.print(Temp);
         Serial.print("  ");
         Sequenz >>= 12;
         Serial.println(Sequenz & 0xFF);  // Feuchte
         Counter=0;
         Sequenz=0;
       }
      }
      LastEdgeTime=EdgeTime;
      BitSet=false;
    }  
  }
  LastMillis=millis();
  Serial.println("*");
}
Dieses Programm ist ja gedacht zum Debuggen. Der nächste Schritt wird jetzt sein, Temperatur und Feuchte auf LCD anzuzeigen oder auf eine SD Karte zu loggen.
Leider scheint dieser Sensor nicht mehr erhältlich zu sein. Ich häng mal ein Foto an.
Nachtrag: Ich hab gerade mal den Sensor in den Gefrierschrank gelegt. Wenn man Glück hat kommen 4 Datensätze in Folge ohne Fehler an.


* TCM218943.jpg (531.95 KB, 3072x2304 - viewed 271 times.)
Logged

Cologne
Offline Offline
God Member
*****
Karma: 11
Posts: 513
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Soviel also zum Thema "mal ganz einfach".
;-)

Wie lauten doch noch die ersten drei Murphy-Gesetze:
1. Nichts ist so einfach wie es scheint.
2. Alles dauert länger als Du denkst.
3. Wenn irgendwas schiefgehen kann, wird es auch schiefgehen.
Na ja, im Vergleich zu anderen Dokodierversuchen, wo hier im Forum gemeinsam lange orakelt wurde, war das doch wirklich einfach.
Und ohne Murphy ist alles hur halb so lustig.
Bin mal gespannt, ob sich die Lidl Station dekodieren lässt.
Gruss
« Last Edit: December 12, 2012, 03:02:54 pm by erni-berni » Logged

Cologne
Offline Offline
God Member
*****
Karma: 11
Posts: 513
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Danke Murphy!
Statt
Code:
long Sequenz, Temp;   
muss es richtig heissen
Code:
long Sequenz;
int Temp;   


Logged

Germany
Offline Offline
Faraday Member
**
Karma: 59
Posts: 3071
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wenn schon, tut auch nichts zur Sache, aber schöner wäre:

unsigned long Sequenz;

Übrigens, ich finde, dank deines sehr guten Ansatzes, war die Dekodierung wirklich "mal ganz einfach".
Glückwunsch ernie-bernie
Logged

0
Offline Offline
Full Member
***
Karma: 8
Posts: 153
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

das sind ja recht gute Anregungen. Ich hab heute erstmal mit dem Audacity das Bild der Aldi Außensensoren aufgenommen.
Das ist ja ein Problem, was noch ungelöst bei mir rumliegt. Die Sensoren senden dreimal hintereinander gleiche Datenpakete,
da müssten die letzten beiden mit sicherheit dekodierbar sein. Falls ich Erfolge habe, melde ich mich, wenn nicht, auch.

Gruss Kalli
Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 172
Posts: 3243
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

das sind ja recht gute Anregungen. Ich hab heute erstmal mit dem Audacity das Bild der Aldi Außensensoren aufgenommen.
Das ist ja ein Problem, was noch ungelöst bei mir rumliegt. Die Sensoren senden dreimal hintereinander gleiche Datenpakete,
da müssten die letzten beiden mit sicherheit dekodierbar sein.

Ja, sicherlich. Mit entsprechend Gehirnschmalz dürfte es machbar sein, wenn man die Bits erstmal auslesen kann.

"Kryptographisch verschlüsselt" sind die Bits in den Funkdaten wohl nicht, sondern nur "codiert".

Ich habe mich auch noch mal etwas näher informiert, und zumindest die ganz einfachen 433-MHz-Module der billigsten Funk-Thermometer und Funk-Wetterstationen scheinen alle nach demselben Grundschema mit ASK/OOK (Amplitudenmoduliertes Signal mit ON/OFF-Tastung) zu arbeiten. Und dabei immer dasselbe Sendeschema zu haben, dass zu LOW Pulsen verschiedener Länge am Empfänger führt. Es gibt quasi Bits mit drei verschiedenen Längen:

1. Start-Bit ==> Ein besonders langer StartPuls zu Beginn eines Datenpakets
2. Daten 1-Bit ==> Ein deutlich kürzerer Impuls (ca. 1/4 der Länge eines Start-Bit)
3. Daten 0-Bit ==> Ein nochmals kürzerer Impuls (ca. halbe Länge eines 1-Bit)

Und das nicht nur beim Tchibo-Funkthermometer, sondern bei fast allen billigen 433-MHz Funkthermometern und Funkwetterstationen.

Bei einem Controller-Takt von 16 MHz und einer Datenbitrate von höchstens 10 KBit/s frage ich mich, ob man sich die Auswertung von Sendeimpulsen am Oszilloskop oder per Soundkartenaufnahme nicht sparen kann, wenn man einfach einen Arduino-Sketch schreibt, zur Analyse und Vorab-Auswertung, der einem einfach Daten ausgibt wie:

- Datenpaket erkannt
- Startbitlänge xxxx Mikrosekunden
- Anzahl der Datenbits im Paket: xy
- Länge eines 0-Bits: xxx Mikrosekunden
- Länge eines 1-Bits: yyy Mikrosekunden
- Erkannte Bitfolge: 00100010100111...

Wenn man von so einer Vorauswertung per Arduino-Sketch dann schon ohne viel Aufwand die richtigen Längen für Startbit, 0-Bit, 1-Bit und die Anzahl der Bits in den Datenpaketen automatisch bekommen hat, kann man gleich mit einem speziellen Auswerteprogramm zur Auswertung der Bits weitermachen.

Solche ein bequemes Wettersensor-Vorauswertungsprogramm gibt es wohl noch nicht, wenn zum Dekodieren üblicherweise mit Bildern vom Oszilloskop oder von einem Soundkarten-Aufnahmeprogramm angefangen wird, oder?
Logged

Cologne
Offline Offline
God Member
*****
Karma: 11
Posts: 513
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo jurs,
wenn du mein Programm in diesem Beitrag auf die Biterkennung reduzierst, macht es genau das, was du beschrieben hast.
Worauf stützt du deine Darstellung, dass die Kodierung immer so läuft bei den billigen Stationen?
Ich finde den ersten Einstieg über die Soundkarte gar nicht so schlecht, da weiß man zumindest schon mal, was man zu erwarten hat.
Die Zeiten kann man dann sehr einfach über ein Programm messen, dass eigentlich für IR Fernbedienungen gedacht ist. http://playground.arduino.cc/Code/InfraredReceivers. Einfach statt des IR-Empfänger einen 433 MHz Empfänger anschließen.
Wenn man die Zeiten dann in mein Programm nimmt, ist man schon fast am Ziel. Jetzt muss man nur noch die Bits zuordnen.

@Kalli: stell doch mal einen Screenshot von deiner Audacity Messung an deinem Sensor hier rein.

Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 172
Posts: 3243
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Worauf stützt du deine Darstellung, dass die Kodierung immer so läuft bei den billigen Stationen?

Immer wohl nicht.
Aber ganz, ganz oft.

Ich habe hier im Haus nun schon drei 433MHz-Funksensoren rausgekramt, die alle nach demselben Schema senden:
- ein gaaaanz langes Startbit, danach kommt ein Datenpaket aus mehreren kürzeren Bits, und zwar
- 1-Bits mit bestimmter Länge (deutlich kürzer als das Start-Bit) und
- meist halb so langen 0-Bits

Allerdings gibt es Unterschiede zwischen den Sensoren:
Verschiedene Startbitlänge, verschiedene 1-Bit Länge, verschiedene 0-Bit Länge, und verschieden viele Bits in einem Datenpaket.

Und wenn man nur mit Try-and-Error herumprobiert, ist das eine mühsame Angelegenheit, die Startbitlänge, 1-Bit-Länge, 0-Bit-Länge und Anzahl der Datenbits im Paket herauszubekommen. Dafür hätte ich gerne einen Sketch, der das automatisch ermittelt und rauswirft, was so an Funk herumschwirrt.

wenn du mein Programm in diesem Beitrag auf die Biterkennung reduzierst, macht es genau das, was du beschrieben hast.

Nicht so ganz, Deinem Programm muß ich ja wenigstens ungefähr die Startbitlänge, 0-Bit Länge und 1-Bit Länge vorgeben, sonst wird das mit der Biterkennung nichts. Das sind ja Werte, in denen sich die Sensoren gerade unterscheiden. Und die Timings der Bits würde ich gerne direkt, ohne Umweg über Soundkarte oder Oszilloskop ermitteln, nur mit dem Arduino.

Ich finde den ersten Einstieg über die Soundkarte gar nicht so schlecht, da weiß man zumindest schon mal, was man zu erwarten hat.

Tja, da muss man dann wohl zu Anfang mit loslegen, wenn man seinen Sensor mit "bekannten" Timingwerten anderer Sensoren (Tchibo und Co.) nicht im Datenstrom identifizieren kann. Diese billigen 433-MHz Empfänger empfangen ja immer irgend etwas, selbst wenn sie nichts empfangen. In den Empfangspausen drehen die intern immer die Empfangsempfindlichkeit so weit auf, bis sie Rauschen empfangen - und dann ist das Rauschen auf dem Datenausgang. Und man selbst steht vor dem Problem zu erkennen: Was ist Rauschen - was sind die Nutzdaten eines Funk-Sensors?
Logged

Pages: [1] 2 3 ... 5   Go Up
Jump to: