Pages: 1 [2]   Go Down
Author Topic: 433 Mhz Receiver + Tchibo Wetterstation + Logic Analyzer  (Read 8496 times)
0 Members and 1 Guest are viewing this topic.
Germany
Offline Offline
Edison Member
*
Karma: 44
Posts: 2261
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich habe mal ein bisschen in der Bildbearbeitung gespielt. Wie man sieht, kommen 2,5 Datenpakete an, die es zu dekodieren gilt. Da habe ich wenig zwar Erfahrung, aber es wäre günstig, wenn du uns die Randbedingungen nennen könntest und auch unterschiedliche Datensätze liefern könntest bei unterschiedlichen Temperaturen zum Beispiel. Erst dann kann man Rückschlüsse ziehen, welche Bereiche zur Adressierung des Sensors gehören und welche nutzbare Übertragungsdaten sind.


* index.png (1.27 KB, 730x112 - viewed 61 times.)
Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Munich, Germany
Offline Offline
Newbie
*
Karma: 0
Posts: 32
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Danke sth77, das ist schon mal wieder neue Info für mich.

Kann man jetzt davon ausgehen, dass jedes High eine 1 ist und jedes Low eine 0? Und kann ich die Abstände ignorieren oder gibt es doppelte Abstände für zwei gleiche Bits?
Offenbar sind die zwei ganzen Datensätze ja identisch, oder?
Muss man da jetzt noch diese Manchester Codierung beachten oder sind das schon thermometerdaten in reinform?

Ach sooo viele Fragen. Will lernen. Danke!
Logged

Germany
Offline Offline
Edison Member
*
Karma: 44
Posts: 2261
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Wie gesagt, das ist schon Reverse Engineering. Aus einem Datensatz bekommt man das nicht heraus.
Du brauchst mindestens 2, unterschiedliche Messungen mit dem gleichen Sensor bei unterschiedlichen Temperaturen, die du dann auch mit den auf dem Display dargestellten Werten abgleichen musst. Das "ca. 27°" hilft hier nicht viel.

Ich vermute eine Startsequenz durch diese einzelne Peek mit der darauffolgenden Pause, dann einen Adressierungsbereich und die Nutzdaten. Da das Signal so schön getaktet aussieht, könnte man das so interpretieren, dass jedes Peek für eine 1 steht, jedes nichtvorhandene für eine 0. Aber wie gesagt, alles Mutmaßungen, wie das so ist beim Reverse Engineering...

Also bitte mehr Daten! smiley-grin
Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Munich, Germany
Offline Offline
Newbie
*
Karma: 0
Posts: 32
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Also, hier jetzt mal ein paar Daten:

dahinter steht immer Temp / Luftfeuchte

000000110010101100111001100001001110010111 30,8 / 53
000000110010101001110101100010001110010011 29,6 / 50
000000110010100111110101100010001110010001 29,5 / 49
000000110010100101110101100001001100011010 29,4 / 49
000000110010100000110101100000001100100001 29,1 / 48
000000110001100110100001100001010010101001 25,0 / 65
000000110001101011100001100001010010100001 25,2 / 65
000000110001101100100001100010010010101111 25,3 / 65
000000110001101101100001100001010010100110 25,3 / 65 (25,4 / 65)
000000110001100000100101100000010010101001 25,6 / 64

Bei dem einen Ausreißer ist das Thermometer beim Ablesen umgesprungen. Ich kann nicht sagen, welcher der beiden Werte richtig ist. Da diese Reihe sich von der vorherigen unterscheidet, vermute ich den Klammerwert.

Wie bin ich an die Binärdaten gekommen? So:

Code:
boolean sbit=false;

void setup() {
  Serial.begin(115200);
  Serial.println("go!");
  pinMode(2, INPUT);
}

void loop() {
  unsigned long LowVal=pulseIn(2,LOW);
  unsigned long LowVal2=pulseIn(2,LOW);

  if (LowVal > 7000 && LowVal2 > 7000) {
    sbit=true;
  }
  if (sbit== true) {
    // Es geht los!
    // startbit zurücksetzen
    sbit=false;
    for(unsigned int j=0; j<42; j++) {
      LowVal=pulseIn(2,LOW);
      if (LowVal < 3200) {
        Serial.print(0);
      } else if(LowVal >= 3200 && LowVal < 7000) {
        Serial.print(1);
      }
    }
    Serial.println("");
  }
}

Wenn ich dann den Tx-Button gedrückt habe, kammen immer 5 oder 6x die gleichen Zahlenfolgen schnell hintereinander. Also scheine ich den Startcode gefunden zu haben.
Wie komme ich auf den Wert 42? Wenn ich mir die Zeiten ausgeben lasse, erscheinen 42 Zeiten zwischen zwei Startblöcken. Daher vermute ich 42 Bits.

Jetzt weiß ich nicht mehr weiter.

ich habe noch diese Seite entdeckt, aber was er da für Daten hat, deckt sich nicht mit meinen.

http://hobbyelektronik.org/w/index.php?title=Tchibo_Wetterstation

Ich habe ja 42 Bits, er hat 32.

Das Modell der Wetterstation von ihm ist wohl ein älteres, vom Aufbau vermute ich aber, sie sind sich sehr ähnlich. Das Design ist schon fast gleich.

Ach ja, ich habe noch eine Parallelmessung gemacht mit Arduino und Bus Pirate Logic Analyzer. Und wenn ich - analog zu der Webseite oben - die kurzen Abstände als 0 werte und die langen als 1, dann kommt mit Abzählen an der Logic-Grafik das gleiche raus, wie aus meinem Arduino Programm. Von daher scheint mein Programm zu funktionieren.

Nachtrag:

Jetzt habe ich den LogicAnalyzer mal direkt an den DataPin beim Sender und gleichzeitig am DataPin des Conrad Empfängers gehängt und eine Runde laufen lassen.
Man sieht, der Arduino empfängt genau das, was der Tchibo sendet (siehe Bildanhang, die Werte: 28,2°C und 53% Feuchte).


* Bildschirmfoto 2012-08-25 um 21.47.55.png (13.87 KB, 1850x107 - viewed 56 times.)
« Last Edit: August 25, 2012, 02:50:51 pm by Zickendoktor » Logged

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

Ist zwar leicht OT aber vielleicht trotzdem eine nützliche Info: In dem Datenblatt meines 433 MHz Receivers stand beim Antennenpin: ANT (about 13 cm). Daher habe ich einen 13cm langen Draht über einem Bleistift gerollt und an den Pin angeschlossen - mit dem Effekt, dass sich die Signalqualität enorm verbessert hat. Inzwischen bekomme ich mind. noch 4 Thermometer von irgendwelchen Nachbarn rein und meine eigenen empfange ich alle Problemlos (auch das aus dem Garten, wo die Batterie fast runter ist - ohne Antenne bekam ich da nie ein Signal).
Logged

Munich, Germany
Offline Offline
Newbie
*
Karma: 0
Posts: 32
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Keiner hier, der fließend Binär spricht...  smiley-cry  smiley
Logged

Munich, Germany
Offline Offline
Newbie
*
Karma: 0
Posts: 32
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

* PUSH *

Sorry, Leute, ich hoffe bei dem schlechten Wetter sitzen ein paar mehr vor ihren Kisten!

Ich komme hier nicht weiter. Kann mir jemand bei der decodierung der Binärdaten helfen?

Danke vorab!

Marc
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 49
Posts: 2756
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Binär ist nicht das Problem, eher das dechiffrieren  smiley-wink

Deine Tabelle in # 18 scheint nicht so einfach zu sein, 42 Bit ist auch eine krumme Zahl, und für 2 Analoge Messwerte ziemlich viel.
Da sind bestimmt Adressinfo ( immer konstant ) und irgendwelche Prüfbits drin...

Hast du eigentlich mal überprüft, ob deine Anzeigewerte ( Temp / Feuchte ) und das Bitmuster immer 1:1 übereinstimmen ?
Oder hast du verschiedene Bitmuster mit den gleichen Anzeigewerten (Wandeln int -> float und Runden in der Anzeige-Einheit ? )
Wie oft wird eigentlich gesendet, hängt ein neuer Datensatz und Umspringen der Anzeige überhupt direkt zusammen?

Zum Mastermind Spielen sind es noch etwas wenig Daten, leider kannst du die Anzeige-Ergebnisse nicht direkt mitprotokollieren sondern musst das von Hand notieren.

 
Logged

Munich, Germany
Offline Offline
Newbie
*
Karma: 0
Posts: 32
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok, dann werde ich nochmal die Tage mehr Werte notieren und deine Fragen beobachten.
Ich Push den Thread dann wieder.

Danke dir.

Marc
Logged

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 236
Posts: 20285
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ja es braucht entschieden mehr Daten wo einer der beiden Werte öfters vorkommt.
Grüße Uwe
« Last Edit: September 01, 2012, 12:33:14 pm by uwefed » Logged

Cologne
Offline Offline
Sr. Member
****
Karma: 7
Posts: 475
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich habe da mal eine Theorie, ob die passt, müsste mit mehr Messdaten verifiziert werden
Ich teile die Daten aus den Messungen oben mal anders auf

000000 1100 1010     0111 1101     0110       0010 0011          1001 0001 29,5 / 49       
000000 1100 1010     0101 1101     0110       0001 0011          0001 1010 29,4 / 49
000000 1100 1010     0000 1101     0110       0000 0011          0010 0001 29,1 / 48  
000000 1100 0110     0110 1000     0110       0001 0100          1010 1001 25,0 / 65
000000 1100 0110     1011 1000     0110       0001 0100          1010 0001 25,2 / 65  
000000 1100 0110     1100 1000     0110       0010 0100          1010 1111 25,3 / 65
000000 1100 0110     0000 1001     0110       0000 0100          1010 1001 25,6 / 64  
000000 1100 0110     1100 1000     0110       0010 0100          1010 1111 25,3 / 65
000000 1100 0110     1101 1000     0110       0001 0100          1010 0110 25,3 / 65 (25,4 / 65)
000000 1100 0110     0000 1001     0110       0000 0100          1010 1001 25,6 / 64

Ich bin mir sicher, dass das 4. Datenpaket aus 8Bit für die Feuchte steht und zwar mit low Nibble zuerst. Allerdings müssten dann auch ein paar Ablesefehler dabei sein.
In der ersten Zeile wird also aus 0010 0011 -> 00110010 => dezimal 50, zweite Zeile wäre damit korrekt mit 49, die dritte korrekt mit 48.
In der 4. Zeile wird aus 0001 0100 -> 01000001 =>  dezimal 65, passt also auch. 5. Zeile wäre dann allerdings 66. 64 stimmt dann wieder in der nächsten Zeile.

Bei der Temperatur bin ich mir sicher, dass das 2. Paket für die beiden niederwertigen Nibbles steht, wobei 18Bit 1°C ausmachen würden. Hier auch wieder zuerst das niederwertige Nibble. Vermutlich steht das 3. Paket dann für das höchstwertige Nibble, zumindest passt das von der Differenz. Daraus ergäbe sich ein Offset von 67.77777 .
Also für die erste Zeile: aus  0111 1101 0110 ->   011011010111 -> dezimal 1751-> 1751 / 18 - 67.77777 = 29.5
4. Zeile:   aus 0110 1000 0110  ->  011010000110  ->  dezimal 1670 -> 1670 / 18 - 67.77777 = 25.0      passt !!
 
Ob diese Theorie passt, müsste man jetzt mit mehr Messwerten belegen. Interessant wären auch mal negative Temperaturen.

                                    
« Last Edit: January 02, 2013, 03:34:17 pm by erni-berni » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Probier auch mal den leicht modifizierten Tchibo-Sketch:
... gekürzt ...
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).


wenn ich das programm unter 1.0.5 starte bekomme ich nach ziemlichem warten einen launch4j error und der java-prozess bleibt hängen.
hinweis: alle andern ino's laufen

mit arduino.exe --l4j-debug erhalte ich folgendes (wenig aussagendes) log (winXP/32)
CmdLine:   C:\Program Files\Arduino\arduino.exe --l4j-debug
WOW64:      no
Working dir:   C:\Program Files\Arduino\.
Bundled JRE:   java
Check launcher:   C:\Program Files\Arduino\java\bin\javaw.exe (OK)
Add classpath:   lib\pde.jar
Add classpath:   lib\core.jar
Add classpath:   lib\jna.jar
Add classpath:   lib\ecj.jar
Add classpath:   lib\RXTXcomm.jar
Launcher:   C:\Program Files\Arduino\java\bin\javaw.exe
Launcher args:   -Xms128m -Xmx128m -classpath "lib;C:\Program Files\Arduino\java\lib\tools.jar;lib\pde.jar;lib\core.jar;lib\jna.jar;lib\ecj.jar;lib\RXTXcomm.jar" processing.app.Base
Args length:   164/32768 chars
Exit code:   259

die ide startet und wenn ich das program aus dem forum reinpaste und kompilliere erhalte ich bei
    if (bitstream == '1') {
folgende fehlermeldungen.
sketch_jun30a.ino: In function 'float decodeTemp(String)':
sketch_jun30a:48: error: invalid conversion from 'char' to 'const char*'
sketch_jun30a:48: error: initializing argument 1 of 'unsigned char String::operator==(const char*) const'
sketch_jun30a:53: error: invalid conversion from 'char' to 'const char*'
sketch_jun30a:53: error: initializing argument 1 of 'unsigned char String::operator==(const char*) const'


ich wäre froh, wenn ihr mir bei diesen 2 problemen (startup-error & kompile-fehler) weiterhelfen könntet.   vielen dank!

p.s. hintergrund der ganzen aktion: ich möchte die EUROCHRON aussensensoren (Conrad) via arduino lesen und weiterverarbeiten können
« Last Edit: June 30, 2013, 05:37:19 am by ursm » Logged

Pages: 1 [2]   Go Up
Jump to: