433 MHz Funkthermometer decodieren

Jomelo:
Die Feuchtigkeit bekomme ich noch nicht heraus.
Kannst du da auch mal ein oder zwei Reihen an 0..1.. online Stellen, die mehr als 30 % Feuchtigkeit besitzen ?

Hier die Reihe für 16,9° bei 39%:

000001101001011101100011111110000010000

Könnte das passen?

0000 1111 = +???
0110 1001 = 9
1001 0110 = 6
0111 1000 = 1

0110 1001 = 9
0011 1100 = 3

1111 0000 = ?
1000 0111 = ?
0010 1101 = ?
000 111 = ?

Demnach ist
20,2° 23% 000010111111101100111011111110101111000

0000 1111 = +?
1011 0100 = 2
1111 0000 = 0
1011 0100 = 2

0011 1100 = 3
1011 0100 = 2

1111 0000 = ?
1010 0101 = ?
1111 0000 = ?
000 111 = ?

Was die Werte mit ? sind: keine Ahnung. Das Thermomometer zeigt nur Temp. und Feucht. an. Vieleicht Kanal oder sowas?!

markbee:
Welches Funkthermometer hast Du denn überhaupt?

markbee

Ditte hier:

Baumarkt für 9,90 EURO.

DE8MSH:
Hier die Reihe für 16,9° bei 39%:

000001101001011101100011111110000010000

Könnte das passen?

0000 1111 = +???
0110 1001 = 9
1001 0110 = 6
0111 1000 = 1

0110 1001 = 9
0011 1100 = 3

1111 0000 = ?
1000 0111 = ?
0010 1101 = ?
000 111 = ?

Demnach ist
20,2° 23% 000010111111101100111011111110101111000

0000 1111 = +?
1011 0100 = 2
1111 0000 = 0
1011 0100 = 2

0011 1100 = 3
1011 0100 = 2

1111 0000 = ?
1010 0101 = ?
1111 0000 = ?
000 111 = ?

Was die Werte mit ? sind: keine Ahnung. Das Thermomometer zeigt nur Temp. und Feucht. an. Vieleicht Kanal oder sowas?!

Für die restlichen Bits können:
Anfangs und Endschleife
eine Prüfsumme
eine Seriennummer des Sensors.
Viele Grüße Uwe

Hi Uwe,

ja. Dass könnte sein. Am Ende scheint immer die 7 zu kommen... VIeleicht so eine Art Endesignal. Übringens habe ich ca. 13x 0 am Anfang der Aussendung weggelassen. Das scheint auch immer der Fall zu sein.

Hi,
meine Antwort ist auch schon etwas später:

Deine Rechnung stimmt nicht ganz.

z.B der Zahlenwert ist 1, dann berechnet man das wie folgt zurück.

1 = 0001

Der Wert muss dann erst gespiegelt werden, also einfach umdrehen, damit das niedrigste Bit in dem 4er Block als erstes gesendet wird.

0001 => 1000

Dieser Wert wird dann anschließend invertiert somit erhalten wir

0111

Nun zur Darstellung der 39
Die Kette sieht ja so aus, die Buchstaben darunter erklär ich gleich insofern ich diese verstanden habe
0000 | 0110 | 1001 | 0111 | 0110 | 0011 | 1111 | 1000 | 0010 | 000
a b c d e f g h i j

a: Ist vermutlich das Vorzeichen der Temperatur, wenn das Termometer auch negative Zahlen anzeigen kann
Ansonsten dient die 0000 wohl als steuer Signal, bzw leitet
b: Ist die Nachkommastelle, in diesem Beispiel oben ergibt sich die wie folgt:
0110
1001 inventieren
1001 Wert umdrehen, macht hier keinen Sinn da beide Seiten gleich aussehen
1001 => 9
c: Ziffer 1 der Temperatur
1001
0110 inventieren
0110 Wert umdrehen, macht auch hier keinen Sinn da beide Seiten gleich sind
0110 => 6
d: Ziffer 2 der Temperatur
0111
1000 inventieren
0001 Wert umdrehen, damit der Zahlenwert raus kommt
0001 => 1
e: Ziffer 1 der Luftfeuchtigkeit (passt aber nicht immer, mehr dazu unten)
0110
1001 inventieren
1001 vertauschen
1001 => 9
f: Ziffer 2 der Luftfeuchtigkeit (passt leider auch nicht immer, mehr dazu weiter unten)
0011
1100 inventieren
0011 vertauschen
0011 => 3
g: Diese Reihe dient als Steuer Signal um mitzuteilen das die Daten nun gesendet wurden
h + i: Da bei jeder Übertragung die Zahl anders ist, vermute ich mal das hier ein Counter mit läuft, der die Anzahl der Übertragungen überwacht oder aber ein Key für Irgendwas, aber es handelt sich nicht um Nutzdaten, da die Werte zu weit auseinander liegen. Ein Muster kann ich hier nicht erkennen. Es könnte auch die Prüfsumme sein um zu überprüfen ob die Übertragenen Bits Richtig sind.
j: 000 scheint mir das End Signal der Übertragung zu sein.

So nun nochmal zu den Werten für die Luftfeuchtigkeit.
Bei 23% und bei 39% passen die Werte. Aber bei 20% nicht, da muss man nochmal mehr Werte überprüfen oder ob das bei allen geraden zehner Zahlen (10, 20, 30, ...) der Fall ist.
Wenn man den Wert von 20% aus den vier Beispielen decodiert erhält man immer 19%.

Vielleicht hilft es auch wenn noch mehr Werte bereitgestellt werden. Dann kann man mehr ausschließen oder noch andere Überlegungen machen. Interessant wäre es auch mal eine Luftfeuchtigkeit von 19% darzustellen um festzustellen ob dann auch 20% ausgegeben werden :wink:

Ein Gott bin ich nicht, aber Logik ist schön :wink:

Gruß
Jomelo

Hi Jomelo,

ich habe bei meinen Berechnungen den visuellen Schritt des Spiegelns weggelassen :slight_smile: D.h. Du hast den Code geknackt. Vieleicht bekommen wir ja noch die Prüsummenroutine heraus... Auf jeden Fall danke, danke, danke für die serh schnelle Hilfe!!!

Jetzt zurück zur Technik. Ich muss ja nun die Werte mit dem Ardu auslesen. Ich habe ein 433 MHz Empfangsmodul liegen, welches ich dazu nehmen will.

Habe ermittelt, dass

vor Bitreihe 37ms Low kommt
und 0 = 24ms High + 25 ms Low ist,
und 1 = 20ms High + 23ms Low ist.

Um nicht invertieren zu müssen kann ich auch

1 = 24ms High + 25 ms Low
0 = 20ms High + 23ms Low

annehmen.

Gibt es eine schleue Routine wie ich die Bitreichen zu weiteren Verarbeitung nun seriell einlese? Muss ich pulseIn() benutzen?

Meine Idee zum Biteinlesen: ich messe High, un wenn es auf Low springt messe ich die Dauer von Low.
Sehr Lang = Beginn,
Kurz = 1,
Lang = 0.

Gure Idee? Oder gibt's schon gebackenes?

Jomelo:
So nun nochmal zu den Werten für die Luftfeuchtigkeit.
Bei 23% und bei 39% passen die Werte. Aber bei 20% nicht, da muss man nochmal mehr Werte überprüfen oder ob das bei allen geraden zehner Zahlen (10, 20, 30, ...) der Fall ist.
Wenn man den Wert von 20% aus den vier Beispielen decodiert erhält man immer 19%.

Öhm, Du hast Recht. Entweder ich habe die Werte falsch abgeschrieben oder irgendwo ist noch ein Witz drinnen... Ich versuche nochmal mehr Reihen zu loggen. Wäre schön, wenn ich das schon mit dem Ardu machen könnte :slight_smile: Derzeit mache ich es nämlich mit Audacity (ja, DEM TTL Analyseprogramm schlecht hin :slight_smile: :slight_smile: :)).

N'Abend.

Nachdem ich von Jomelo sehr gute Tipps bekommen habe zu den Bits, die das Funkthermometer auspuckt, habe ich mit diesem Code

#define _Whole_Data_length    116

int pin = 2;
byte tempten;
byte tempone;
byte tempcom;
byte humiten;
byte humione;
byte valuepos=0;
byte bitpos=0;
byte bitcounter=1;
byte array_pos=0;
unsigned long duration;
int whole_array[_Whole_Data_length];   

void setup()
{
  pinMode(pin, INPUT);ten
    Serial.begin(9600);
    Serial.println("Give it to me...");
    delay(2#define _Array_dimension       2000);
}

void loop()
{
  duration = pulseIn(pin, HIGH);
  if ((duration>600)&&(duration<1000)) {
    whole_array[array_pos] = 1;    
    array_pos++;
  }
  if ((duration>1200)&&(duration<4000)){
    whole_array[array_pos] = 0;   
    array_pos++;
  }
  
  if (array_pos>=_Whole_Data_length) {
        for (int valuepos=22;valuepos<=25;valuepos++) {
          bitWrite(tempten, bitpos, whole_array[valuepos]);
          bitpos++;
        }
        bitpos=0;
 
        for (int valuepos=26;valuepos<=29;valuepos++) {
          bitWrite(tempone, bitpos, whole_array[valuepos]);
          bitpos++;
        }
        bitpos=0;

        for (int valuepos=30;valuepos<=33;valuepos++) {
          bitWrite(tempcom, bitpos, whole_array[valuepos]);
          bitpos++;
        }
        bitpos=0;

        for (int valuepos=34;valuepos<=37;valuepos++) {
          bitWrite(humiten, bitpos, whole_array[valuepos]);
          bitpos++;
        }
        bitpos=0;        

        for (int valuepos=38;valuepos<=41;valuepos++) {
          bitWrite(humione, bitpos, whole_array[valuepos]);
          bitpos++;
        }
        bitpos=0;        

        Serial.print("Es sind ");   
        Serial.print(tempcom,DEC);    
        Serial.print(tempone,DEC);
        Serial.print(",");
        Serial.print(tempten,DEC);
        Serial.print(" Grad Celsius bei ");
        Serial.print(humione,DEC);    
        Serial.print(humiten,DEC);
        Serial.println(" Prozent Feutigkeit.");        
        array_pos=0;
  }
}

das hier im SM herausbekommen:

Give it to me...
Es sind 24,5 Grad Celsius bei 23 Prozent Feutigkeit.
Es sind 24,5 Grad Celsius bei 23 Prozent Feutigkeit.
Es sind 24,5 Grad Celsius bei 23 Prozent Feutigkeit.
Es sind 24,5 Grad Celsius bei 23 Prozent Feutigkeit.
Es sind 24,4 Grad Celsius bei 24 Prozent Feutigkeit.
Es sind 24,4 Grad Celsius bei 24 Prozent Feutigkeit.
Es sind 24,3 Grad Celsius bei 24 Prozent Feutigkeit.
Es sind 24,3 Grad Celsius bei 24 Prozent Feutigkeit.
Es sind 24,3 Grad Celsius bei 24 Prozent Feutigkeit.
Es sind 24,3 Grad Celsius bei 24 Prozent Feutigkeit.
Es sind 24,2 Grad Celsius bei 24 Prozent Feutigkeit.
Es sind 24,2 Grad Celsius bei 24 Prozent Feutigkeit.
Es sind 24,2 Grad Celsius bei 24 Prozent Feutigkeit.
Es sind 24,1 Grad Celsius bei 24 Prozent Feutigkeit.
Es sind 24,1 Grad Celsius bei 24 Prozent Feutigkeit.
Es sind 24,1 Grad Celsius bei 25 Prozent Feutigkeit.
Es sind 24,1 Grad Celsius bei 25 Prozent Feutigkeit.
Es sind 24,0 Grad Celsius bei 25 Prozent Feutigkeit.
Es sind 24,0 Grad Celsius bei 25 Prozent Feutigkeit.
Es sind 24,0 Grad Celsius bei 25 Prozent Feutigkeit.
Es sind 23,9 Grad Celsius bei 27 Prozent Feutigkeit.
Es sind 23,9 Grad Celsius bei 27 Prozent Feutigkeit.
Es sind 23,9 Grad Celsius bei 27 Prozent Feutigkeit.
Es sind 23,9 Grad Celsius bei 27 Prozent Feutigkeit.
Es sind 23,9 Grad Celsius bei 27 Prozent Feutigkeit.
Es sind 23,8 Grad Celsius bei 27 Prozent Feutigkeit.
Es sind 23,8 Grad Celsius bei 28 Prozent Feutigkeit.
Es sind 23,8 Grad Celsius bei 28 Prozent Feutigkeit.
Es sind 23,8 Grad Celsius bei 28 Prozent Feutigkeit.
Es sind 23,8 Grad Celsius bei 28 Prozent Feutigkeit.
Es sind 23,7 Grad Celsius bei 28 Prozent Feutigkeit.

Ich denke, da kann man nicht schimpfen :slight_smile: Allerdings findet im Moment keinerlei Check auf Fehler statt. Klar bei dem Q'N'D Code oben :smiley:

Danke, danke, danke nochmal an Dich, Jomelo, für Deine Unterstützung!

Todo's sind noch:

  • SD Card implementieren
  • Ausgabe auf Display
  • Fehlercheck / oder herausfinden, was die letzten 12 BIT nach Temp. und Feucht. bedeuten...
  • Umwandelt von Bit in Dezimal in eine Funktion bauen.

Darf ich hier auch mal 2 BCD=>DEC und DEC=>BCD reinwerfen

Und bei der FEUTIGKEIT sollte man aufpassen das die Brille nicht beschlägt und man evtl ein paar Bucstabn vergisst :wink:

byte decToBcd(byte val)
{
  return ((val/10)<<4)+(val%10);
}

// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return ((val>>4)*10)+val%16;
}

Sitz mal so einen Meter vom Bildschirm entfernt. Dann fehlen keine Buchstaben :smiley: :smiley: :smiley:

Und: danke für die Wandler. Werde ich mal testen. Aber nicht jetzt. Bin müde :sleeping:

Wenn du wieder was zum Rätseln hast, dann her damit ... :wink:

Hey DE8MSH,
haste mal ein paar Infos bezüglich deiner Hardware die du verwendest?

Bedankt

Also deine "Binär Sniffer" wollte ich im prinzipiellen Aufbau auch gerne mal sehen. Welchen Empfänger nutzt du für die 433 Mhz?

Moin Leute,

gerne schreibe ich, was ich verwende.

Wobei mein RX etwas anders aussieht als der auf der C Seite:

Ich habe den aber bei C gekauft. Mehr habe ich im Moment nicht in Verwendung. :grin:

Jomelo:
Wenn du wieder was zum Rätseln hast, dann her damit ... :wink:

Hi Jomelo,

gerne. Irgendetwas ist ja immer :smiley: Achja: wie wäre es herauszubekommen was die letztem 12 BIT sind? Ich logge mal viele Reihen. Kannst ja mal draufsehen....

Moin.

Ich habe den Code nochmal etwas aufgeräumt:

#define _Whole_Data_length    116
#define debug 0

byte pin = 2;
byte whole_array[_Whole_Data_length];   
byte value;
byte array_pos=0;
unsigned long duration;

void setup()
{
    pinMode(pin, INPUT);
    Serial.begin(9600);
    Serial.println("Give it to me...");
    delay(2000);
}

void loop()
{
  duration = pulseIn(pin, HIGH);
  if ((duration>600)&&(duration<1000)) {
    if (debug) Serial.print("1");
    whole_array[array_pos] = 1;    
    array_pos++;
  }
  if ((duration>1200)&&(duration<4000)){
    if (debug) Serial.print("0");
    whole_array[array_pos] = 0;   
    array_pos++;
  }
  
  if (array_pos>=_Whole_Data_length) {
        if (debug) Serial.print(";");   
        Serial.print(createValue(30),DEC);    
        Serial.print(createValue(26),DEC);
        Serial.print(",");
        Serial.print(createValue(22),DEC);
        Serial.print(";");    
        Serial.print(createValue(38),DEC);    
        Serial.println(createValue(34),DEC);
        array_pos=0;
  }
}

byte createValue(byte start)
{
    byte bitpos=0;
    for (byte valuepos=start;valuepos<=start+3;valuepos++) {
          bitWrite(value, bitpos, whole_array[valuepos]);
          bitpos++;
    }
    return value;
}

Ich habe nun auch das Minuswert-Bit gefunden:

000000000000000000 1111 101000100000 010001000000 0111000 11111
000000000000000000 1111 101000100000 010001000000 0111000 11111;+04,5°;22%
123456789012345678 9012 345678901234 567890123456 7890123 45678
Wenn 43. Bit 0 == Temp über Null. Ob bei 00,0°??? Kann ich im Freezer nicht provozieren :)

000000000000000000 1111 110011000000 010001001000 00110010 1111
000000000000000000 1111 110011000000 010001001000 00110010 1111;-03,3°;22%
123456789012345678 9012 345678901234 567890123456 7890123 45678
Wenn 43. Bit 1 == Temp unter Null. Ob bei 00,0°??? Kann ich im Freezer nicht provozieren :)

Und wieder was herausgefunden. Hey Jomelo, entcrypte doch mal die letzten Zwölf (oder Acht) Bit, bitte. :grin:

0,0 Gad kannst Du mit Eiswasser herstellen.
Grüße Uwe

Nicht ganz schlecht. Aber der Sender ist nicht Wasserdicht. Leider. Also muss ich 00,0 bei Bitreihe 0000 wohl annehmen.