Go Down

Topic: 433 Mhz Receiver + Tchibo Wetterstation + Logic Analyzer (Read 10 times) previous topic - next topic

mwyraz

Probier auch mal den leicht modifizierten Tchibo-Sketch:
Quote

/*
  Liest dieses komische Tchibo-Wetterdingens per 433MhZ aus.
*/

boolean cnt=false;
int reader=0;
int cnter=0;
const int msgLeng=36;
char reading[msgLeng];
void setup() {
  Serial.begin(115200);
  Serial.println("go!");
  pinMode(2, INPUT);
  pinMode(13,OUTPUT);
}

void loop() {
    int LowVal=pulseIn(2,LOW);
    if (LowVal < 11000) {  // Kuezer als 1100ms Low ? Koennte unserer Sensor sein
      if (decodeTime(LowVal) == 'S') {  // Startsequenz ?
        cnt=true;                       // Dann go fuer die Sammlung
        cnter=0;                        // BitCounter auf 0
      }
      if ( (cnter<msgLeng) && cnt && ((decodeTime(LowVal) == '0') || (decodeTime(LowVal)=='1'))) { // Stream noch nicht voll und ein Bit erkannt ?
       Serial.print(decodeTime(LowVal));
       reading[cnter]=decodeTime(LowVal);  // Ab ins Array damit
       cnter=cnter+1;                      // Arraycounter fuers naechste Bit inkrementieren
      }
    } else {
      cnt=false;                           // Zurueck auf Anfang - nix fuer uns.
    }

      if ((cnter==msgLeng)) {                   // Arrray Voll ?
        Serial.print('/');
        Serial.print(reading);
        Serial.print('/');
        Serial.println(decodeTemp(reading));
        cnter=0;
        cnt=false;
      }
  
}

float decodeTemp(String bitstream) {  // Versucht aus dem Bitstrom die Temp. zu berechnen
  int x=0;
  int chk=0;
  for (int i=16;i<24;i++) {      // Extrahiert das Byte zwischen Bit 16 und 24 und packt es als integer in "x"
    if (bitstream == '1') {
      bitSet(x,(23-i));
    }
  }
  for (int i=4;i<15;i++) {      // Kenner aus den 3 Nibbles zwischen Bit 4 und 15 holen (koennte auch der Kanal sein ?)
    if (bitstream == '1') {
      bitSet(chk,(14-i));
    }
  }
/*  if (chk != 136) {            // Kenner = 136 ? Dann ist es unserer Sensor !
    return(-999);              // Wenn nicht, dann -999 zurueck
  } else*/ {
    return ((float)x/10);
  }
}

char decodeTime(int time){  // Wandelt die Pulse in Bits um.
  if (time > 1500 && time < 11000) { // passendes Signal (zwischen 150ms und 11000ms) ?
        if (time < 2500) {           // kleiner 250ms ? Dann LOW
          return '0';
        } 
        if (time < 5000 && time >3000) {  // Zwischen 500ms und 1000ms dann HIGH
          return '1';
        }
        if (time >8000) {                // Groesser 800ms dann Startsequenz !
          return 'S';
        }
  } else {
    return 'X';
  }  
}



Setzte msgLeng dazu mal wieder auf 28. Bei mir sind es 36 Bits aber die letzten 8 ergeben keinen Sinn - macht also auch 26 Bit verwertbare Daten. Die decodeTime Methode funktioniert nicht für mein Thermometer aber immer wenn ich auf "TX" am Thermometer drücke kommt immer 3x die gleiche Bit-Sequenz. Die ersten 14 Bits sind bei mir konstant. Die nächsten 2 kodieren den Kanal. Danach folgen 12 Bit, die die Temperatur als signed integer kodieren (muss man durch 10 Teilen, dann hat man die Temperatur mit 1 Nachkommastelle).




markbee

Der Bus Pirate ist aber eigtl. kein Logicanalyzer. Dazu nimmt man den Open Bench Logic Sniffer aus gleichem Hause. Mit dem funktioniert das wunderbar.

Zickendoktor

Wie du richtig schreibst: eigentlich. Aber für diesen Zweck könnte er reichen und nützlich sein.
Keiner hier, der mir helfen kann, die Grafik zu interpretieren? Es gibt keine Anleitung im großen Internet, die einem das erklärt.
Ich weiß, dass es High und Low gibt und dass es 1 und 0 bedeutet. Aber ist der Abstand dazwischen auch wichtig? Wie erkennt man zwei gleiche Bits in Folge? Ist meine Messung überhaupt sinnvoll?
Das würde mir sehr weiterhelfen.

markbee

Womit hast Du denn die .olp-Datei erstellt? Mit einem entsprechendem Programm könnte man die ja vielleicht öffnen. Mit meiner OLS-Software für den OBLS geht das z.B. nicht.

Auf dem jpeg sieht man ja einen Ausschnitt der Daten, das reicht aber nicht zum Interpretieren. Da müsste ein ganzes Datenpaket zu erkennen sein. Auch die Samplefrequenz müsste u.U. deutlich schneller sein, da würde ich mal ein wenig herumprobieren.
Das Akquirieren und Interpretieren von solchen Daten ist meistens nicht ganz trivial. Daher ist es am einfachsten, wenn man weiß, wonach man suchen muss (bestimmte Temperatur- bzw. andere Messwerte) und das ganze noch in einem eng abgegrenzten Datenpaket sichtbar ist. Die 433-MHz-Funkdaten sind häufig Manchester-codiert, kommen in mehreren, gleichen Paketen hintereinander und zwischendruch gibt es dann auch immer mal wieder Datenbursts z.B. für ein Statuspaket o.ä. Also wirklich nicht ganz simpel. Wenn es dann noch codiert ist...

Eine Möglichkeit, um sich in das ganze einzuarbeiten wäre, sich erstmal andere, bekannte Signale (z.B. serielle Daten vom Arduino) sauber einzulesen, anzuschauen und zu deuten. Dann bekommt man auch ein Gefühl für die Triggereinstellungen und die Frequenz etc. Dann probiert man das gleiche mit dem I²C oder SPI-Bus.

Zickendoktor

Danke markbee, das ist schon mal ein netter Anfang.

Die Olp Datei habe ich damit erstellt:

http://www.lxtreme.nl/ols/

Damit sollte man die auch wieder einlesen können.

Die Temp. müsste zum Messzeitpunkt ca. 27 Grad gewesen sein.

Dann werde ich heute/morgen mal weiter testen.

Ich glaube mehr als diese Datenmenge kann ich nicht sampeln, das bringt der Bus pirate nicht :-)

Go Up